llama.cpp、SpacemiT X60のQ8_0プリフィルを約8.8倍に高速化

llama.cppはリリースb11408で、ggml-cpuにSpacemiT X60向けのQ8_0 IME1行列カーネルと、関連する再パック・量子化処理を追加しました(#28479)。Milk-V Jupiter上で、Qwen2.5-0.5B-Instruct Q8_0のpp128は10.70 t/sから93.87 t/sへ向上しています。

何が新しいか

これまでSpacemiT X60でIME行列アクセラレーションの対象になっていたのは、Q4_0、Q4_1、Q4_Kだけでした。Q8_0にはIME1カーネルがありませんでした。さらにSpacemiTビルドはGGML_CPU_REPACK=OFFを設定するため、再パック経路もコンパイルされていませんでした。そのためQ8_0には高速化された経路がなく、同じボード上のプリフィル速度はQ4_0の約10分の1でした。

今回の変更内容は次のとおりです。

  • make_block_q8_0x16とQ8_0の再パックエントリを追加し、重みをIME1のvmadotシーケンスが期待する16列レイアウトへインターリーブします。
  • int8 x int8のIME1カーネルime1::gemm_kernel_i8i8を追加しました。単一行Aパスと4行Aパスを備えます。4行パスは各Bパネルを1回だけロードし、Aの4行で再利用します。
  • 4行アクティベーション量子化用にquantize_a_4row_i8を追加しました。
  • これらをforward_mul_matと、Q8_0用の再パックファクトリーへ接続しました。
  • ドキュメントで、Q8_0をX60対応として記載しました。

ベンチマーク結果

測定はtaskset -c 0-3の下でllama-bench -t 4を実行し、アイドル状態のボードで5回反復しています。

形式 pp128 変更前 pp128 変更後
Q8_0 10.70 t/s 93.87 t/s
Q4_0 106.40 t/s 107.51 t/s

Q4_0の経路は今回の変更の対象外です。数値がほぼ変わらないのはそのためです。

正確性検証とテスト環境

正確性は2つの方法で確認しています。1つはK=32から4096の範囲で、量子化に厳密な整数リファレンスと比較する方法で、最大相対誤差は約1e-6でした。もう1つは、複数のプロンプトで生成内容の一貫性が保たれることの確認です。

項目 内容
ボード Milk-V Jupiter(SpacemiT X60)
OS Bianbu 2.1.1
コンパイラ gcc 14.2
モデル Qwen2.5-0.5B-Instruct Q8_0
スレッド数 4

Qwenは、Alibaba Cloudが開発する大規模言語モデルのファミリーです。

この記事の固有名詞

コメント (0)

まだコメントはありません。

コメントを書く

2000文字以内