私は現在、Apple M4 Pro 48GB上で、Gemma 4 26B A4B-it Q4_K_Mに対して、llama.cpp(CPU + Metal)でTurboQuant KVキャッシュの量子化をいろいろ試しており、その結果は驚くほど強力に見えます。
Gemma 4の知見
Gemma 4ではQJLがうまく機能しているようで、構造化された回転の代替としてのFWHTも、大きい注意ヘッドに対して(dk=256/512)良い適合に見えます。
私のベンチマーク結果:
- tq3j/q4_0: 品質テストで37/37、NIAHで8/8
- tq2j/q4_0: 36/37で、唯一の取りこぼしは空応答
- 131Kコンテキストでq4_0/q4_0より+34%高速
- TurboQuantは4Kコンテキスト以降でq4_0を上回る
この構成では、約3.1 bits per Kチャネルで、意味のある長コンテキストの速度向上を伴いながら、精度損失がほぼゼロに近づきます。
また興味深いのは、これまで私が見てきた公開されているGemma 4のフォーク結果よりも良く見える点です。リンク先の512-d Gemma 4実験では、512-WHT + グローバルノルムが31/65に到達している一方で、TBQP3 512 + QJLのバリアントは23〜28/65あたりに着地しています。これは、上記のMetal実装で私が見ているものとはかなり異なる結果です。
補足として、いまはGemma 4のPPLは使っていません。というのも、現時点でllama.cpp上ではGemma 4のPPLが信頼できない/壊れているように見えるためです。なのでGemma 4については、主に直接の品質評価、NIAH、そして長コンテキストの速度から判断しています。
別結果: Qwen PPL
Gemma 4の作業とは別に、Qwen2.5 / Qwen3向けに、層ごと/チャネルごとの外れ値に配慮した、適応的なK量子化のセットアップも用意しています。
これらの結果は、同程度のbpvで比較した場合、現在の公開されているフォーク形式の実装をPPLで上回っているようです:
- Qwen2.5 1.5B: 11.514 vs q8_0 11.524 at 6.21 bpv
- Qwen2.5 7B: 8.927 vs q8_0 8.949 at 6.41 bpv
- Qwen3 8B: 10.848(f16とq8_0の両方のCI内)、5.125 bpv
このことから、ギャップの多くは、ベースの量子化器だけではなく、層ごとの割り当て/キャリブレーション/外れ値処理にあるのではないかと思っています。
また、Gemma 4で層ごとの分散分析も行いましたが、層間でばらつきがかなり大きいので、どこでも共通の固定レシピではなく、混在する層ごとのKタイプでさらに改善できる余地がまだありそうです。
Gemma 4ベンチマーク / 詳細:
https://github.com/andrei-ace/llama.cpp/tree/turboquant-gemma/benches/tq-metal
Qwenの層ごと/外れ値に配慮したPPL結果:
https://github.com/ggml-org/llama.cpp/discussions/21297
TurboQuantスレッド内のGemma 4比較ポイント:
https://github.com/ggml-org/llama.cpp/discussions/20969#discussioncomment-16450839
[link] [comments]