KVデquant処理の90%をスキップ → +22.8%のデコード高速化(32K、llama.cpp / TurboQuant)

Reddit r/LocalLLaMA / 2026/3/27

💬 オピニオンSignals & Early TrendsIdeas & Deep AnalysisTools & Practical Usage

要点

  • 進行中のオープンソースTurboQuantのKV圧縮実装をllama.cpp上で開発している著者は、長いコンテキストにおいてKVデquant化が主要なボトルネックになっていることを見出した(例:M5 Maxで32K時、デコード時間の約40%)。
  • LUT/SIMD、fused、分岐なし(branchless)といった手法でデquant計算そのものを最適化するのではなく、注意(attention)のスパース性を利用して、softmax重みがほぼゼロの位置ではV側のデquant化をスキップする。
  • この「sparse V dequant」変更はカーネル内で数行程度で済むとされ、モデル品質指標を維持している(PPLは不変で、テストしたTurboQuantバリアントではNIAHが改善)。
  • Qwen3.5-35B-A3B(M5 Max)において、TurboQuant KVは32KでTurboQuantのベースライン比で約+22.8%のデコード速度向上を示した。一方、標準のq8_0 KVキャッシュでも、より小さいながら約+5%の正の速度向上が得られている。
  • 本手法はTurboQuant専用ではないとして位置付けられており、別のAppleチップ(M2 Pro)での追加テストに加えて、CUDAやその他のプラットフォームへの移植・検証に向けた継続的な取り組み/関心が述べられている。

私は llama.cpp における KV キャッシュ圧縮のための、オープンソース TurboQuant 実装に取り組んでいて、そこで致命的なボトルネックにぶつかりました。dequant(デクォント)です。

長いコンテキスト(M5 Max で 32K)では、dequant だけでデコード時間の約 40 パーセントを占めていました。

いつものやり方で直そうとしました: - LUT(ルックアップテーブル)の登録
- SIMD の小技
- フューズドカーネル
- 分岐なしの数式

約 14 種類のアプローチをテストしました。どれもベースラインを上回りませんでした。ハードウェア側はすでに限界でした。

最終的にうまくいったのは、ずっとシンプルな方法でした。

フラッシュアテンションは、V に触れる前に softmax の重みを計算します。
長いコンテキストでは、それらの重みのほとんどが基本的にゼロです。

そこで、dequant を速くするのではなく、注意(attention)が無視できる位置では V のデクォントを丸ごとスキップすることにしました。

カーネル内ではだいたい 3 行です。

Qwen3.5-35B-A3B(M5 Max)での結果:

TurboQuant KV(turbo3): - +22.8% デコード(32K)
- PPL 不変
- NIAH: 7/9 → 9/9

標準の q8_0 KV キャッシュ: - +5% デコード
- PPL 同一
- NIAH 同一

つまり、これは TurboQuant 固有の話ではありません。アテンションのスパース性をそのまま使っています。

また M2 Pro でもテストしました: - K 側で 4-mag LUT + スパース V スタックはきれいに動作
- turbo3 は ~0.45x → ~0.73x(q8_0 と比べて)

リポジトリとベンチマーク:
https://github.com/TheTom/turboquant_plus

解説:
https://github.com/TheTom/turboquant_plus/blob/main/docs/papers/sparse-v-dequant.md

CUDA や他のセットアップで試してみたい人がいれば、結果を見られると嬉しいです。

注:CUDA ポートは現在、独立してテスト中です。利用可能になり次第、結果を共有します。

submitted by /u/Pidtom
[link] [comments]
広告