2026年5月24日日曜日

llama.cpp oneMKLを有効にしてみた

llama.cppの/docs/build.mdにavx2しかなくてもoneAPIの機能でavx512を利用できるようになるらしいという面白いことが書いてあったので、ようやく試してみました。

makeはドキュメント通り問題なく通りました。

stable-diffusion.cppのcmakeの方法で、buildディレクトリを別の物に切替てビルドしました。多分このやり方がいろいろ便利そうです。

気になる差ですが…チャットではあまり差が出ないかも(笑)

llama-cliで試してみたのですが、いつものあいさつと自身の説明を求めたところ…

oneMKL 

[ Prompt: 11.4 t/s | Generation: 3.9 t/s ]
[ Prompt: 7.1 t/s | Generation: 3.6 t/s ]

CPU (たぶん…)AVX2 

[ Prompt: 10.4 t/s | Generation: 3.8 t/s ]
[ Prompt: 10.5 t/s | Generation: 3.5 t/s ]

結果だけ見ると思った以上に早くはなっていなく、誤差レベルですね。長文の出力がCPUのみの方が早いというのはやはりoneAPIのオーバーヘッドがかかってしまうと重くなってしまうのかな。どのような形でAVX512を実現しているのか全く分からないのですが、あくまでも動作はGPUを噛まして動いている感じなのでしょう。intel_gpu_topでは表示されませんでしたが。

そしてもう一つSYCLFP32

 [ Prompt: 4.8 t/s | Generation: 2.4 t/s ]
 [ Prompt: 5.7 t/s | Generation: 3.0 t/s ]

まぁこんな感じでしょうね。 

llama-benchを使った方がどの程度の差なのかはっきりしそう。

ただ、syclを動かしたとき、初期化時にエラーが起きて、メモリー関連かと思ってmmprojを切り離してもう一度実行したところ起動するのにものすごい時間がかかりました。その後は普通に起動したので、oneMKLとoneAPIの切り替えに何か必要なのかもしれません。

ざっくりとした感触ではoneMKLは何も考えずにAVX512の恩恵が受けられるのは面白いかもしれません。発熱問題はついて回りそうですが。

SYCLはオーバーヘッドが大きいのと、1デバイス(2コアとはいえおそらく1コア扱い)なのでどうしてもチャットだと分が悪すぎますが、コンテキストが大きくなってくるとSYCLの方が有利なのは間違いないです。一番なのは入出力を伴う処理はCPUに置いて、処理の重そうな推論部分だけGPUに割り当てるのがいいとこどりをできる可能性が高いです。(その設定を行いたかったのですが、肝心のLocalAIが落ち着かなかったので手を出していませんが)
内蔵GPUとはいえ4CPUコアよりも、内蔵GPUの方が圧倒的に計算処理量は上なので使わないという手はないですね。

別件の話としてllama.cppのllama-cliをいつも使用しているPCで直接動かして気づいたのですが、llama-cliでチャットを行うと新たに入力したプロンプトだけを処理して返事が出ているように感じました。LocalAIでは常にシステムプロンプトから最初の入力プロンプト、返答を全てやり取りを行うので、チャットを続けると必然的に返答時間がどんどん遅くなります。最初はこういうものだと思い、vllmの使用も検討しましたが、vllmはllama.cppとは違って大規模を前提としている感じなのと、pythochベースなためにLocalAIでネイティブで動かそうとすると結構ハードルが高く、今のところ断念しています(笑)

ですが、llama-cliの動作を見るとコンテキストの参照範囲が段々大きくなるのでそれなりに応答時間は長くなってはいるのですが、明らかにLocalAIのチャットより早く返答が始まります。特に画像を提示し、その画像に対する質問を連続させて聞く場合など画像の解析は1度しか行われていないのを実感できました。制約はあると思いますが、この動作はLocalAIでも実現できそうなのですねぇ…しないのかな?(笑) 

 llama-cliのソースを少し見た感じだと、cliと言っても中身はserver.cppを使用しているようですね。この辺の絡みあい方は面白いです。

0 件のコメント:

コメントを投稿