Mímisbrunnr知恵の泉

← ローカルLLM 一覧

🎓 レベル:発展 | 重要度:A(必須) 📎 前提:VRAM所要の見積もり | 原理:推論の実務(機械学習)

要点(結論先出し)

概念 ── なぜKVを貯めるのか

自己回帰生成では、各ステップで過去全トークンのKey/Valueが要ります。毎回再計算すると遅いので、一度計算したK/Vをキャッシュします。速度のための仕組みですが、その代償が文脈長に比例して膨らむメモリです。原理は機械学習へ → 推論の実務

仕組みと計算実証(lab出力)

対応lab vram_sizing.py(Llama系8B相当:32層・KVヘッド8・head_dim128):

FP16 KV: 1トークン = 128 KiB
  ctx=  4096 -> 0.50 GiB
  ctx=  8192 -> 1.00 GiB
  ctx= 32768 -> 4.00 GiB
  ctx=131072 -> 16.00 GiB
Q8 KV: 1トークン = 64 KiB(半分)
  ctx= 32768 -> 2.00 GiB

8Bの重みが約4.5GiBなのに、128KコンテキストのKVは16GiB——長文では文脈のほうが重い。コンテキスト長を倍にすればKVも倍、という線形の増加を体で覚えてください。

削減策1 ── GQA(設計側の工夫)

MHA(KVヘッド32): 512 KiB/token
GQA(KVヘッド 8): 128 KiB/token  -> 4.0x 削減

**GQA(Grouped Query Attention)**は複数のQueryヘッドでKVヘッドを共有する設計。KVヘッド数が減るぶん、上の式が直接小さくなります。近年のモデルが長文を現実的に扱えるのはこの寄与が大きい(要最新確認)。

削減策2 ── KVキャッシュ量子化(実行側の工夫)

KVをFP16ではなく8bit/4bitで持てば、bytes_per_elem が半分/4分の1に。品質低下を抑えつつKVを圧縮できます(対応エンジン・要最新確認)。長文をどうしても通したいときの有効手段。

運用の勘所

なぜそうするか

OOMの主因は重みよりKVであることが多い。KVが線形に増える式を持っていれば、「このコンテキスト長は載らない」を事前に判断でき、無駄な再起動とクラッシュを避けられます。GQA・KV量子化を知っていれば、買い替えずに長文を通せます。

⚠️ よくある落とし穴

対応lab

関連