# Ejecutar GLM-5.1 en 16 GB de VRAM: Análisis de trucos arquitectónicos
El modelo GLM-5.1 de ZhipuAI, con 744 mil millones de parámetros, requiere recursos masivos para funcionar. El equipo logró una compresión dinámica de su arquitectura MoE en una NVIDIA T4 con solo 16 GB de VRAM, sorteando las limitaciones de GQA y reescribiendo la configuración. El prototipo resultante pesa 388 MB y ejecuta inferencia sin errores de matrices.
Micro-Ghetto: Recorte básico de parámetros
La etapa inicial de compresión implicó ajustar el config.json para reducir drásticamente las demandas computacionales. Reducir num_hidden_layers a 2, num_experts a 2 y hidden_size a 512 llevó el modelo a niveles de hardware de consumo.
Cargar mediante transformers con from_config() reveló dependencias ocultas. La versión nocturna soporta GLM-5.1, pero los parámetros predeterminados generaron conflictos.
Choque de tensores en GQA
La inferencia chocó con un error de discrepancia dimensional:
RuntimeError: El tamaño del tensor a (8) debe coincidir con el tamaño del tensor b (32) en la dimensión 1 no singleton
El culpable: la vinculación rígida a multi_query_group_num=32 en Grouped Query Attention. El hidden_size recortado generaba 8 cabezales de consulta, pero el núcleo esperaba 32 cabezales clave/valor. Esto rompió scaled_dot_product_attention.
Solucionando la asimetría de atención
La solución requirió secuestrar la configuración en tiempo de ejecución con alineación forzada de parámetros:
import torch
from transformers import AutoConfig, AutoModelForCausalLM
from huggingface_hub import login
# 1. Secuestra la config en caliente
config = AutoConfig.from_pretrained("livadies/GLM-5.1-Ghetto-MoE-2-Experts", force_download=True)
# 2. ELIMINA LA ASIMETRÍA (Arregla error 8 vs 32)
config.num_attention_heads = 8
config.num_key_value_heads = 8 # Igual estricto a num_attention_heads
config.multi_query_group_num = 8 # Sobrescribe el hardcode de GLM
config.multi_query_attention = False # Desactiva GQA
config.kv_channels = 64 # hidden_size (512) / 8 = 64
config.head_dim = 64
# 3. Sintetiza pesos con matemáticas perfectas
model = AutoModelForCausalLM.from_config(config, torch_dtype=torch.float16)
# 4. Fuerza todas las matrices a fp16 para evitar choques de tipos
model = model.half().to("cuda")
Este código impone simetría 8:8, desactiva GQA y fija los canales KV en 64 (512/8).
Resultados de inferencia y validación
Los pesos generados en safetensors (388 MB) pasaron una prueba con el prompt "¡Hola! ¿Cuál es tu nombre?". Salida:
们都skeresindx scooter perspective/legal很少... Generando=他是today test disgr.initState...Google AdInline article slot
A pesar del galimatías, cero errores confirman que el grafo computacional es sólido. Los expertos MoE enrutan tensores, los módulos de atención corren en fp16 en 16 GB de VRAM.
Cambios clave en la config:
- num_hidden_layers: 2 (bajó de decenas)
- num_experts: 2
- hidden_size: 512
- num_attention_heads = num_key_value_heads = 8
- multi_query_attention: False
- kv_channels: 64, head_dim: 64
Lecciones clave
- La compresión dinámica MoE permite ejecutar modelos de 744B en una sola T4, sin granja de GPUs.
- Sobrescribir la config en runtime evade el GQA hardcodeado (32 grupos).
- Simetría de atención 8:8 + fp16 resuelve conflictos de tensores.
- Prototipo de 388 MB preserva la lógica del grafo computacional de GLM-5.1.
- La técnica aplica a otras arquitecturas MoE para hacks de ML.
— Editorial Team
Aún no hay comentarios.