16 GB GPU上のKVキャッシュ:長文脈を実際に収容する

16GBでは128Kコンテキストが死ににくい理由

目次

モデルが128Kのコンテキストウィンドウを宣伝していても、16 GBのGPUでは40Kトークンで失敗する可能性があります。アーキテクチャ上の上限は、重み、KVキャッシュ、計算バッファ、そしてデスクトップコンポジターが同時にあなたのGPUに収まることを約束したことはありませんでした。

KVキャッシュは通常、長文コンテキストの計画が物理的な限界に直面する場所です。アクティブなトークンとシーケンスごとに増加するため、起動時に快適そうに見えた設定でも、大幅に速度が低下したり、システムメモリに溢れたり、大きなプリフィル処理中に失敗したりする可能性があります。

16 GB GPUでのKVキャッシュのメモリ予算

このガイドは、この問題をVRAM(ビデオRAM)予算に変換します。キャッシュの計算式、再現可能な32Kから128Kまでのサイズテーブル、llama.cppの --cache-type-k--cache-type-v、vLLMのページドキャッシュとプレフィックスキャッシュ、そしてOllamaのコンテキスト制御のための動作する設定をカバーします。さらに、注目する価値はあるものの盲目的な信頼には値しない、実験的な適応型キャッシュのフォークも含めています。これらの数値の背後にあるより広範なスループット、レイテンシー、ベンチマークの背景については、まずLLMパフォーマンスハブから始めてください。

16 GB GPUへの短い回答

まずは1シーケンス、現実的な最大コンテキスト長、Flash Attention、そして8ビットKVキャッシュから始めましょう。4ビットキャッシュ、CPUオフロード、複数の並列スロット、または実験的なフォークを試みる前に、その設定を計測してください。

ターゲット 16 GBでの妥当な初回試行 主なリスク
32K Q4またはQ5重み、Q8 KV、1シーケンス モデル重みがバッファスペースを残さない
64K 小さいモデルまたは積極的な重み量子化、Q8 KV プリフィルのレイテンシーとキャッシュ帯域幅
128K 小さいGQAモデル、Q8またはテスト済みQ4 KV、1シーケンス キャッシュだけでVRAMの大部分を消費する可能性がある
2つの同時64Kセッション 約128Kのキャッシュ予算とみなす 並列容量が無料のスループットと誤認される

私の意見はシンプルです:安定した64K設定は、メモリ不足の失敗のギリギリの線で動作する名目上の128K設定よりも通常、有用です。コンテキスト容量はトロフィーではなく、レイテンシー、品質、並行性に関する判断です。

KVキャッシュが何を含むか

自動回帰生成中、すべてのアテンション層は、処理された各トークンに対してキーとベクトルのテンソルを生成します。ランタイムはそれらのテンソルを保持し、次のトークンが全体のプレフィックスを再計算することなく、先行トークンに注目できるようにします。

このキャッシュは莫大な計算量を節約しますが、保持されるトークン数に比例してメモリを消費します。グループクエリーアテンションを持つ従来のトランスフォーマーにおいて、有用的な基準は以下の通りです:

KVバイト数 = シーケンス数 * トークン数 * 層数 * 2 * KVヘッド数 * ヘッド次元 * 値あたりバイト数

係数の2は、キーとベクトルを表しています。マルチヘッドアテンションはクエリーヘッドと同じ数のKVヘッドを使用しますが、グループクエリーアテンションは少ないKVヘッドを使用し、マルチヘッド潜在アテンションやハイブリッド再帰アーキテクチャは異なる計算を必要とします。

なぜパラメータ数だけでは不十分か

2つの8Bモデルでも、KVキャッシュのコストは大きく異なる可能性があります。一方は32層と8つのKVヘッドを使用する一方で、もう一方はより少ないKVヘッド、共有KV層、スライディングウィンドウアテンション、または圧縮された潜在状態を使用しているかもしれません。

パラメータ数は主に重みのメモリを予測します。KVの幾何学構造はアテンションアーキテクチャに由来するため、モデルのメタデータを読み取り、8B27B、またはGGUFファイルサイズから推測しないでください。最も明確な例は、アテンション設計が単純なマルチヘッドアテンション(MHA)からどれだけ進化したかということです:

  • マルチクエリーアテンション (MQA):すべてのクエリーヘッドで単一のK/Vヘッドを共有します — キャッシュの節約は最大ですが、最も積極的な品質上の妥協であり、現在のフロンティアモデルで単独で使われることは稀です。
  • グループクエリーアテンション (GQA):クエリーヘッドをクラスタにグループ化し、それぞれが1つのK/Vヘッドを共有します — ほとんどのオープンな密モデルで使用される主流の妥折案であり、上記の計算式が仮定する幾何学構造です。
  • マルチヘッド潜在アテンション (MLA):DeepSeek-V2で紹介され、DeepSeek-V3やKimi K2に引き継がれています。異なるアプローチを完全に採用しています:ヘッド間でK/Vを共有する代わりに、キーとベクトルを圧縮された低ランク潜在ベクトルに射影し、アテンション時に要求に応じて完全解像度のK/Vを再構築します。DeepSeekは、同等サイズの密なMHAモデルに対して約93%のKVキャッシュ削減を報告しています。これにより、同じメモリ予算でGQAと競合する、時にはそれを上回る品質を維持しています。

実用的な結果として、「27B GQAモデル」と「27B MLAモデル」は、同じコンテキスト長に対して、KVキャッシュのフットプリントが桁違いに異なる可能性があります。上記の計算式が、潜在アテンション、DeltaNetスタイルの状態、またはスライディングウィンドウ層を使用していると自己を説明するモデルに適用されるとは仮定しないでください。まず、モデルカードのアーキテクチャセクションを確認してください。

Ollamaでは、ollama show MODEL --verbose で、フォーマットが提供する場合、層数、アテンションヘッド、KVヘッド、コンテキスト長などのモデルメタデータが表示されます。llama.cppでは、起動時に印刷されるモデルローダーの出力には、通常、同等のGGUFメタデータと、ランタイムの実際のキャッシュ割り当てが含まれています。

モデルの制限、割り当てられたコンテキスト、使用されたコンテキスト

これらは3つの異なる数値です。モデルの制限は、そのトレーニングと位置エンコーディングによってサポートされる最大値です。割り当てられたコンテキストは、ランタイムが予約または許可する量です。使用されたコンテキストは、シーケンスのために現在保持されているトークン数です。

エンジンのフラグを上げても、モデルがサポートする位置スキームを超えて安全に拡張することはできません。RoPEスケーリングは一部のアーキテクチャを拡張できますが、それはモデル品質の実験であり、KVメモリ最適化ではありません。

KVキャッシュサイズテーブル:32K、64K、128Kコンテキスト予算

32層、8つのKVヘッド、ヘッド次元128を持つ代表的なGQAモデルを考えます。これらの次元は、各要素のストレージサイズを掛ける前に、トークンあたり65,536個のキーとベクトルの要素を生成します。

このテーブルはバイナリGiBを使用し、llama.cppの f16q8_0q4_0 と通常関連付けられる物理ブロックサイズを使用しています。これは基準計算であり、プロセス全体のメモリに対する約束ではありません。アライメント、メタデータ、ハイブリッド層、バックエンドワークスペースがオーバーヘッドを追加します。

キャッシュタイプ 保存値あたりの推定バイト数 32Kコンテキスト 64Kコンテキスト 128Kコンテキスト
F16 2.0000 4.00 GiB 8.00 GiB 16.00 GiB
Q8_0 1.0625 2.13 GiB 4.25 GiB 8.50 GiB
Q4_0 0.5625 1.13 GiB 2.25 GiB 4.50 GiB
Q8_0 K + Q4_0 V ミックス 1.63 GiB 3.25 GiB 6.50 GiB

次に、他の次元を変えずに層数を2倍にして64層にします。FP16キャッシュは32Kで8 GiB、64Kで16 GiB、128Kで32 GiBとなり、これが単一のコンテキスト推奨がすべてのモデルをカバーできない理由を示しています。

実際の16 GBの方程式

実用的な予算は、KV計算式よりも広範です:

使用可能VRAM = 総VRAM - デスクトップとドライバの予約

KV予算 = 使用可能VRAM
          - GPUに常駐するモデル重み
          - グラフと活性化バッファ
          - ランタイムワークスペース
          - 投機的デコーディングの状態
          - 安全マージン

ディスプレイ接続された16 GBカードでは、全16 GiBが利用可能であるとして計画しないでください。デスクトップとドライバのために少なくとも数百MiBを予約し、次にワークロード依存バッファのために別件のマージンを残します。合計で1.0から1.5 GiBの余裕は合理的な初期仮定ですが、ログが権威です。

例えば、GGUFモデルがGPU上で10.8 GiBを占有し、ランタイムオーバーヘッドが最大で1.2 GiB近くまで上昇するとします。1 GiBの安全マージンを引いた後、KVに使えるのは約3 GiBしか残らず、代表的なモデルは、エンジン固有のオーバーヘッドを考慮する前に、Q8_0では約45Kトークン、Q4_0では87Kトークンに収まります。

それで自動的にQ4_0が正しい選択とは限りません。もし長文コンテキストの精度があなたのワークロードで低下する場合は、Q8_0キャッシュを持つより小さい、またはより積極的に量子化されたモデルの方が、脆弱なキャッシュと組み合わせた大きな重みよりも良いかもしれません。まさにこの算術のための計測済みアンカーは、16 GB VRAM llama.cpp ベンチマークテーブルにあります。ここでは、各モデルのVRAMが19K、32K、64Kコンテキストで記録されています。同じクラスのカード上でOllamaのどのようなモデルサイズと量子化レベルが良い動作をするかについてのより広い調査については、16GB VRAM GPUでのOllamaによるLLMパフォーマンス比較を参照してください。

あなたのモデルのためのKVキャッシュ予算を計算する

以下のPythonスニペットは、従来の完全アテンションGQAキャッシュを推定します。幾何学構造は、モデル設定またはGGUFメタデータからの値に置き換えてください。

def kv_gib(tokens, layers, kv_heads, head_dim, bytes_per_value, sequences=1):
    total = (
        sequences
        * tokens
        * layers
        * 2
        * kv_heads
        * head_dim
        * bytes_per_value
    )
    return total / (1024 ** 3)


model = {
    "layers": 32,
    "kv_heads": 8,
    "head_dim": 128,
}

types = {
    "f16": 2.0,
    "q8_0": 34 / 32,
    "q4_0": 18 / 32,
}

for tokens in (32768, 65536, 131072):
    row = {
        name: round(kv_gib(tokens=tokens, bytes_per_value=size, **model), 2)
        for name, size in types.items()
    }
    print(tokens, row)

Q8_0とQ4_0の比率には、単純なブロックメタデータが含まれているため、値あたりちょうど1バイトと半バイトよりもわずかに大きくなっています。ランタイムの起動レポートは、モデル固有のキャッシュレイアウトを知っているため、より正確なままであるでしょう。

この計算式が誤っている場合:ハイブリッドとスライディングウィンドウアーキテクチャ

ハイブリッドアーキテクチャを従来のGQA方程式に無理やり当てはめないでください。スライディングウィンドウ層は直近のウィンドウのみを保持し、共有KV層は重複を減らし、再帰層は固定サイズの状態を運ぶかもしれず、マルチヘッド潜在アテンションはヘッドごとのK/Vテンソルではなく、圧縮された表現を保存します — 上記のMLAのケースが最も顕著な例です。

モダンなエンジンは、これらのミックスレイアウトをますます明示的に管理しています。計算式を優勢な項を説明するために使用し、次に、デプロイする予定の正確なエンジンビルドとバックエンドによって報告される割り当てを確認してください。

llama.cpp: KとVの精度を直接制御する

llama.cppは、現在の引数パーサーで個別の --cache-type-k--cache-type-v オプションを公開しています。これは、グローバルプリセットを受け入れる代わりに、キャッシュ精度とコンテキスト容量のトレードオフを行う必要がある場合、最も有用なローカル推論インターフェースです。まず周りにあるインストールとサービング設定が必要な場合、llama.cppガイドllama-clillama-server、および重要なVRAMフラグをカバーします。

保守的な64K単一ユーザー設定は以下のようになります:

./llama-server \
  --model /models/model.gguf \
  --n-gpu-layers 999 \
  --ctx-size 65536 \
  --parallel 1 \
  --flash-attn on \
  --cache-type-k q8_0 \
  --cache-type-v q8_0 \
  --batch-size 1024 \
  --ubatch-size 256

フラグの構文とバックエンドサポートは急速に変化するため、インストールされたビルドに対して llama-server --help を実行してください。それ以上に重要なのは、起動ログを確認することです:そこには、意図したコンテキスト、キャッシュタイプ、GPUオフロード、および割り当てられたKとVバッファが表示されるべきです。

試すべきllama.cppのキャッシュタイプ

まず、KとVの両方にQ8_0から始めましょう。これはF16に対してKVメモリをほぼ半分に減らし、20B以上のモデル(Qwen3.6-27B、Nemotron-30B)での独立したパープレキシティテストは、F16からの集計品質の差分が測定ノイズの範囲内であることを示しています — これは、同じテストがより小さいモデルで長文コンテキスト時にデコード速度と精度が崩壊することを示した、直接Q4_0に移行するよりもるかに劇的でない賭けです。

Q8_0が収まらない場合、両方をQ4_0に量子化する前に、Q8_0のキーとQ4_0のベクトルをテストしてください。この順序には、伝承だけでなく研究の裏付けがあります:Llama、Phi-4、Qwen3、Mistralチェックポイントに対する管理されたビット割り当て研究は、キーテンソルはベクトルテンソルよりも一貫して2倍から10倍敏感であることを発見しました。また、キーに大きなビット予算を与える(例えば、4ビットキーと2ビットベクトル)ことで、完全精度の精度の94〜98%まで回復できる一方で、逆の分割(2ビットキー、4ビットベクトル)ではGSM8Kのようなタスクで30ポイントの精度を失う可能性があります。キーはアテンションが実際に一致する先行トークンを決定するため、それらを最初に保護することは、より安全に聞こえる選択というだけでなく、アーキテクチャ的に健全な選択です。

設定 メモリ 品質リスク 推奨
F16 K と V 最高 最低 収まる場合のベースライン
Q8_0 K と V F16の約半分 低いがゼロではない 16 GBのデフォルト起点
Q8_0 K, Q4_0 V Q8とQ4の間 中程度 有用な第2ステップ
Q4_0 K と V F16の約1/4 最高 ターゲット深度で検証する

内面化すべき注意点として:集計ベンチマークでの「低品質リスク」は、トークンレベルでゼロリスクを意味しません。Flash Attentionを一定に保ち、貪欲(決定的)デコーディング下でKV精度のみを変えた管理されたテストでは、Q8_0キャッシュが多数のプロンプトで正確に生成されるテキストを変え、Q4_0は実質的にすべてのプロンプトでそれを変えた — 一度トークンが反転すると、継続の残りが分岐する可能性があります。パープレキシティと下流タスクのスコアは平均では問題なく見えますが、個々の出力はF16ベースラインと異なる場合があります。アプリケーションがバイト単位での再現性(回帰テスト、キャッシュされた応答、決定的なエージェント)を必要とする場合、KV量子化はメモリ最適化だけでなく、動作の変化として扱い、独自の固定プロンプトセットに対して検証してください。

量子化されたVキャッシュは、Flash Attentionまたは互換バックエンドパスを必要とする可能性があります。別のタイプにサイレントにフォールバックするサーバーは実験を無効にするため、コピーされたコマンドラインよりも起動ログの方が重要なのです。

コンテキスト、並列スロット、統合キャッシュ

--ctx-size はエンジンの容量を説明し、すべての並列スロットが独立してその数のトークンを受け取ることが保証されるわけではありません。llama.cppではキャッシュ管理が進化しており、統合キャッシュの動作を含むため、古い規則(コンテキストをスロット数で単純に割るもの)に頼るのではなく、正確なビルドをテストしてください。

容量方程式は実装の変化後も残ります:同時の一意なトークンはどこかにストレージを必要とします。2つのエージェントセッションがそれぞれ48Kに達する可能性がある場合、ワークロードがプレフィックスを共有するか、エビクションと再計算を許容しない限り、約96Kのライブトークンを予算計上してください。

バッチサイズは保存されたKVを縮小しない

--batch-size--ubatch-size はプロンプト処理と一時メモリに影響します。これらを下げると、大規模なプリフィルを活性化メモリスパイクから救出できますが、保持される各トークンに必要な永続的なバイト数を変えるわけではありません。

この区別が一般的な失敗パターンを説明します:モデルは起動し、空のリクエストは動作しますが、60Kのプロンプトは取り込み中に失敗します。一時的なピークを診断するためにマイクロバッチを下げてください。永続的な容量を変更するには、コンテキスト、キャッシュ精度、並列性、または重みの常駐を下げてください。

vLLM: ページド容量は依然として容量である

vLLMはサービングエンジンとしてこの問題にアプローチします。利用可能なメモリをプロファイルし、KVキャッシュプールを予約し、ブロック単位でキャッシュを割り当て、並列シーケンスがそれぞれ1つの大きな連続領域を必要としないようにします。vLLMに移行すべきかどうかを判断している場合、OllamaからvLLMへの移行ガイドがワークロードシグナルをカバーしています。ここでは、プールがどれだけのキャッシュを保持できるかが純粋な質問です。また、[vLLM クイックスタート](https://www.glukhov.org/ja/llm-hosting/vllm/vllm-quickstart/ “Docker、OpenAI API互換性、PagedAttention最適化による完全なvLLMセットアップガイド。本番環境でvLLM、Ollama、Docker Model Runnerを比較。”})が、以下の容量レバーを超えたインストールと一般的なサービングフラグをカバーしています。

PagedAttentionは、可変シーケンス長围绕のフラグメンテーションと浪費を減らします — ページド割り当てはフラグメンテーションを取り除くものであり、トークンあたりのストレージコストではないため、1つの一意な128Kリクエストは依然としてそのKV状態のための十分なブロックを必要とします。

公式のvLLMメモリ節約ガイドは、メモリが逼迫している場合、max_model_lenmax_num_seqs の制限を推奨し、CUDAグラフが追加のGPUメモリを消費することに注意しています。16 GBのカードでは、両方の設定は、モデルの最大設定から継承するのではなく、意図的であるべきです。

焦点を当てた単一シーケンスサーバーはここから始めるかもしれません:

vllm serve MODEL_ID \
  --max-model-len 65536 \
  --max-num-seqs 1 \
  --gpu-memory-utilization 0.90 \
  --kv-cache-dtype fp8 \
  --enable-prefix-caching

すべての16 GB GPU、モデル、量子化方法、またはアテンションバックエンドがその正確な組み合わせをサポートするわけではありません。設定の形とみなしてください:長さと並行性を制約し、ヘッドルームを確保し、サポートされるキャッシュdtypeを選択し、初期化レポートを検証してください。

vLLMでのFP8 KVキャッシュ

現在のvLLM量子化KVキャッシュドキュメントは、互換性のあるCUDAおよびROCmパスでFP8キャッシュフォーマットをサポートしています。FP8は、BF16やFP16に対して生キャッシュストレージをほぼ半分に減らし、そのためトークン容量または並行性を増やすことができます。

スケーリングが重要です。ドキュメントはデフォルトのスケール、ウォームアップ計算、データセットキャリブレーションを区別し、最高精度のためにデータセットベースのキャリブレーションを推奨しています。単にFP8をスケール1.0で設定することは便利ですが、自動的に最も信頼できる品質選択とは限りません。

プレフィックスキャッシュは再利用最適化である

自動プレフィックスキャッシュにより、新しいリクエストは同じキャッシュされたプレフィックスのKVブロックを再利用できます。同じ長い文書への繰り返されるクエリ、共有システムプロンプト、マルチラウンド会話において、一致するプリフィルを再計算することを避けるため、非常に優れています。

それは一意な長いリクエストを小さくしなく、新しいトークンの生成を加速するのでもありません。vLLMプレフィックスキャッシュドキュメントは、利点を共有プレフィックスのプリフィル作業に明示的に限定しています。

GPUメモリ使用率は無料メモリではない

--gpu-memory-utilization を上げるとvLLMはより大きな予約目標を与えられますが、それはVRAMを作り出しません。1.0に近すぎると、ディスプレイ、別のプロセス、変化する活性化ピーク、または非PyTorch割り当てのために十分なスペースが残らない可能性があります。

専用の16 GB GPUでは0.88から0.92あたりから始め、プロファイルを調べて、ワークロードが安定している場合のみ増加してください。初期化が成功したが実際のプロンプトが失敗する場合は、割り当て子が壊れていると仮定する前に、バッチされたトークン、シーケンス並行性、CUDAグラフキャプチャ、または最大コンテキストを下げてください。

Ollama: より簡単な制御、より細粒ではない診断

Ollamaは意図的に小さな運用面を提供しています。その現在のコンテキスト長ドキュメントは、24 GiB未満のGPUをデフォルトで4Kコンテキストにし、エージェントおよびコーディングワークロードには少なくとも64Kを推奨し、より大きなコンテキストはより多くのメモリを消費することを警告しています。

サーバー全体のデフォルトを設定し、ロードされたモデルを確認します:

OLLAMA_CONTEXT_LENGTH=65536 ollama serve

ollama ps

リクエストごと、またはモデルごとに num_ctx を設定することもできます。ollama ps は重要で、その PROCESSORCONTEXT 列が、モデルが完全にGPUに留まったか、要求されたコンテキストが実際に割り当てられたかを示します。これらの数値の背後にあるスケジューリング動作はOllamaのバージョン間で変更されたことに注意してください。Ollama v0.12.1のメモリ割り当ての比較は、新しいスケジューラーが16 GBカードで一部のモデルをCPUにさらに押し出すことを示しています。したがって、計測したバージョンを固定してください。

Ollamaでの量子化KVキャッシュ

Ollamaは、現在のFAQf16q8_0q4_0 の選択肢を持つ OLLAMA_KV_CACHE_TYPE を公開しています。量子化KVはFlash Attentionを必要とし、これはOllamaがサポートされるバックエンドで自動的に使用するか、OLLAMA_FLASH_ATTENTION=1 で要求できます。

したがって、16 GBの長文コンテキストサービスは次のように開始できます:

OLLAMA_CONTEXT_LENGTH=65536 \
OLLAMA_FLASH_ATTENTION=1 \
OLLAMA_KV_CACHE_TYPE=q8_0 \
OLLAMA_NUM_PARALLEL=1 \
ollama serve

Q8_0は、OllamaがF16の推奨代替として推奨しています。FAQは、Q4_0がより顕著な品質損失を生む可能性がある、特にコンテキストが高い場合、と警告しているため、自動的な16 GBプリセットではなく、計測されたフォールバックであるべきです。

Ollama並列性はコンテキスト予算を乗算する

Ollamaは特に明確なルールを文書化しています:必要なメモリは OLLAMA_NUM_PARALLEL * OLLAMA_CONTEXT_LENGTH に比例してスケーリングします。32K設定での4つの並列リクエストは、そのモデルのために128Kの集計コンテキスト割り当てを意味する可能性があります。

16 GBの個人用エージェントでは、1つの長いセッションが安定するまで OLLAMA_NUM_PARALLEL=1 を保ってください。2番目のリクエストをキューイングすることは、最初のモデルを部分的にCPUに押し出し、両方のリクエストを遅くするのに比べて通常、望ましいです。その選択の背後にあるキューイング、503、モデルアンローディングのメカニクスは、Ollamaが並列リクエストを処理する方法で文書化されています。

CPUオフロード:価格付きの有効な逃避口

一部のモデル層やKV状態をシステムRAMに移動することは、割り当て失敗を動作するプロセスに変えることができます。しかし、それはPCIe帯域幅とホストメモリレイテンシーをデコードパスに置き、生成される各トークンがコストを支払う可能性があります。PCIeが実際に問題になる場合のレーンと生成の証拠は、LLMパフォーマンスとPCIeレーンにあります。

オフロードは時折のバッチ作業に対して理にかなうかもしれませんが、対話的なコーディングエージェントのデフォルトとして最良であることは稀です。まず、より小さい重み量子化、Q8 KV、減少した並行性、現実的なコンテキスト上限を比較してください。容量がレイテンシーよりも重要である場合にオフロードを使用してください。

平均ではなく崖に注意してください。サーバーは8Kで素早くデコードできますが、ワーキングセットの一部が溢れた後に深刻に遅くなる可能性があります。そのため、空コンテキストのトークンレートだけでなく、32K、64K、意図した最大値でベンチマークしてください。

スライディングウィンドウと適応型KVキャッシュ

スライディングウィンドウアテンションは、選択された層に対して直近のウィンドウのみを保持することで予算を変更します。ハイブリッドモデルは、それらの層を偶発的なグローバルアテンションまたは再帰状態と組み合わせることができ、平坦な完全コンテキスト計算がメモリを大幅に過大評価するか、誤った場所に置くことになります。

この最適化は、結果なしに適用できる一般的なスイッチではなく、モデルアーキテクチャの一部です。エンジンは、層パターン、エビクションルール、位置、およびグローバルトークンを正しく理解する必要があります。

適応型KVが何を改善しようとしているか

実験的なフォークは、層とコンテキスト深度ごとにキャッシュ精度またはレイアウトを選択することでさらに踏み込みます。その目標は魅力的です:重要なの場所に高い精度を保持し、敏感でない層を圧縮し、VRAM圧力がハードな溢れを引き起こす前にミックスを変更する — 上記で説明されたキー感受性対ベクトル感受性の発見は、適応型アロケータが手動の --cache-type-k/--cache-type-v チューニングに任せるのではなく、自動的に活用したいタイプのシグナルそのものです。

2026年8月の下流プロジェクトの1つ、llama.cpp-adaptive-turboquantは、いくつかの層適応モードのための自動セレクターを報告し、RTX 5080 16 GBでの長深度テストを公開しています。これらの数値は、アップストリームllama.cppが同じように動作するという証拠ではなく、特別なフォークからの著者報告の結果です。

なぜまだ実験的であるのか

そのフォークは、カスタムキャッシュタイプ、CUDAカーネル、モデル固有パス、ツールチェーン制約を組み合わせます。それは、アップストリームキャッシュストレージをF16からQ8_0に切り替えるよりも、はるかに多くの信頼されるべきコードです。

そのようなフォークは、アップストリームが実際の要件を満たせず、自分のモデルで品質、安定性、速度を再現できる場合のみ使用してください。結果がプロジェクト名のみに関連付けられている場合、再現可能ではないため、コミットとCUDAバージョンを記録してください。

公平な適応型キャッシュテスト

フォークを、同じGGUF、プロンプト、サンプラー、コンテキスト深度、出力長を持つアップストリームQ8_0ベースラインと比較します。起動VRAM、ピークプリフィルVRAM、プロンプト処理速度、デコード速度、およびコンテキストの最も古い部分からの証拠を 실제로必要とする品質タスクを測定します。

成功した割り当てを完全な結果として受け入れないでください。キャッシュは128Kに収まっても、初期の事実を失い、シーケンスの後半で出力を壊し、または有用に動作するほど速くデコードできない可能性があります。

16 GBチューニング手順の具体例:一度に1つの変数

安定した設定への最速ルートは、メモリ次元を一度に1つずつ変更することです。キャッシュタイプ、バッチサイズ、層オフロード、並列性、コンテキストをランダムに変更すると、説明なしで動作するコマンドが生成されます。

flowchart TD A["ステップ1: 8Kコンテキスト、1シーケンスでロードし、ウォームアップVRAMを記録"] --> B{"重み + ランタイムが約14.5 GiB以下か?"} B -- "いいえ" --> C["より小さい量子化またはモデルを選び、ステップ1を繰り返し"] C --> A B -- "はい" --> D["ステップ2: F16/BF16 KV品質ベースライン、タスク出力を保存"] D --> E["ステップ3: Flash AttentionでQ8_0 / FP8 KVに切り替え"] E --> F["ステップ4: コンテキストを段階的に上げる - 32K, 64K, 96K, 128K"] F --> G{"プリフィル中の失敗?"} G -- "はい" --> H["ステップ5: バッチ / ユーバッチサイズを減らす"] H --> F G -- "いいえ" --> I{"同時リクエストでのみ失敗?"} I -- "はい" --> J["ステップ5: 並列スロット / max-num-seqsを減らす"] J --> F I -- "いいえ" --> K["この時だけ: ミックス Q8/Q4, 完全 Q4, オフロード, 適応型フォーク"]

ステップ1: 重みの下限を確立する

8Kコンテキスト、1シーケンス、意図したGPUオフロードでモデルをロードします。ウォームアップ後、プロセスVRAMを記録し、層が予期せずCPUに移動していないことを確認してください。

重みとランタイムがすでに約14.5から15 GiB以上を消費している場合、長文コンテキストには健全なマージンがありません。キャッシュをチューニングする前に、より小さい重み量子化またはモデルを選択してください。

ステップ2: F16またはBF16 KVを品質ベースラインとして測定する

テストをサポートする最小限のコンテキストで実行し、デフォルトの高精度キャッシュを保持します。検索、コード編集、ツール選択、長命令タスクからの出力を保存します。

このベースラインは、後のエラーがキャッシュ量子化から来るかどうかを示します。それなしでは、チャットテンプレートの問題や弱いモデルが、Q4 KVのせいにされやすいです。

ステップ3: Q8またはFP8に移行する

必要な場所にFlash Attentionを有効にし、llama.cppまたはOllamaでQ8_0を選択し、またはvLLMでサポートされるFP8モードを選択します。同じトークン深度で同じプロンプトを繰り返し、ログが意図したキャッシュタイプを示すことを確認してください。

多くの16 GBデプロイメントにとって、これは有用な停止点です。これは、キャッシュ圧縮をスタックの中で最も積極的な量子化にすることなく、生KV容量をほぼ倍にします。

ステップ4: コンテキストを段階的に上げる

宣伝されている最大値に直接飛びつくのではなく、32K、64K、96K、128Kをテストします。各段階で、秒あたりプロンプト処理トークン、秒あたりデコードトークン、ピークVRAM、および開始近くのエビデンスがまだ回復できるかを記録します。

アテンションがより多くのキャッシュされた状態を読むため、メモリが収まった後も長文コンテキストのデコードが遅くなることはよくあります。容量とパフォーマンスは別の軸です。

ステップ5: 一時的なメモリをチューニングする

失敗が初期化ではなくプリフィル中に起こる場合、マイクロバッチまたは最大バッチされたトークンを減らします。失敗が同時に発生するリクエストでのみ起こる場合、シーケンス並行性または並列スロットを減らします。

それらの制御が理解された後、ミックス Q8/Q4 キャッシュ、完全 Q4 キャッシュ、CPUオフロード、または適応型フォークを試すことができます。アップストリームQ8実行を比較ベースラインとして保ちます。後で投機的デコーディングやMTPを追加する場合、そのドラフトバッファは予算方程式のもう1つの行であり、無料の速度ではないことを覚えておいてください — 投機的デコーディングガイドがメカニクスとそのVRAMコストをカバーし、私のQwen 3.6 27Bと35B MTP対標準ベンチマークは、16 GBカードでMTPヘッドの追加状態がどのくらいのコンテキストのコストになり得るかを示しています。

長文コンテキストベンチマークで記録すべきこと

単一の tokens/s 数値は、この記事が解決しようとしている正確な問題を隠しています。長文コンテキストテストは、もう一人のオペレーターがメモリ境界を再現できる十分な詳細を保持すべきです。

項目 重要性
GPUと使用可能VRAM ディスプレイ使用と他のプロセスが予算を変える
エンジンバージョンまたはコミット キャッシュ動作とフラグは急速に進化する
ドライバ、CUDA、ROCm、またはVulkanバージョン バックエンドとカーネル動作を決定する
正確なモデルと重み量子化 重みの常駐とアーキテクチャを定義する
KとVキャッシュタイプ 永続キャッシュサイズと品質リスクを定義する
コンテキスト容量とプロンプト深度 割り当ては実際深度と同じではない
並列シーケンス キャッシュ需要を乗算または共有する
バッチとマイクロバッチ プリフィルピークと速度に影響する
プロンプト処理速度 長プリフィルの可用性を露出する
各深度でのデコード速度 キャッシュ帯域幅の減速を露出する
ピークVRAMとCPUオフロード 適合と溢れを区別する
長文コンテキスト品質結果 圧縮または位置の失敗を検出する

プリフィルとデコーディングの両方で nvidia-smi サンプルまたは同等のベンダーツールを使用します。エンジンの割り当てレポートは必要ですが、実際のプロンプト中のピークデバイスメモリが安定性を決める数値です。

16 GB GPUでの一般的なKVキャッシュの間違い

128Kサポートをハードウェアの約束として扱う

モデル設定のコンテキストフィールドはアーキテクチャ上の上限です。それは、特定のエンジンで特定の量子化を読み込んだ後に残るメモリについて何も言及していません。

キャッシュを計算し、ランタイムを検証してください。マーケティングサイズのコンテキストをVRAM予算なしで使用することは、最初の真剣なプロンプトまで遅延されるOOMに過ぎません。

重みを量子化したがKVを忘れ

4ビットGGUFはモデル重みを減らし、F16 KVキャッシュは減らしません。長文コンテキストでは、キャッシュは保存されたものをすべて消去し、最終的には重みのフットプリントを超え得ます。

両方の量子化を報告してください。Q4_K_M モデル、Q8_0 KV は意味がありますが、4ビットモデル は不完全です。

ページドアテンションがトークンを圧縮すると仮定する

ページングは割り当てと共有の動作を改善します。それはテンソル精度を変えたり、1つの一意シーケンスが必要なKV状態を取り除いたりしません。

ページド割り当てを使用して可変ワークロードを効率的にサービングします。容量を制御するには、キャッシュ精度、モデルアーキテクチャ、コンテキスト上限、並行性制限を使用します。

プレフィックスキャッシュがすべての長いプロンプトに役立つと仮定する

プレフィックスキャッシュは、リクエストが正確なプレフィックスを共有する場合、繰り返されるプリフィル計算を保存します。プレフィックスキャッシュが有効だからといって、一回の100Kリポジトリダンプは魔法のようなメモリ割引を受けません。

それはワークロード最適化であり、予算方程式の代わりではありません。マルチユーザーサービングでヒット率と保持されたキャッシュ圧力を測定してください。

品質テストなしでQ4 KVを使用する

低ビットキャッシュは微妙に失敗し得ます。モデルは依然として流暢なテキストを書きませんが、遠いエビデンス、正確な名前、ツール引数、コード依存性へのアテンションが劣化するかもしれません — 上記のトークン分岐研究が示すように、決定的デコーディング下では「安全な」Q8_0設定もF16出力を正確に再現することを保証されるわけではなく、集計で精度を保持するのみです。

ターゲット深度でターゲットタスクをテストしてください。短いチャットベンチマークは、長文コンテキストキャッシュの検証にはほとんど役に立ちません。

並列性をAutoのままにする

エンジンは、スループットに対して理にかなっているが、あなたの長文コンテキストターゲットに対して不可能な並行性を選ぶ可能性があります。16 GBでは、1つの深いシーケンスといくつかの短いシーケンスは根本的に異なるワークロードです。

明示的に制限を設定し、計測されたトラフィックで引き上げてください。そうでなければ、2番目のリクエストが安定した64K設定を割り当てまたはレイテンシーの驚きに変える可能性があります。

推奨される16 GBプロファイル

これらのプロファイルは出発点であり、普遍的なプリセットではありません。異常なKV幾何学構造を持つモデル — 特にMLAまたはハイブリッドスライディングウィンドウ設計 — は、従来のGQA例よりはるかに安価であるか、または高価である可能性があります。

対話的なコーディングエージェント

1シーケンス、48Kから64Kコンテキスト、Q8キャッシュ、Flash Attention、および可能な限り完全なGPU重み常駐を使用します。このプロファイルは、印象的だが rarely 有用な最大値よりも、予測可能なレイテンシーと良いキャッシュ精度を優先します。

エンジンがサポートする場合、コーディングターンは大きなリポジトリまたは会話プレフィックスを共有することがあるため、プレフィックス再利用を有効にしてください。それでもツール出力と古いトランスクリプトをコンパクトに保ちます;キャッシュエンジニアリングは、関連のないトークンを価値あるものにするわけではありません。

長文文書解析

64Kから128K容量、Q8またはキャリブレーションされたFP8キャッシュを持つより小さいモデルを使用し、複数の質問が同じ文書をターゲットにする場合、反復プレフィックスキャッシュを使用します。デコードが許容可能でもプリフィルが支配的になり得るため、最初のトークンまでの時間を測定します。

1つの質問だけが質問される場合、検索またはチャンク化要約は、16 GBカードで全体コーパスを強制するよりも速く、信頼できるかもしれません。長文コンテキストはツールであり、情報アーキテクチャの代わりではありません。

小規模マルチユーザーサーバー

モデル最大値をすべてのクライアントに宣伝するのではなく、リクエストごとのコンテキストと合計アクティブシーケンスを制限します。vLLMのページド割り当てはここで有用ですが、Ollamaとllama.cppも集計ライブトークンへの明示的な注意を必要とします。

管理されていない溢れよりキューイングを優先します。より緩やかな承認ポリシーは、すべてのリクエストが突然デコーディング中にPCIeをまたぐよりも破壊的ではありません。

16 GB長文コンテキストへの最終推奨

16 GBでの長文コンテキストにおいて、Q8 KVと1アクティブシーケンスは正しいベースラインです。それらは、低ビットキャッシュ品質、並列割り当て、オフロードレイテンシーが同時に失敗するのではなく、実際の限界を露出します。

アテンション幾何学構造から計算し、重みとランタイムオーバーヘッドを差し引き、次に結果をエンジンログとピークメモリ計測で確認してください。128Kが依然として収まらない場合、より小さいモデルが最もクリーンな最適化であることがよくあります;収まるが遅い場合、コンテキストの削減が多くの場合、正直な選択です。

ページドアテンション、プレフィックスキャッシュ、スライディングウィンドウ、適応型精度は、有用だが異なる問題を解決します。勝利の設定は、GPUに留まり、古いエビデンスを正しく取り出し、実際に使用するコンテキスト深度で許容可能なデコード速度を維持するものです。

参考文献

購読する

システム、インフラ、AIエンジニアリングの新記事をお届けします。