term タグ別の記事一覧

Windows環境でAMD GPUでllama.cppを動かす

 ネット上にWindows環境でAMD Radeon GPUを使ってllama.cppを動かす情報が少なく、若干ハマったので簡単にメモを残しておきます。なお、この分野は日進月歩で進んでいるため今後このドキュメントの内容は使い物にならなくなっている場合がありますのでご注意ください。本記事の執筆日時は2025年12月27日です。

検証環境

 本記事の内容は下記の環境で検証しています。

  • OS:Windows 11 Pro 24H2
  • CPU:AMD Ryzen 6 7600X
  • GPU:AMD Radeon RX 9060 XT(16GB)
  • メインメモリ:32GB

llama.cppバイナリの入手

 llama.cppのGitHubリポジトリ上にあるinstall.mdではWingetを使えと書いてあります。この場合、llama.cppのGitHubリポジトリのReleasesページで公開されている最新バイナリの「Vulkan」版がインストールされるようです。

 いっぽうで、リリースページには「HIP」版のバイナリも公開されています。HIPはAMD GPU上で各種処理を行うための「ROCm」というソフトウェアスタックを内包するWindows向けライブラリです。こちらは単にビルド済みバイナリをZIP形式で圧縮しただけのもので、インストーラは付属していません。そのため、適当な場所に展開した後、手動でパスを通す設定などを行う必要があります。

 なお、HIPを利用するためのHIP SDKはAMD HIP SDK for Windowsページからインストーラをダウンロードできます。ただし、llama.cppのリリースページで公開されているバイナリにはHIP関連のDLLも同梱されているため、おそらくHIP SDKを別途ダウンロードする必要は無いと思います(自分は先に自前でllama.cppをビルドするためにインストールしてしまっていたので詳細は不明)。

 ちなみに、前述のようにHIPは内部的にROCmを内包しているため、HIPを利用するビルドではGPUデバイスが「ROCm0」「ROCm1」……といったデバイスIDで表示されます。

統合GPUを無効化する

 統合GPUを備えたAMDのCPUとAMDの単体GPUを組み合わせて使用している場合、HIP版のllama.cppではllama_cli.exellama_server.exeの実行時に下記のようなエラーが出て強制終了することがあります。

ggml_cuda_compute_forward: MUL_MAT failed
ROCm error: invalid device function

 AMDの統合GPUと単体GPUは両方を有効にした状態で利用できるのですが、その場合どうも単体GPUで実行すべき処理を統合GPUで実行しようとしてしまい、その結果このエラーが発生しているような雰囲気です。この場合、BIOS(EFI)設定で統合GPUを無効にすることでこの問題を解決できます。

Vulcan版とHIP版どっちが高速?

 VulcanとHIPはそれぞれ異なるライブラリのため、実行速度としてはどちらが優れているのかが気になるところです。ということで、Vulcan版とHIP版のllama.cppを使って日本語文章の英訳処理を実行し、処理速度を比較してみました。使用したモデルは16GBのデバイスで実行できるとされているgpt-oss-20bです。

 まずwingetでインストールしたVulcan版ですが、実行時間は下記のようになりました。

prompt eval time =    1735.51 ms /  1188 tokens (    1.46 ms per token,   684.53 tokens per second)
       eval time =   31974.28 ms /  2622 tokens (   12.19 ms per token,    82.00 tokens per second)
      total time =   33709.78 ms /  3810 tokens

 タスクマネージャで確認した実行時のメモリや演算リソースの消費量は以下のような感じです。

Vulcan版llama.cpp実行時のリソース消費

 一方、HIP版は下記のような結果になりました。

prompt eval time =     656.10 ms /  1188 tokens (    0.55 ms per token,  1810.71 tokens per second)
       eval time =   44236.82 ms /  3047 tokens (   14.52 ms per token,    68.88 tokens per second)
      total time =   44892.92 ms /  4235 tokens

HIP版llama.cpp実行時のリソース消費

 プロンプトの処理はHIP版のほうが3倍近く速いのですが、出力の生成はVulcan版のほうが1割ほど速いという感じです。また、HIP版のほうが若干多くGPUのメモリや演算リソースを使用する雰囲気がありますが、これについては誤差レベル程度の違いしかなさそうです。

 ということで、今回の検証ではVulcan版のほうが若干ではあるが高速という結論となりました。ただ、処理内容によってもどちらが高速かは異なるという話もあるので、引き続き検証していきたいところです。