「Ryzen 7 8700G」のiGPUで「LM Studio」「ollama」「Stable Diffusion」と戯れる

AMDのAPU「Ryzen 7 8700G」のiGPU（Radeon 780M/gfx1103）で「LM Studio」「ollama」「Stable Diffusion」と戯れたメモ。純粋Windowsの話のみ。WSL2は登場しない。

環境は以下の通り。

M/B: MSI PRO B650M-A WIFI
CPU: AMD Ryzen 7 8700G with Radeon 780M GPU
Memory: DDR5-5600(OC) 32GBx2 EXPO
OS: Windows11 Pro

※BIOS設定でUMA Frame Buffer Sizeを最大の16GBに設定している。

# 結論

「LM Studio」→ VulkanのRuntimeにてGPU動作。
「ollama」→ ROCmでGPU動作。
「Stable Diffusion」→ ZLUDAでGPU動作。

スンナリとGPUを活用できる環境が整えられた。有志の努力の賜物だ。基本的にCPUより速いが、ROCmではCPUと良い勝負になってしまう場合もある。dGPUと比較すると、小型化可能、省電力、メモリを盛りやすい点がメリット。ただし性能は最低ライン。AIだけを目的として8700Gで新調するのは微妙だが、何かのついでならば手軽に遊べる選択肢としてアリだ。

# お世話になったプロダクト

### ROCmLibs-for-gfx1103-AMD780M-APU

https://github.com/likelovewant/ROCmLibs-for-gfx1103-AMD780M-APU

iGPUを含むROCm非対応のAMD GPUでROCmするための非公式パッチ。HIP SDKのDLLを1個とディレクトリを1個入れ替える事で適用できる。Linux用モジュールもある。

### ZLUDA

https://github.com/vosen/ZLUDA

IntelやAMDのGPUでCUDAアプリを動作させるバイナリ互換レイヤー。以前はAMDが支援していたが一旦closeして、別の開発者により復活したという経緯がある。

「鋭意開発中でベンチ位しか動かないよ」と言いつつ、うっかりStable Diffusionが動いてしまう程度の完成度。何時の時代もバイナリ互換にはロマンがある。

（とはいえNVIDIAは「ズルいCUDAは許さない」方向だそう。 https://news.livedoor.com/article/detail/25992931/ ）

### LM Studio

https://lmstudio.ai/

LLMのダウンロードから推論まで手軽に試せるGUIアプリ。試したのは「LM Studio 0.3.8」のWindows版。

https://github.com/likelovewant/ROCmLibs-for-gfx1103-AMD780M-APU/wiki/Unlock-LM-Studio-on-Any-AMD-GPU-with-ROCm-Guide

上記に「ROCmLibs～」の適用手順があるが、注意書きの通り最新Ver.ではモジュール構成が変わっており動作させる事ができなかった。

モードを「Develop」としてROCmのRuntimeをインストールすると以下にROCm関連のバイナリが格納される。

```
C:\Users\(ユーザー名)\.lmstudio\extensions\backends\vendor\win-llama-rocm-vendor-v3\bin
C:\Users\(ユーザー名)\.lmstudio\extensions\backends\llama.cpp-win-x86_64-amd-rocm-avx2-1.9.2
```

この中身をパッチ版ROCmに差し替えるべく試行錯誤したが、以下のエラーで止まってしまう問題が解消できず断念。モデルのロードが始まり、GPUメモリ使用量が上昇するところまでは辿り着いたのだが。惜しい。

```
Failed to load last used model.
Error loading model.
(Exit code: 18446744072635812000). Unknown error. Try a different model and/or config.
```

まぁ、VulkanのRuntimeならば動作する（もちろんGPUで）ので良しとする。

### ollama

https://github.com/ollama/ollama

LLMのダウンロードから推論まで手軽に試せるコマンドラインツール。OpenAI互換のAPIも提供され、OpenAI対応のエージェントのバックエンドとして使用できる。後述の「Open WebUI」と組み合わせて、ChatGPTライクなAIチャット画面を構築できる。

https://github.com/likelovewant/ollama-for-amd

上記の「ROCmLibs～」を適用済みのフォークならば、exeをダウンロードしてインストールするだけ。ROCm非対応のAMD GPUで動作する。ROCmが正式対応しているGPUを使う場合は「本家」のバイナリを使うよう案内されているので注意。

https://github.com/pufferffish/ollama-vulkan

Vulkanのブランチもあるようだ。試してみたかったがバイナリの配布はないようなので一旦断念した。後述するが非公式パッチのROCmよりVulkanのほうが速いかもしれないので、暇があったらBuildしてみたい。

### Stable Diffusion web UI

https://github.com/AUTOMATIC1111/stable-diffusion-webui

画像生成AIと聞いたら最初に名前が出てくるスタンダードな存在。

https://github.com/lshqqytiger/stable-diffusion-webui-amdgpu

上記の「ZLUDA」対応版のフォークならば、手順に従ってインストールするだけ。AMD GPUで動作する。「DirectML」を使うモードもあるが、パフォーマンスが悪いという情報があったので試していない。

後述の「Open WebUI」と組み合わせて、画像生成にも対応したAIチャット画面を構築することもできる。

# パフォーマンス

### LLM

「phpのjson_decode関数をrustで実装して。コードの解説もお願い。」と問いかけた場合のパフォーマンス。VulkanとCPUはLM Studioで、ROCmはOpen WebUI経由のollamaでそれぞれ実施した。ROCmとそれ以外でパラメータが異なる可能性はある。

<table>
  <caption>パフォーマンス(tok/sec)</caption>
  <thead>
    <tr>
      <th>ランタイム</th>
      <th>gemma2:27b</th>
      <th>phi4:14b</th>
      <th>deepseek-coder-v2:16b</th>
      <th>qwen-2.5:3b</th>
    </tr>
  </thead>
  <tr>
    <td>ROCm</td>
    <td>4.53</td>
    <td>7.06</td>
    <td>25.17</td>
    <td>28.86</td>
  </tr>
  <tr>
    <td>Vulkan</td>
    <td>4.42</td>
    <td>7.95</td>
    <td>32.69</td>
    <td>34.05</td>
  </tr>
  <tr>
    <td>CPU</td>
    <td>3.23</td>
    <td>6.11</td>
    <td>25.49</td>
    <td>26.35</td>
  </tr>
</table>

遅いモデルでは「Vulkan≒ROCm＞CPU」、速いモデルでは「Vulkan＞ROCm≒CPU」という傾向。速いモデルの場合、ROCmはCPUと良い勝負となってしまうのが悲しい。非公式ROCmに問題があるのか？ここはollamaのVulkanバージョンを動かしてみたいところだ。

RAM使用量が20GBを越える「gemma2:27b」をオフロードなしで動かせるという点は、16GB VRAMのミドルクラスのdGPUに対するアドバンテージかもしれない。もっとも「この速度ではCPUと大差ないから意味がない」という見方もできる。

<details><summary>実行時のスクリーンショット</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19102/00a5b98d-9d2b-0dd8-6287-aa6332737974.png)
gemma2:27b／ROCm

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19102/6ef53686-ff34-b91b-4a5a-b3281d5253cc.png)
gemma2:27b／Vulkan

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19102/eb9f2967-a8ec-5e04-62c9-4cde580fc773.png)
gemma2:27b／CPU

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19102/c0d448f3-13c1-6c98-fd8b-4b5a1423ca49.png)
phi4:14b／ROCm

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19102/40ab89f5-29f9-4bba-7dc5-d00669177bd7.png)
phi4:14b／Vulkan

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19102/07c39933-c13a-b6e7-4649-8cc9b82a7799.png)
phi4:14b／CPU

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19102/796ce638-eab2-c50a-8c76-558765273c43.png)
deepseek-coder-v2:16b／ROCm

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19102/4495cf80-6236-8af9-a2b5-e62c8f44c9bd.png)
deepseek-coder-v2:16b／Vulkan

![deepseek-coder-v2-16b-cpu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19102/3f907c6a-ac9a-77af-f369-232711f8a95b.jpeg)
deepseek-coder-v2:16b／CPU

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19102/95029ce9-bf98-73d0-a753-4ce034de2566.png)
qwen-2.5:3b／ROCm

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19102/cf2475b2-3578-62eb-f34a-d941d4db8b9d.png)
qwen-2.5:3b／Vulkan

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19102/7f91778c-69c6-f231-9302-7003f78aab19.png)
qwen-2.5:3b／CPU

</details>

### Stable Diffusion

- v1-5-pruned-emaonly.safetensors

デフォルトで入っているチェックポイント（モデル）を使用した場合。

512x512(pixel) → 14.1秒
1024x1024(pixel) → 2分29.1秒

- matrixHentai_v202.safetensors＋Anya_Forger_-_Spy_X_Family.safetensors

アニメなチェックポイントに某ピンク髪エスパー幼女のRoLaを組み合わせた場合。

512x512(pixel) → 23.9秒
1024x1024(pixel) → 1分25.7秒

初めて使ったがシロウトが遊ぶには十分な速度だと思う。なお、追加モデルは https://civitai.com/ から取得可能だ。

<details><summary>実行時のスクリーンショット</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19102/51bf0b95-c5c6-dd1f-0774-35e8e061d58b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19102/b42b6783-3cbe-5316-ce1e-0cbc0fcc3a60.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19102/e162253d-84f2-ef63-6c5e-97720ad41b97.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19102/01451cc2-d6e1-f3f2-d30f-3b4e5f69c6cd.png)

</details>

# 実用的に使う

### Open WebUI

https://github.com/open-webui/open-webui

ChatGPTやPerplexityのようなチャット形式のAIエージェントのオープン実装。バックエンドとしてollamaやOpenAI互換のAPIを使用できる。

Windows起動時にollamaとOpen WebUIを起動するよう仕掛けておけば、ローカルはもちろんリモートでも使用することができる。Stable Diffusionと組み合わせることもできるが、ollamaがモデルをロードした状態でStable Diffusionが動くのかが課題となりそうだ。

### Continue

https://github.com/continuedev/continue

VS CodeとJetBrainsに対応したコーディング支援ツール。様々なバックエンドが使用できる。今回はollamaが別ホストで動作しているので、OpenAI互換APIとして連係させてみた。

歯車ボタンを押すと「config.json」がエディタで開くので以下の様に記述する。ollama相手の場合「apiKey」は何でも良い。
```
{
  "models": [
    {
      "title": "deepseek-coder-v2:16b(local)",
      "model": "deepseek-coder-v2:16b",
      "provider": "openai",
      "apiKey": "hoge",
      "apiBase": "http://192.168.***.130:11434/v1"
    },
    （以下略）
```

Continueはチャットする際にその場でモデルを選択できるのが良い。性能に制約があるローカルLLMでは「バカだが速いモデル」と「遅いが賢いモデル」を切り替えられると便利なのだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19102/15c7dc83-7660-2278-aa48-02b731e3c8c6.png)
（チャット欄にモデル選択プルダウンが備わる）

バックエンドを選べるVS Code用の支援ツールとしては、Cline（ https://cline.bot/ ）もある。モデルを選り好みするものの、こちらもollamaと連係することができた。

しかし、Clineはファイルをゴリゴリ書き換えまくる押しの強いエージェントだ。控えめなContinueのほうがローカルLLMとの組み合わせに向くのではないかと思う。