GQA, MQA ve MLA: attention KV cache'i nasıl belirler
KV cache attention'dan doğar ve bir modelin attention head'lerini nasıl düzenlediği, aynı parametre sayısında önbelleği on kat değiştirebilir. Bugünün açık modellerini dört düzen kapsar.
Multi-head attention (MHA)
Her query head'in kendi key ve value head'leri vardır ve önbellek hepsini saklar: token başına 2 × katman × head × head boyutu × byte. Özgün Transformer tasarımıdır ve önbelleği en pahalı olandır. Phi-3 mini 4k hâlâ bunu kullanır — 32 katmanda 32 head, token başına 384,0 KiB.
Multi-query attention (MQA)
Tüm query head'ler tek bir key head'ini ve tek bir value head'ini paylaşır (Shazeer, 2019, “Fast Transformer Decoding: One Write-Head is All You Need”). Önbellek head sayısının tamamı kadar küçülür — mümkün olan en büyük kazanç — ama tek bir key ve value takımını her head'e paylaştırmak kaliteye mal olabilir.
Grouped-query attention (GQA)
Query head'ler gruplara ayrılır ve her grup bir key-value head'i paylaşır: birden fazla, ama query head sayısından az. Ainslie ve arkadaşları (2023) bunu orta yol olarak önerdi — multi-head attention'a yakın kalite, multi-query'ye yakın hız — ve LLMScale'in yerleşik 31 modelinden 28 tanesi bunu kullanır. Llama 3.3 70B Instruct, 64 query head'i 8 key-value head'e toplar; bu yüzden multi-head attention'ın 2560,0 KiB isteyeceği yerde token başına 320,0 KiB saklar: 8× daha az.
Multi-head latent attention (MLA)
DeepSeek-V2 başka bir yol izledi. Head başına key ve value yerine her katman, token başına tek bir sıkıştırılmış latent vektör ve rotary konum kodlamasını taşıyan küçük, ayrık bir key saklar. Token başına önbellek katman × (kv_lora_rank + qk_rope_head_dim) × byte olur ve head sayısı formülden düşer. DeepSeek-V2 makalesi (§2.1.3), kendi boyutları için bunu yalnızca 2,25 gruplu bir GQA'nın boyutuna eşitler.
DeepSeek V3, 61 katmanın her birinde 512 + 64 = 576 değer saklar: token başına 68,6 KiB, head başına formülün verdiğinden 24,9× az. 8k context'te bu, 13,34 GiB yerine 549 MiB eder. DeepSeek modellerine head başına formülü uygulayan bir hesaplayıcı önbelleği bu oranda abartır; LLMScale, bir config iki alanı da taşıdığında formül değiştirir.
Yan yana
| Model | Query head | KV head | Attention | Token başına | MHA'ya göre |
|---|---|---|---|---|---|
| Phi-3 mini 4k | 32 | 32 | MHA | 384,0 KiB | 1× |
| Llama 3.2 1B Instruct | 32 | 8 | GQA | 32,0 KiB | 4× |
| Qwen2.5 7B Instruct | 28 | 4 | GQA | 56,0 KiB | 7× |
| Llama 3.1 8B Instruct | 32 | 8 | GQA | 128,0 KiB | 4× |
| Mistral Nemo 12B Instruct | 32 | 8 | GQA | 160,0 KiB | 4× |
| Mixtral 8x7B Instruct | 32 | 8 | GQA | 128,0 KiB | 4× |
| Qwen3 32B | 64 | 8 | GQA | 256,0 KiB | 8× |
| Llama 3.3 70B Instruct | 64 | 8 | GQA | 320,0 KiB | 8× |
| Qwen2.5 72B Instruct | 64 | 8 | GQA | 320,0 KiB | 8× |
| DeepSeek V3 | 128 | — | MLA | 68,6 KiB | 24,9× |
FP16. “MHA'ya göre”: aynı modelin multi-head bir sürümünün kaç kat fazla önbellek tutacağı.
Model seçerken ne anlama gelir
- Parametre sayısından önce key-value head'lere bak. Qwen2.5 7B Instruct ile Llama 3.1 8B Instruct parametrede %5, token başına önbellekte 2,3× fark eder.
- Attention düzeni modelle birlikte gelir. Servis edilen bir modelin önbelleğini küçültmek için FP8 KV cache, daha kısa context ya da daha az dizi kalır — bkz. KV cache boyutu.
- Tensor parallel key-value head'leri GPU'lar arasında böler; bu yüzden hesaplayıcı onları eşit bölen GPU sayıları önerir.