Qwen 3.6-35B-A3B KVキャッシュベンチ:M5 Maxで0〜100万コンテキストにおけるf16、q8_0、turbo3、turbo4比較

Reddit r/LocalLLaMA / 2026/4/29

💬 オピニオンDeveloper Stack & InfrastructureTools & Practical UsageModels & Research

要点

  • 著者は、llama.cppのturboquant KVキャッシュフォークを使って、M5 Max上でQwen 3.6-35B-A3BのKVキャッシュ挙動を0〜100万トークンのコンテキスト長にわたり、f16・q8_0・turbo3・turbo4で比較ベンチマークしました。
  • 生成スループットでは、短いコンテキストでf16がわずかに優位ですが、量子化キャッシュよりも早い段階でメモリが尽き、q8_0やturbo系はより深い領域まで動き続けます。
  • コンテキスト長が増える(この環境では約10万トークン以降)と、処理が帯域ボトルネック寄りになり、より小さいKVキャッシュ(特にturbo3)がプロンプトのプリフィルで8ビットより有利になり得ることが示されました。
  • 重要な点として、turbo3とturbo4はフェーズごとに優劣が入れ替わります。例えば256Kではプリフィルでturbo3が速く、一方でデコードではturbo4が優位になり、512Kではそのデコード優位が拡大します。

llama.cpp(github.com/TheTom/llama-cpp-turboquant、feature/turboquant-kv-cache ブランチ)の TheTom の TurboQuant Metal フォークを使って、Qwen 3.6-35B-A3B Q8 で深さスイープ(depth sweep)を実行しました。TheTom はすでに M5 Max の数値を 32K まで公開していました。押し広げたときにカーブがどう見えるのかを確認したかったのです。

ハードウェア: MacBook Pro M5 Max、128 GB のユニファイドメモリ。フォークを cmake -B build -DGGML_METAL=ON でビルドしました。llama-bench、1セルあたり 3 レップ、flash-attn オン、mlock オン、8 時間の壁時計(overnight)で実行。

キャッシュ種別: f16、q8_0、turbo3、turbo4。K と V は対称(-ctk-ctv を同じタイプに設定)。深さは 0〜1M トークン。

生成スループット(tok/s):

Depth f16 q8_0 turbo3 turbo4
0 89.4 87.4 79.5 79.7
8K 84.2 79.2 72.2 71.2
32K 72.6 67.8 61.5 61.8
128K 44.4 40.7 36.0 37.7
256K OOM 26.6 22.9 25.5
512K OOM OOM 13.3 16.0
1M OOM OOM 6.5 OOM

プロンプト処理スループット(tok/s):

Depth f16 q8_0 turbo3 turbo4
0 2962 2948 2904 2854
8K 2098 1623 1653 1439
32K 1063 802 784 678
128K 321 245 253 206
256K OOM 124 128 101
512K OOM OOM 66 56
1M OOM OOM 30 OOM

目立った点

深さ 0 では標準的なストーリーどおりです。プリフィル(prefill)では f16 がわずかに勝ち、デコード(decode)では turbo3 が約 10% 遅いです。ほとんどのまとめはここで止まっています。

128K では 3-bit キャッシュがプリフィルで 8-bit キャッシュに追いつきます(turbo3 253 対 q8_0 245)。キャッシュが小さいほど、注意(attention)の間の帯域圧(bandwidth pressure)が減ります。このハードウェアでは、文脈が約 100K を超えてくると、帯域が律速の領域で turbo3 が有利になります。

より大きな驚きは turbo3 と turbo4 の比較です。両者はフェーズで分かれました。256K では turbo3 がプリフィルで turbo4 に +27% 勝ちました(128 対 101 tok/s); しかしデコードでは turbo4 が turbo3 に +11% 勝ちました(25.5 対 22.9 tok/s)。512K ではデコードの差が +20% まで広がります(turbo4 16.0 対 turbo3 13.3)。プリフィルとデコードでボトルネックとなる領域が異なるため、適切なキャッシュ種別はワークロード次第になります。

そこから自分が得た結論:

  • コーディングエージェント(深い文脈、ターンあたり生成トークンが多い): turbo4
  • RAG やバッチ QA(重いプリフィル、短い回答): turbo3
  • 純粋なコンテキストウィンドウ最大化(1M): turbo3、これが収まる唯一のもの
  • 短いインタラクティブ(32K 未満): はまるなら f16、そうでなければ q8_0

turbo3 の 1M セルではデコードが 6.5 tok/s でした。チャット速度ではありませんが、夜間のエージェント的なバッチジョブなら実用的です。メモリは 1M で約 89 GB(重みが 37 GB、KV キャッシュが約 52 GB)で、OS の予約領域込みでも 128 GB に収まりました。

注意点

これは 1 台の M5 Max です。クロスオーバー(入れ替わり点)と、プリフィル/デコードの分岐は、メモリ帯域幅と GPU のコア数でおそらく変わります。対称な K と V の組み合わせだけをテストしました。(-ctk q8_0 -ctv turbo4) のような非対称(asymmetric)をデフォルトとして推すスレッドを見かけましたが、まだベンチしていません。TheTom のフォークは研究レベルで、まだ llama.cpp の main に取り込まれていないため、アップストリーム側の移動に合わせて rebase が必要になります。

M5-Max 以外の Apple Silicon(M2 Pro/Max、M3 Ultra、M4 Max)を使っていて、同じスイープを回したい場合は、下に数値を貼るか DM してください。カーブはハードウェアで変わる可能性が高く、2 つ目のデータ点があるとクロスオーバーの特徴づけに役立ちます。

詳しい版が必要なら、完全なグリッドと手法をこの書き込みに載せています: https://llmkube.com/blog/turboquant-m5-max-long-context

submitted by /u/Defilan
[link] [comments]