ホームへ戻る

推論系統

llama.cpp、Adrenoの行列乗算ルーティングを改修――2世代のチップでプロンプトのプリフィルを9~25%高速化

llama.cpp b10687は、Snapdragon X2および旧世代のA7X GPUにおいて、OpenCLコンパイラが選択していた非効率な行列乗算パスを回避する。メンテナーの測定では、gpt-oss-20bとGemma 3nのプロンプトのプリフィルがそれぞれ約20~25%、9%高速化した一方、token単位のデコード速度は向上していない。

The GGML authors · Public domain · Image source
zh-Hant

llama.cppは8月29日、Qualcommが提供したOpenCLルーティング修正をマージした。主眼は新しいカーネルの追加ではなく、2世代のAdreno GPUで既存の高速な実装がデフォルトで選択されるようにすることだ。Snapdragon X2 EliteのAdreno X2-90は従来、F16の重みとF32のactivationを`kernel_mul_mm_f16_f32_l4_lm`で処理していた。標準のgpt-oss-20bでは、このカーネルによるattention projectionの実行速度は、同一マシン上で最適化されたQ4_0 GEMMの約4分の1にとどまり、プリフィル時のGPU処理時間の40.8%を占めていた。そこで新版では、X2Eでxmem F16×F32パスをデフォルトで有効化した。メンテナーは複数の報告で、プリフィル性能が約20~25%向上したとしている。

もう一つの変更は、Adreno A7XのOpenCLコンパイル問題に対処するものだ。旧版のregister allocatorでは、tiled F32 GEMMの各work itemが488 bytesのprivate memoryを使用しており、次世代版の304 bytesと比べてK-loopでのspillが多発していた。そのため、処理速度は同じチップ上のF16およびQ4_Kカーネルの約10分の1にすぎなかった。新しいルーティングでは、batch widthが8を超えるF32×F32演算に行単位のカーネルを使用する。これにより、Adreno 740でGemma-3n-E4Bを実行した際のプリフィルが約9%高速化した。小さいbatchでは従来のパスを維持し、`GGML_OPENCL_A7X_F32_LM_BYPASS=0`を設定すればこの変更を無効化できる。

今回の修正は、オンデバイスモデルの速度が量子化ビット数や公称演算性能だけで決まるわけではないことを示している。モデル内に残るF16/F32レイヤー、ドライバのコンパイラバージョン、GEMM dispatchのいずれも主要なボトルネックになり得る。ただし、2つの変更はいずれも比較的大きな行列batchにのみ作用するため、token単位のdecodeは高速化しない。また、Q8 attentionはすでにDP4Aパスを使用しているため、恩恵を受けない。エンジニアリングチームは、自社で使用するGGUF、ドライバ、プロンプト長を対象にprefillとdecodeを分けて測定すべきであり、単一モデルで得られた改善率をすべてのSnapdragonデバイスへそのまま外挿してはならない。

出典

  1. opencl: use a better matmul path on two Adreno GPU generations
  2. llama.cpp b10687