deep guide
コンテキスト長とKVキャッシュ|メモリへの影響を理解する
「コンテキスト長を長くするとメモリが足りなくなる」と聞きますが、実際にどれくらい増えるのか、 仕組みから説明します。数値は理論的な目安であり、実測値ではありません。
コンテキスト長とは
コンテキスト長(context length)は、モデルが一度に「把握できる」トークン数の上限です。 入力した履歴とこれから生成する分を合わせた長さがこの上限を超えると、古い部分が切り捨てられたり、 エラーになったりします。LM Studio 等の既定値はモデルによって異なりますが、8k トークン程度が目安になることが多いです。
既定値はアプリ・モデルのバージョンで変わります。正確な値は使用するアプリの設定画面で確認してください。
KVキャッシュとは
Transformer は自己注意(self-attention)において、各トークンの Key(K)と Value(V)を計算し、 それをKVキャッシュとして保持します。これにより、毎回すべてのトークンを再計算せずに済みますが、 保持する分のメモリがコンテキスト長に比例して増大します。
context tokens: [t1][t2][t3] ... [tn]
│ │ │ │
K,V K,V K,V K,V ← 各トークン分を保持
└──────────────────┘
KV cache サイズ ∝ n (コンテキスト長)
概念図。実際のサイズは層数・head数・head_dim・K/Vの精度に依存。
理論式(目安)
Transformer の標準的な構造では、KVキャッシュの理論バイト数は次の形で見積もれます。
- layers:モデルの層数(アーキテクチャ依存)
- kv_heads:KV を計算する head 数(GQA では query head より少ない)
- head_dim:各 head の次元数
- bytes_K / bytes_V:K/V の1要素のバイト数(fp16 なら2、q8_0 等の量子化ならさらに小さい)
4k / 8k / 32k のざっくり例
以下は仮のモデル(layers=32, kv_heads=8, head_dim=128, fp16)で計算した 理論的な目安です。実際のモデルでは layers/kv_heads/head_dim が異なるため、あくまで「増え方の傾向」をつかむための例です。
| コンテキスト長 | KVキャッシュ(目安) | 倍率 |
|---|---|---|
| 4,096 tokens | 約 0.50 GB | 1× |
| 8,192 tokens | 約 1.00 GB | 2× |
| 32,768 tokens | 約 4.00 GB | 8× |
計算式:context × 32 × 8 × 128 × (2+2) bytes = context × 32,768 bytes。 例は fp16(1要素2バイト)の場合。KV量子化(q8_0 等)を使えばさらに小さくなりますが、品質への影響はモデル次第です。 重要なのは「コンテキスト長を4倍にするとKVキャッシュも約4倍」という比例関係です。
GQA / MHA の違い
GQA(Grouped Query Attention)は、複数の query head で KV head を共有する仕組みです。 KV head 数が query head 数より少なくなるため、KVキャッシュが小さく抑えられます。 一方 MHA(Multi-head Attention)は各 query に独立の KV があるため、同じ規模でも KVキャッシュが大きくなりやすいです。
多くの最近のモデル(Llama系など)は GQA を採用しており、これも「長いコンテキストを扱いやすくする」一因です。 ただし KV head 数はモデルごとに異なるため、数値は各モデルのアーキテクチャ情報で確認してください。
GPUオフロードとの関係
KVキャッシュが VRAM に乗るか RAM に乗るかは、GPUオフロードの設定に依存します。 全レイヤーを GPU に乗せる(full offload)なら KVキャッシュも VRAM 上、部分オフロードなら 配置先が分かれることがあります。ここでも「VRAM 使用量を精密に断定する」ことは、配置ルール・実装に依存するため避け、 LM Studio の resource estimate や実測で確認するのが確実です。
適用外と不確実性
- 上記の数値は特定の仮モデル・fp16 での理論目安。実機では padding/alignment/flash attention/KV量子化/sliding window で変動。
- MoE モデルでは active params が変わっても、KVキャッシュの構造(layers×kv_heads×head_dim)は Dense と同様のことが多いが、実装依存。
- 「KVキャッシュが2倍になる」といった単純な倍数は、アーキテクチャ非依存ではないため使わない。
- 実測は、使用するアプリの resource estimate 表示や、タスクマネージャーの観察で行ってください。
更新履歴:2026-07-18 新規 deep guide として追加。