GLM-5.1 mit 16 GB VRAM laufen: Architektur-Hacks im Detail
Das GLM-5.1-Modell von ZhipuAI mit 744 Milliarden Parametern erfordert enorme Ressourcen. Das Team hat eine dynamische Komprimierung seiner MoE-Architektur auf einer NVIDIA T4 mit nur 16 GB VRAM hingekriegt, indem es GQA-Einschränkungen umgangen und die Konfiguration umgeschrieben hat. Das resultierende Prototype wiegt 388 MB und läuft Inference ohne Matrix-Fehler.
Micro-Ghetto: Basis-Parameterkürzung
Im ersten Kompressionsschritt wurde config.json angepasst, um den Rechenaufwand zu senken. Durch Reduzierung von num_hidden_layers auf 2, num_experts auf 2 und hidden_size auf 512 wurde das Modell auf Consumer-Hardware-Niveau gebracht.
Beim Laden über transformers mit from_config() kamen versteckte Abhängigkeiten ans Licht. Der Nightly-Build unterstützt GLM-5.1, aber Standardparameter lösten Konflikte aus.
Tensor-Konflikt in GQA
Beim Inference kam es zu einem Dimensionsfehler:
RuntimeError: The size of tensor a (8) must match the size of tensor b (32) at non-singleton dimension 1
Schuld war die starre Bindung an multi_query_group_num=32 in der Grouped Query Attention. Die reduzierte hidden_size ergab 8 Query-Heads, aber der Kern erwartete 32 Key/Value-Heads. Das hat scaled_dot_product_attention zum Absturz gebracht.
Behebung der Attention-Asymmetrie
Die Lösung erforderte ein Runtime-Konfig-Hijacking mit erzwungener Parameterangleichung:
import torch
from transformers import AutoConfig, AutoModelForCausalLM
from huggingface_hub import login
# 1. Konfig on the fly hijacken
config = AutoConfig.from_pretrained("livadies/GLM-5.1-Ghetto-MoE-2-Experts", force_download=True)
# 2. ASYMMETRIE ELIMINIEREN (Fix 8 vs 32 Fehler)
config.num_attention_heads = 8
config.num_key_value_heads = 8 # Genau gleich num_attention_heads
config.multi_query_group_num = 8 # GLM-Hardcode überschreiben
config.multi_query_attention = False # GQA deaktivieren
config.kv_channels = 64 # hidden_size (512) / 8 = 64
config.head_dim = 64
# 3. Weights mit perfekter Mathe synthetisieren
model = AutoModelForCausalLM.from_config(config, torch_dtype=torch.float16)
# 4. Alle Matrizen auf fp16 zwingen, um Dtype-Konflikte zu vermeiden
model = model.half().to("cuda")
Dieser Code erzwingt 8:8-Symmetrie, deaktiviert GQA und fixiert KV-Kanäle auf 64 (512/8).
Inference-Ergebnisse und Validierung
Die generierten safetensors-Weights (388 MB) haben einen Test mit dem Prompt „Hi! Wie heißt du?“ bestanden. Ausgabe:
们都skeresindx scooter perspective/legal很少... Generating是他today test disgr.initState...Google AdInline article slot
Trotz des Unsinns bestätigen null Fehler einen stabilen Compute-Graph. MoE-Experten leiten Tensoren weiter, Attention-Module laufen in fp16 auf 16 GB VRAM.
Wichtige Config-Änderungen:
- num_hidden_layers: 2 (von Dutzenden runter)
- num_experts: 2
- hidden_size: 512
- num_attention_heads = num_key_value_heads = 8
- multi_query_attention: False
- kv_channels: 64, head_dim: 64
Wichtige Erkenntnisse
- Dynamische MoE-Komprimierung erlaubt 744B-Modelle auf einer einzelnen T4 – kein GPU-Cluster nötig.
- Runtime-Config-Override umgeht hardcodierte GQA (32 Gruppen).
- 8:8-Attention-Symmetrie + fp16 löst Tensor-Konflikte.
- 388 MB Prototype erhält GLM-5.1-Compute-Graph-Logik.
- Technik anwendbar auf andere MoE-Architekturen für ML-Hacking.
— Editorial Team
Noch keine Kommentare.