Kompresja GLM-5.1 do 16 GB VRAM: analiza sztuczek architektonicznych
Model GLM-5.1 od ZhipuAI z 744 mld parametrów wymaga ogromnych zasobów do uruchomienia. Zespół zaimplementował dynamiczną kompresję architektury MoE na NVIDIA T4 z 16 GB VRAM, omijając ograniczenia GQA i przepisując konfigurację. Otrzymany prototyp waży 388 MB i wykonuje inferencję bez błędów macierzy.
Micro-Ghetto: podstawowe obcięcie parametrów
Początkowy etap kompresji obejmował edycję config.json w celu zminimalizowania obciążenia obliczeniowego. Zmniejszenie num_hidden_layers do 2, num_experts do 2 oraz hidden_size do 512 pozwoliło zredukować rozmiar modelu do poziomu kompatybilnego z konsumenckim sprzętem.
Próba załadowania przez transformers from_config() ujawniła ukryte zależności. Biblioteka w wersji nocnej wspiera GLM-5.1, ale standardowe parametry powodują konflikty.
Konflikt tensorów w GQA
Podczas inferencji wystąpił błąd niezgodności wymiarów:
RuntimeError: The size of tensor a (8) must match the size of tensor b (32) at non-singleton dimension 1
Przyczyna — sztywna zależność od multi_query_group_num=32 w Grouped Query Attention. Obcięty hidden_size dał 8 głowic zapytań, ale rdzeń oczekiwał 32 głowic kluczy/wartości. To zakłóciło scaled_dot_product_attention.
Naprawa asymetrii uwagi
Rozwiązanie wymagało przechwycenia konfiguracji w runtime z wymuszonym wyrównaniem parametrów:
import torch
from transformers import AutoConfig, AutoModelForCausalLM
from huggingface_hub import login
# 1. Przechwytujemy config na bieżąco
config = AutoConfig.from_pretrained("livadies/GLM-5.1-Ghetto-MoE-2-Experts", force_download=True)
# 2. ELIMINUJEMY ASYMETRIĘ (Naprawa błędu 8 vs 32)
config.num_attention_heads = 8
config.num_key_value_heads = 8 # Dokładnie równe num_attention_heads
config.multi_query_group_num = 8 # Nadpisujemy hardkod GLM
config.multi_query_attention = False # Wyłączamy GQA
config.kv_channels = 64 # hidden_size (512) / 8 = 64
config.head_dim = 64
# 3. Syntetyzujemy wagi z idealną matematyką
model = AutoModelForCausalLM.from_config(config, torch_dtype=torch.float16)
# 4. Żelazno konwertujemy wszystkie macierze na fp16, by uniknąć konfliktów dtype
model = model.half().to("cuda")
Ten kod zapewnia symetrię 8:8, wyłącza GQA i ustala kanały KV na 64 (512/8).
Wyniki inferencji i walidacja
Wygenerowane wagi w formacie safetensors (388 MB) przeszły test na prompecie „Cześć! Jak masz na imię?”. Wyjście:
们都skeresindx scooter perspective/legal很少... Generating是他today test disgr.initState...Google AdInline article slot
Mimo chaotycznego tekstu, brak błędów potwierdza poprawność grafu obliczeń. Eksperci MoE kierują tensorami, moduły uwagi działają w fp16 na 16 GB VRAM.
Kluczowe zmiany w konfiguracji:
- num_hidden_layers: 2 (zamiast dziesiątek)
- 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 najważniejsze
- Dynamiczna kompresja MoE pozwala uruchamiać modele 744B na T4 bez farmy GPU.
- Przechwycenie config w runtime omija hardkod GQA (32 grupy).
- Symetria uwagi 8:8 + fp16 rozwiązuje konflikty tensorów.
- Prototyp 388 MB zachowuje logikę grafu GLM-5.1.
- Podejście nadaje się do innych architektur MoE w hackingu ML.
— Editorial Team
Brak komentarzy.