NVIDIAのKVキャッシュ移植が25倍速い理由を解剖する

NVIDIAのKVキャッシュ移植が25倍速い理由を解剖する

「LLMへの2回目の質問、なんであんなに速いんだろう」と思ったことがある人は多いと思います。

答えはKVキャッシュです。2026年8月、NVIDIAの研究者らがこの仕組みを「モデルをまたいで」動くようにした論文を出しました(arXiv 2608.03893)。キャッシュを作り直す時間を2.7〜25倍縮める手法です。

TL;DR: なぜ25倍速いのかは、KVキャッシュの仕組みを順に追えば全部わかります。数式は1つだけです。

目次

なぜLLMは2回目に速いのか — 答えはKVキャッシュ

LLMは文章を「次の1語」の予測の連続で生成します。素朴な作りだと、1語出すたびにそれまでの全部を読み直すことになり、読む量はどんどん膨らみます。

そこで登場するのがKVキャッシュです。LLMの中では、各トークンが「Key(どこから情報を取るかの目印)」と「Value(実際の中身)」という2種類のメモを作ります。このメモは一度作れば中身が変わらない。だから2回目以降は作り直さずに使い回せます。

キャッシュなしでは1語ごとに全部を読み直すが、キャッシュありなら新しい1語だけを計算する

キャッシュがないと、1語出すたびに過去のすべてを読み直すことになる

キャッシュが効く場面は2つあります。ひとつは会話の中で過去を再読込しないこと。もうひとつは、同じ文頭(システムプロンプトなど)を再送したときの流用です。ただし後者は、前回のメモがサーバー側に残っていて、かつ再利用する作りになっている場合に限られます。

私が先週、Ollamaで同じシステムプロンプト(21,600文字・13,220トークン)を2回投げて測ったとき、初回は31.983秒かかった処理が、2回目は0.042秒でした。761倍です。トークン数は1つも減っていないのに、です(実行環境: MacBook Pro M4 Pro 48GB / Ollama 0.33.2)。測定の詳細は前回の記事に書きました。

KVキャッシュは「LLMの動作原理の一部」ではなく、実行時間の大半を握っている部品なのだなと、この測定で感じました。

Qを保存しない理由 — 過去の問いは二度と使われない

ここで不思議に思う人もいると思います。LLMの内部処理は「Query・Key・Value」の3つ組で動きます(attentionと呼ばれる仕組みです)。なぜキャッシュするのはKとVだけで、Qは捨てるのか。

Qは「いま、この位置のトークンが何を知りたいか」という問いです。Kは「自分はこういう情報を持っている」という目印、Vはその中身です。

新しいトークンが生成されるとき、使われるのは新しい位置のQだけです。過去のQはその時点で役目を終えていて、二度と参照されません。

「過去のQと新しいKの組み合わせは?」と思うかもしれませんが、未来が過去に影響する方向の参照はcausal maskで禁止されています。この組み合わせは最初から不要なのです。

逆にKとVは「過去トークンの保管メモ」なので、未来のすべてのステップから参照され続けます。使い捨ての問いを捨て、保管メモを残す。この非対称がKVキャッシュという名前の由来です。

現在のQだけが過去のKとVを参照し、過去のQはどこにも繋がっていない

矢印が出ているのは現在のQだけ。過去のQはどこにも繋がっていない

厳密な数式は、Zennの「MLエンジニアのための本質から理解するLLM推論 KV cache編」が丁寧です。本記事では数式に入らず進めます。

キャッシュの大きさは「層×長さ×ヘッド」で決まる

KVキャッシュはメモリを食います。大きさは次の要素の掛け算で決まります。

キャッシュ量 = 2(KとV)× 層の数 × KVヘッド数 × ヘッドあたり次元 × 保存トークン数 × 1要素あたりバイト数

例えば、層が28、KVヘッドが8本、次元128、文脈長32,768、fp16(1要素2バイト)だと、1会話ぶんで3.5GiB(約3.76GB)です。モデルの重みとは別に、これだけの領域が要ります。ここがネックになるからこそ、KVヘッドを複数のQヘッドで共有するGQA(Grouped-Query Attention)という省メモリ化が最近のモデルの標準になっています。

個人的には、長い文脈や同時処理でメモリがなぜ膨らむのかが、この式ひとつで見えるようになったのが収穫でした。断片的だった推論コストの話が一本につながった気がします。

NVIDIAの論文は「モデルをまたげる」まで進んだ

ここまでの話は既存の常識です。実運用では、コスト調整や会話の途中の交代で、同じファミリーの別サイズにモデルを切り替えることが頻繁にあります。安い14Bで大部分を処理し、難しいところだけ32Bに渡す使い方です。

問題は、モデルを切り替えるとKVキャッシュが使えなくなることでした。QやKの空間はモデルごとに別物で、32B側はもらったメモを読めず、文脈の読み直し(prefillやり直し)しかなかったのです。

NVIDIAの論文は、このメモを翻訳して渡す手法を示しました(※以降の数値は論文arXiv 2608.03893・2026年8月提出に基づく、2026年9月時点の情報です)。

  1. 線形写像で翻訳する: あるモデルのキャッシュを、別モデルの形式に変換する。「リッジ回帰」という閉じた式で解ける変換で、勾配による訓練は要りません(係数は下記のキャリブレーションデータから推定します)
  2. どの層から取るかを選ぶ: 受け側の各層に対して、予測力の高い送り側の層を上位k個だけ選び、その特徴をつないで入力にします
  3. 位置情報を剥がして翻訳する: KeyにはRoPE(トークンの位置を表す回転)が乗っています。これを剥がしてから写像すると、文脈の長さに依らない、繰り返し使える変換になります

変換の係数を求めるためのデータは、1,024トークンの系列500個だけ。8×H100ノード1台で1ペアあたり47〜87分で終わります。

なぜ単純な変換で通用するのか。論文の観察が面白いところです。Qwen3 14Bと32Bのような同ファミリーのペアでは、受け側の各層に対して送り側の層を1つ選ぶだけで、Keyの分散の56%が説明できました(層ごとに選び、層間で平均した値です)。上位8層を使えば79%まで上がります。つまり同系モデルの間では、キャッシュの構造が線形写像で相当部分を近似できるくらいに似ている、ということです。

小さいモデルのキャッシュから位置情報を剥がし、効く層を選び、線形写像で変換して大きいモデルのキャッシュにする流れ

翻訳の流れ。下のバーは、読み直しと変換にかかる時間の比

結果はこうでした。

  • 速度: 2.7〜25倍(32,768トークンのQwen3 14B→32Bで、再prefill 6,975ミリ秒に対し変換は278ミリ秒)。これはキャッシュ変換と受け側の再prefillを比べた数字で、応答全体が25倍になるわけではありません
  • 精度: 成功した4ペアで、5つのベンチマークの平均保持率73〜98%(Qwen3 14B→32Bは97.6%)。保持率は「移植したときの正答率 ÷ 受け側が単独でprefillしたときの正答率」です
  • 安定性: 平均約15ターンのCoQA会話100件で、10ターンまでの交代を追っても劣化は小さいままでした

限界も正直に — 6ペア中2ペアは保持率が半分以下に落ちた

この手法が万能ではありません。論文は失敗も公表しています。

6ペアのうち2つは保持率が44.2%・41.6%まで急落しました。Ministral 3 の 3B→14B と 8B→14B です。同じ系列でも 3B→8B は成功しているので、モデルの大小だけでは説明がつきません。非線形の変換(MLP)に切り替えると、HellaSwagの保持率が最大36.8ポイント戻りました(58.7% → 95.5%)。線形では捉えきれない関係を持つペアが存在します。

6ペアの保持率。Qwen3 14B→32Bの97.6%から、Ministral 3 8B→14Bの41.6%まで開きがある

成功したペアと落ちたペアの差。同じMinistral 3でも 3B→8B は76.2%で成功側にいる

もうひとつ、適用範囲の話があります。論文が実験したのはKVヘッド数とヘッド次元が一致するペアだけです。ただし論文自身は「写像に次元一致の構造的な制約はなく、一致しないペアは未検証」と書いています。原理的に無理なのではなく、まだ確かめられていない、という状態です。

診断方法も書かれています。attention出力のコサイン類似度が高いペアほど保持率も高く(相関+0.57)、Keyの再構成精度(R²)は逆にあてになりませんでした(−0.20)。ただしこのコサイン類似度は、写像を作った後に測る指標です。作る前に成否を見分ける方法としてはまだ確立していません。個人的には、この「どのペアならうまくいくかを見分ける方法」が、実運用では本命なのではと感じました。

まとめ

今回はKVキャッシュの仕組みから、NVIDIAのモデル間移植論文までを通しで見ました。

要点の再掲

  • LLMが2回目に速いのは、KとVの「保管メモ」を作り直さないから。実測では31.983秒が0.042秒(761倍)でした
  • Qを保存しないのは、過去の問いが二度と使われないから。使い捨ての問いと、残すメモの非対称です
  • NVIDIAの研究者らの論文は、キャッシュを別モデルの形式に翻訳して渡す手法。変換は再prefillの2.7〜25倍速く、成功したペアでは保持率73〜98%
  • ただし6ペア中2ペアは保持率44.2%・41.6%まで落ちました。実験はKVの形が一致するペアに限られていて、それ以外は未検証です

「安いモデルで読んで、高いモデルで考える」を実現する最後の壁が、このキャッシュ移植かもしれません。実測できる環境が手元にあるので、Ollama×Qwen3ファミリーでどこまで追試できるか、次回試してみようと思います。

関連記事
DeepSeek Harnessのキャッシュヒット率はOllamaで出ない — 761倍の実測と測定方法

参考
Cross-Model KV Cache Transfer in LLM Families(arXiv 2608.03893)
MLエンジニアのための本質から理解するLLM推論 KV cache編(Zenn)
KVキャッシュの仕組み(disassemble-channel)

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次