Komprese GLM-5.1 na 16 GB VRAM: Podrobný rozbor architektonických hacků
Model GLM-5.1 od ZhipuAI s 744 miliardami parametrů vyžaduje obrovské zdroje pro spuštění. Tým dosáhl dynamické komprese MoE architektury na NVIDIA T4 s 16 GB VRAM, překonal omezení GQA a přepsal konfiguraci. Výsledný model váží 388 MB a provádí inferenci bez chyb matic.
Micro-Ghetto: Základní redukce parametrů
První fáze komprese zahrnovala úpravu config.json pro minimalizaci výpočetní zátěže. Snížení num_hidden_layers na 2, num_experts na 2 a hidden_size na 512 umožnilo zmenšit model na úroveň kompatibilní s běžným hardwarem.
Pokus o načtení přes transformers from_config() odhalil skryté závislosti. Knihovna v noční verzi podporuje GLM-5.1, ale standardní parametry způsobují konflikty.
Konflikt tenzorů v GQA
Při inferenci došlo k chybě nesouladu dimenzí:
RuntimeError: The size of tensor a (8) must match the size of tensor b (32) at non-singleton dimension 1
Příčina spočívá v pevné vazbě na multi_query_group_num=32 v Grouped Query Attention. Redukovaný hidden_size vedl k 8 hlavičkám dotazů, ale jádro očekávalo 32 hlaviček klíčů/hodnot. To narušilo scaled_dot_product_attention.
Oprava asymetrie pozornosti
Řešení vyžadovalo zachycení konfigurace za běhu s nuceným vyrovnáním parametrů:
import torch
from transformers import AutoConfig, AutoModelForCausalLM
from huggingface_hub import login
# 1. Zachytíme config za běhu
config = AutoConfig.from_pretrained("livadies/GLM-5.1-Ghetto-MoE-2-Experts", force_download=True)
# 2. ODSTRANÍME ASYMMETRII (Oprava chyby 8 vs 32)
config.num_attention_heads = 8
config.num_key_value_heads = 8 # Přesně rovná se num_attention_heads
config.multi_query_group_num = 8 # Přepíšeme hardcoded GLM
config.multi_query_attention = False # Vypneme GQA
config.kv_channels = 64 # hidden_size (512) / 8 = 64
config.head_dim = 64
# 3. Syntetizujeme váhy s dokonalou matematikou
model = AutoModelForCausalLM.from_config(config, torch_dtype=torch.float16)
# 4. Převod všech matic do fp16, aby nedošlo ke konfliktům dtype
model = model.half().to("cuda")
Tento kód zajišťuje symetrii 8:8, vypne GQA a fixuje KV kanály na 64 (512/8).
Výsledky inferencí a validace
Vygenerované váhy ve formátu safetensors (388 MB) prošly testem na promptu „Ahoj! Jak se jmenuješ?“. Výstup:
们都skeresindx scooter perspective/legal很少... Generating是他Dnes ne st disgr.initState...Google AdInline article slot
Navzdory nesouvislému textu absence chyb potvrzuje správnost výpočetního grafu. MoE experti routují tenzory, moduly pozornosti fungují v fp16 na 16 GB VRAM.
Klíčové změny v konfiguraci:
- num_hidden_layers: 2 (dříve desítky)
- num_experts: 2
- hidden_size: 512
- num_attention_heads = num_key_value_heads = 8
- multi_query_attention: False
- kv_channels: 64, head_dim: 64
Co je důležité
- Dynamická komprese MoE umožňuje spouštět 744B modely na T4 bez GPU farmy.
- Zachycení config za běhu obchází hardcoded GQA (32 skupin).
- Symetrie pozornosti 8:8 + fp16 řeší konflikty tenzorů.
- Model 388 MB zachovává logiku grafu GLM-5.1.
- Přístup lze aplikovat na jiné MoE architektury pro ML hacky.
— Editorial Team
Zatím žádné komentáře.