単一のRTX 5090上で256Kフルコンテキスト:TurboQuant KVキャッシュ・ベンチマークにおけるGemma 4 31B

Reddit r/LocalLLaMA / 2026/4/3

💬 オピニオンDeveloper Stack & InfrastructureSignals & Early TrendsTools & Practical UsageModels & Research

要点

  • ユーザーが、TurboQuantのKVキャッシュ圧縮を用いることで、単一のNVIDIA RTX 5090(32GB VRAM)上でGemma 4 31B instructモデルをフル256Kコンテキストで実行したと報告している。
  • 設定では、llama-cpp-turboquantのフォーク(feature/turboquant-kv-cache)を使用し、turbo3のKVキャッシュ方式(3-bit PolarQuant + Hadamard回転)によって、f16に対して約4.5倍のKVキャッシュ圧縮を実現している。
  • ベンチマーク結果では、生成速度は概ね一定(tg128で約61.5 t/s)である一方、コンテキストが大きくなるにつれてプロンプト処理のスループットは低下する(例:pp4096で約3363 t/sから、pp262144で約900 t/sへ)。これは注意(attention)の計算コストがO(n²)であることと整合する。
  • 262Kコンテキスト時のVRAM使用量は32GB中27.7GBと報告されており、余裕は限られている。また、最長コンテキストの実行では熱的制限に近づき(575Wで78〜80°C)、温度が高くなる。
  • llama.cppでGemma 4を有効化するには、MSVC固有の修正が必要で、Releaseビルド時にGGUFのbool配列を正しく読み取れない問題に対処している。この修正は、Gemma 4のハイブリッド注意に必要なSWA挙動を壊してしまう可能性のあるバグを回避するものだ。

Gemma 4 31Bを、TurboQuant KVキャッシュ圧縮を使って、単一のRTX 5090でフル256Kコンテキストとして動かせました。

システム仕様

コンポーネント 仕様
GPU NVIDIA GeForce RTX 5090(32GB VRAM)
CPU AMD Ryzen 9 9950X3D(16コア)
RAM 64GB DDR5
OS Windows 11

セットアップ

  • モデルgemma-4-31B-it-UD-Q4_K_XL(Unslothより、17.46 GiB)
  • ビルドTheTom/llama-cpp-turboquant のブランチ feature/turboquant-kv-cache。Gemma 4対応のために、最新のアップストリームmasterとマージ済み
  • KVキャッシュturbo3(3-bit PolarQuant + Hadamard回転、f16に対して約4.5倍圧縮)
  • 設定--n-gpu-layers 99 --no-mmap --flash-attn on --cache-type-k turbo3 --cache-type-v turbo3

ベンチマーク結果

テスト 速度(t/s)
pp4096 3,362.71
pp16384 3,047.00
pp65536 2,077.96
pp131072 1,428.80
pp262144 899.55
tg128 61.51
  • VRAM使用量(262K):27.7 GB / 32 GB(4.3 GBの余裕)
  • GPU温度:575W時に78-80°C(262Kの実行中に一部サーマルスロットリングが発生しました。実際にスロットルが無かった場合の速度はおそらく~950+ t/s…かも)

要点

  1. 256Kフルコンテキストは単一の5090に収まる — turbo3のKVキャッシュ圧縮により、K/Vが8ビットから実質3ビットにまで圧縮され、品質低下はほぼゼロです(TurboQuant論文、arXiv 2504.19874に基づく)。これがないと、32GB VRAMでは256Kは不可能です。

  2. プロンプト処理は予測可能にスケールする — コンテキストを4倍増やすごとに速度はおおむね半分になる(注意計算がO(n²)のため)。

  3. トークン生成は一定 — コンテキスト長に関係なく61.5 t/s。メモリ帯域が律速。

  4. Gemma 4対応には修正が必要だった — llama.cpp内のMSVCのバグを直す必要がありました。std::transform(const bool*) を使うと、ReleaseビルドでGGUFのbool配列のうち~48要素を超える部分を正しく読み取れません。これにより、Gemma 4のハイブリッドアテンションアーキテクチャにおけるSWA(sliding window attention)層のパターンが壊れます。修正:手動の uint8_t* ループに置き換え。

ビルドメモ(Windows/MSVC)

WindowsでTheTomのTurboQuantフォークをビルドする場合:

  1. ggml-turbo-quant.c#include <math.h> の前に #define _USE_MATH_DEFINES を追加(MSVCはデフォルトではM_PIを定義しないため)
  2. ggml-cpu/ops.cpp — ファイルスコープで extern "C" int turbo3_cpu_wht_group_size; を追加(C/C++リンケージの不一致)
  3. llama-model-loader.cppget_arr() 内の std::transform((const bool*)...) を、手動の uint8_t* ループに置き換え(boolポインタキャストに伴うMSVC最適化バグ)
  4. ターボのグローバルに関連するDLLシンボルエクスポートの問題を避けるため、-DBUILD_SHARED_LIBS=OFF でビルドする
  5. RTX 5090向けに -DCMAKE_CUDA_ARCHITECTURES=120a を使用(MXFP4テンソルコア命令にはsm_120aが必要)
submitted by /u/PerceptionGrouchy187
[リンク] [コメント]