モデルのしくみ 上級
KVキャッシュ
KV Cache
LLM が文章を生成するとき、過去の単語について計算した中間結果を保存して使い回す仕組みです。同じ計算を繰り返さずに済むため、生成が速くなりますが、メモリを多く消費します。
別の呼び方KV Cache、キーバリューキャッシュ
例ローカルで長い文書を扱うと、モデルの重みより KV キャッシュのほうがメモリを食っていた。
詳しく
KV キャッシュは、LLM が文章を1トークンずつ生成していく際に、過去のトークンについて計算した「キー(Key)」と「バリュー(Value)」の値を保存しておき、次のトークンの計算で使い回す仕組みです。アテンションの計算を効率化する、推論の基本的な最適化のひとつです。
なぜ必要なのか
LLM は、文章を一度にまるごと出すのではなく、1トークンずつ順番に生成します。次のトークンを決めるには、これまでのすべてのトークンとの関係をアテンションで計算する必要があります。もし毎回、最初から全部を計算し直すと、同じ計算を何度も繰り返すことになり、文章が長くなるほど極端に遅くなります。
過去のトークンのキーとバリューは、あとから変わりません。そこで、一度計算した結果をメモリに保存し、新しいトークンの分だけを追加で計算すれば済む、というのが KV キャッシュの発想です。たとえるなら、議事録を毎回最初から読み返すのではなく、これまでの要点メモを手元に置いて、新しい発言だけを書き足すようなものです。
具体例
チャットで長い資料を渡して質問すると、最初に資料全体を処理する段階(プリフィル)で KV キャッシュが作られ、その後の回答生成(デコード)では、このキャッシュを参照しながら1トークンずつ出力します。
メモリ消費という課題
KV キャッシュには欠点もあります。保存するデータは、文脈の長さ、会話の同時接続数、モデルの層の数に比例して増えます。長い文脈や大量の同時利用では、モデルの重みよりもキャッシュのほうが GPU メモリを多く占めることもあります。そのため、次のような工夫が研究・実用化されています。
- キャッシュの共有を減らす構造:キーとバリューを複数のヘッドで共有する方式(Multi-Query Attention や Grouped-Query Attention)。
- 量子化:キャッシュを低い精度で保存して小さくする。
- メモリの管理:必要な部分だけを効率よく配置する(PagedAttention など)。
- 古い部分の削除・圧縮:重要度の低いトークンを捨てる。
プロンプトキャッシュとの関係
API で提供されるプロンプトキャッシュは、同じ前置き部分の処理結果を、リクエストをまたいで再利用する機能で、仕組みの背景には KV キャッシュの考え方があります。長い共通の指示や資料を繰り返し使う場合、再利用された部分の入力料金が安くなる料金体系が一般的です。具体的な条件は事業者ごとに異なります。
注意点
- 一般の利用者が直接触ることは少なく、主にサービス提供者やローカル実行時の設定で関わります。
- ローカル LLM では、文脈長を大きく設定するとキャッシュの分のメモリが増え、動かなくなることがあります。
関連する考え方
attention は計算の中身、inference は推論全体、prompt-caching は API での再利用機能、quantization はメモリ削減の手法です。
あわせて知りたい言葉
- アテンション文章の中のどの単語が、ほかのどの単語と関係が深いかを計算し、重要な部分に重みをつけて読む仕組みです。Transformer の中心となる技術で、現在の LLM の土台になっています。
- 推論(インファレンス)学習を終えた AI モデルに、実際に入力を与えて答えや生成物を出させる段階のことです。チャットで質問したり、画像を生成したりするときに裏で行われている処理を指します。
- プロンプトキャッシュ繰り返し送る同じ内容のプロンプト(システムプロンプトや長い資料など)の処理結果を一時的に保存して再利用する仕組みです。入力の料金と応答までの時間を減らす効果があります。
- 文脈長モデルが1回の処理で扱えるトークン数の上限です。入力(指示・会話履歴・資料)と出力の合計がこの範囲に収まる必要があり、長いほど多くの資料を一度にまとめて渡せます。
- 量子化モデルの重みを、16ビットなどから8ビット・4ビットといった少ないビット数で表すことで、モデルのサイズと必要なメモリを減らす手法です。手元の PC でモデルを動かすときによく使われます。