大規模言語モデル(LLM)の推論ライブラリ「llama.cpp」のOpenCLバックエンドに、Flash Attentionデコード処理の大幅な性能最適化がマージされた。今回の変更はQualcomm Adreno GPUを搭載するAndroid端末やWindows ARMデバイスでの実用性を引き上げるもので、特にモデルが逐次トークンを生成するデコード時の速度が向上する。KleidiAIが有効化されたApple Silicon版にも対応し、モバイル・エッジでのオンデバイスAI競争に新たな舞台を用意する。

Adreno GPUで露呈したデコード処理の壁

Qualcomm Adreno GPU上でFlash Attentionを実行する際、特定の次元設定(DK=512)においてデコード処理がクラッシュする問題があった。これはGemma-4のような特定のアーキテクチャで顕在化し、カーネルの不一致やメモリアクセス違反を引き起こしていた。今回の修正では、プリフィルとデコードで必要なカーネルの整合性を保証し、メモリ領域外読み取りを防ぐガードを実装することで、安定動作を確保した。

CPUへの戦略的オフロードと計算資源の使い分け

特筆すべき設計判断として、DK=512のデコード処理をGPUではなくCPUで実行するように変更された。帯域幅が律速となるこのワークロードでは、メモリ階層の特性上、Adreno GPUよりもCPUコアの方が高い実効スループットを発揮する。さらにバッチサイズが小さいほどCPU優位が顕著になる。GPU向けのサポート関数からこのケースを除外し、プリフィル処理は引き続きGPUで実行することで、ハイブリッドな推論パイプラインが形成された。

コンパイラのメモリ限界を回避する分割コンパイル

マルチクエリ・グループドクエリアテンション(MQ_GQA)を有効にした大規模カーネルのコンパイルで、Adrenoコンパイラがメモリ不足に陥る問題に対しては、ビルド構成の分離で対処した。使用しないコードを除外する「FA_MQ_ONLY」フラグの導入により、コンパイラ負荷を軽減。同時に、ビルドエラーメッセージにプログラム名を明示する改良を加え、開発者がどのカーネルで問題が起きたかを即座に特定できるようにした。

f16-KVにおけるワークロード分割の細分化

単一クエリのf16キー・バリューデコードでは、従来のデフォルト分割サイズ(2048)ではAdreno GPUの演算器が十分に活用されていなかった。f16 KV専用の分割パラメータ(FD_KV_PER_SPLIT_F16)を導入し、512単位へ細分化することでGPU使用率を改善。量子化KVについては2048の分割を維持し、精度と速度のバランスをデータ型に応じて動的に調整する機構が組み込まれた。