KV Cache
KV CacheがLLMなどのTransformerモデルをどのように最適化するかをご紹介します。この手法で推論レイテンシを削減し、Ultralytics YOLO26の効率を高める方法を学びましょう。
KVキャッシュ(キー・バリューキャッシュ)は、主に大規模言語モデル (LLM)やその他のTransformerベースのアーキテクチャで使用される重要な最適化手法であり、推論レイテンシの短縮と計算コストの削減を実現します。KVキャッシュは、シーケンス内の以前のトークンに対してアテンション機構が生成したキー行列とバリュー行列を保存します。これらの中間計算を保存することで、モデルは新しいトークンを生成するたびに会話履歴全体のアテンション状態を再計算する必要がなくなります。この処理によって、テキスト生成のワークフローは二次計算量から線形計算量へと変わり、チャットボットやAIエージェントとのリアルタイムなやり取りが可能になります。
仕組みとメリット#
標準的なTransformerモデルで次の単語を生成するには、文脈を理解するために、それ以前のすべての単語に注意を払う必要があります。キャッシュがなければ、モデルは各ステップでシーケンス全体の数学的関係を再計算しなければなりません。KVキャッシュはメモリーバンクとして機能し、この問題を解決します。
- 速度の向上: メモリーから事前計算済みのキーとバリューを取得することで、システムの推論エンジンを大幅に高速化します。これは、カスタマーサービスボットでのリアルタイム推論など、低レイテンシが求められるアプリケーションに不可欠です。
- リソース効率: メモリー使用量(VRAM)は増加しますが、トークンごとに必要な計算量(FLOPs)は大幅に減少します。このトレードオフは、オペレーティングシステムがRAMを管理する方法と同様に、モデルの量子化やページングなどの手法で調整されることがよくあります。
- コンテキストの拡張: KVキャッシュを効率的に管理することで、モデルがより大きなコンテキストウィンドウを処理できるようになり、長い文書の処理や長時間にわたる一貫した会話が可能になります。
実際のアプリケーション#
KVキャッシュは最新の生成AIをデプロイするうえで基本的な要素ですが、その原理はコンピュータービジョン (CV)にも応用できます。
-
生成AIチャットボット: ChatGPTやClaudeなどのサービスは、KVキャッシュに大きく依存しています。ユーザーが追加の質問をすると、モデルはチャット履歴全体を最初から読み直しません。代わりに、新しい入力を前のターンのキャッシュ済み状態に追加することで、ほぼ瞬時に応答できます。
-
動画理解: 動画理解タスクでは、モデルがフレームを順番に処理します。テキストトークンと同様に、過去のフレームの視覚特徴をキャッシュすることで、動画履歴全体を再処理せずに物体の追跡や動作の認識が可能になります。これは、時間的な文脈が重要となる動作認識に特に関係します。
効率的なメモリー管理#
モデルが大規模化すると、KVキャッシュのサイズがボトルネックになり、GPUメモリーを数GB消費する場合があります。近年の進歩は、このストレージの最適化に重点を置いています。
- PagedAttention: オペレーティングシステムの仮想メモリーに着想を得たPagedAttention(vLLMが導入)は、KVキャッシュを非連続のメモリーブロックに保存できます。これにより断片化が抑えられ、モデルサービング時のバッチサイズを大きくできます。
- KVキャッシュの量子化: 容量を節約するため、開発者はキャッシュ済みの値に対して混合精度やint8量子化を適用することがよくあります。これによりメモリーフットプリントが削減され、RAMが限られたエッジAIデバイスでも高性能なモデルを実行できます。
- プロンプトキャッシュ: 関連する手法として、静的なシステムプロンプト(例:「あなたは役に立つコーディングアシスタントです」)のKV状態を一度計算し、複数のユーザーセッションで再利用します。これは、大規模なプロンプトエンジニアリングのワークフローを最適化するための中核機能です。
関連概念との違い#
KVキャッシュと、その他のキャッシュや最適化に関する用語を区別すると役立ちます。
- KVキャッシュとプロンプトキャッシュの比較: KVキャッシュは通常、単一の生成ストリーム中にトークンごとに更新される動的メモリーを指します。プロンプトキャッシュは、複数の独立した推論呼び出しで再利用するために、固定入力命令の処理済み状態を保存することを指します。
- KVキャッシュと埋め込みの比較: 埋め込みは、意味を捉える入力データ(テキストまたは画像)のベクトル表現です。KVキャッシュは、シーケンス生成を目的として、アテンション層内でこれらの埋め込みから得られた活性化値(キーとバリュー)を保存します。
- KVキャッシュとモデルの重みの比較: モデルの重みは、ニューラルネットワークの静的な学習済みパラメーターです。KVキャッシュは、特定の入力シーケンスのフォワードパス中に生成される動的な一時データで構成されます。
例: ビジョンモデルにおけるコンテキスト#
KVキャッシュはNLPで特によく知られていますが、状態を保持するという概念は高度なビジョンモデルにも当てはまります。以下の例では、Ultralytics YOLO26を使用した動画追跡のシナリオで、状態(コンテキスト)を引き継ぐ考え方をシミュレートします。ここでは、トラッカーがフレーム間で物体の識別情報を維持します。これは、キャッシュがトークン間でコンテキストを維持する方法と概念的に似ています。
from ultralytics import YOLO
# Load the Ultralytics YOLO26 model
model = YOLO("yolo26n.pt")
# Track objects in a video, maintaining identity state across frames
# The 'track' mode effectively caches object features to link detections
results = model.track(source="https://ultralytics.com/images/bus.jpg", show=False)
# Print the ID of the tracked objects
if results[0].boxes.id is not None:
print(f"Tracked IDs: {results[0].boxes.id.numpy()}")データセットを管理し、最適化されたモデルをデプロイする開発者は、データアノテーションから効率的なモデルデプロイまでのパイプラインを簡素化するUltralytics Platformを利用できます。アテンションの仕組みを詳しく知りたい場合は、こうしたキャッシュ機構が実装される基盤ブロックを提供するPyTorchなどのライブラリが役立ちます。









