TL;DR: Intel Xe2(Battlemage/Arc Bシリーズ)GPUでのQ8_0量子化は、理論上のメモリ帯域幅のわずか21%しか出ていませんでした。私のAIエージェントと私は根本原因を突き止め、66%まで引き上げる修正を提出しました。これによりトークン生成が3.1倍高速化します。
問題:
Intel Arc Pro B70では、Q8_0モデルは4.88 t/s、Q4_K_Mは20.56 t/sでした。Q8_0が持つデータ量がQ4_K_Mより1.7倍しかないのに、4倍もの差が出てしまっていました。VRAMの圧迫、ドライバ、バックエンドの問題をそれぞれ切り分けた後、SYCLカーネルのディスパッチ経路に原因があると突き止めました。
根本原因:
llama.cppのSYCLバックエンドには、量子化スケール因子をウェイトデータから分離し、GPUメモリのアクセスをコアレス(coalesced)にするための「reorder」最適化があります。これはQ4_0、Q4_K、Q6_K向けに実装されていましたが、Q8_0は追加されていませんでした。Q8_0の34バイトブロック(2の冪ではない)は、reorderされないレイアウトをGPUキャッシュ性能にとって特に悪いものにします。
それで、修正:
既存のreorderフレームワークをQ8_0まで拡張するために、約200行のコードを追加しました。最もクリティカルなバグは、実は1行でした。Q8_0のテンソルでは、バッファ初期化時に「extra」構造体が割り当てられていなかったため、reorderフラグがこっそり(silently)一度もセットされていませんでした。
Qwen3.5-27B(Intel Arc Pro B70)での結果:
- Q8_0(修正前): 4.88 t/s(帯域幅21%)
- **Q8_0(修正後): 15.24 t/s(帯域幅66%) - 3.1倍高速**
- Q4_K_M: 20.12 t/s(変化なし)
- Q6_K: 13.83 t/s(reorderなし)
私のテストでは、Q8_0はQ6_Kよりも高速になりました(15.24 vs 13.83 t/s)。さらに、品質もより高いです。
検証: 修正を書く前に、IntelのクローズドソースであるIPEX-LLMをバイナリパッチして自分のGPUで動かしました(同社の実装はB70のPCIデバイスIDをサポートしていません)。最適化されたQ8_0カーネルは61%の帯域幅を達成しており、問題が解決可能であることを確認できました。私のオープンソース実装では66%に到達します。
PR: https://github.com/ggml-org/llama.cpp/pull/21527
Issue: https://github.com/ggml-org/llama.cpp/issues/21517
ハードウェア: Intel Arc Pro B70、32 GB GDDR6、608 GB/s 帯域幅
[link] [comments]




