Mini PC HX80G（AMD製GPU RX6600M)でStable Diffusionを使ってみる

## はじめに
久しぶりにStable DiffusionをAMD製GPUのWindows PCで使おうとしたのですが、環境構築方法をすっかり忘れていてたので、CPUのみを使う場合とGPUを使う場合の両方の手順をメモしておきます。

## 環境
実行環境はミニPCなので性能は高くないのですが、一応軽いゲームであれば動くレベルのGPU(Memory 8GB)がついている機種です。このGPUを使ってStable Diffusionで画像生成を実行できるようにしたいと思います。

ミニPC　Minisforum HX80G
CPU AMD Ryzen7 5800H (8コア)
GPU Radeon RX 6600M (8GB)
Memory DDR4 32GB
OS Windows 11 Pro

## インストール
### 前提条件
OS Windows 11 Pro
Python3 , Git for Windowsをインストール済み

### 手順（CPU利用）
Gitの以下のレポジトリを任意のフォルダにクローン

```
git clone https://github.com/lshqqytiger/stable-diffusion-webui-directml
```

Exploreでクローンしたフォルダは以下の
stable-diffusion-webui-directml
フォルダを開き
webui-user.batをダブルクリックし起動

![スクリーンショット 2024-05-03 192810.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737026/f7795d23-433d-d1af-b07d-10b083f3df65.png)

GPU関連のエラーが発生するので、GPUチェックをスキップしCPUを使うようにwebui-user.batを書き換え
```webui-user.bat
@echo off

set PYTHON=
set GIT=
set VENV_DIR=
set COMMANDLINE_ARGS=--update-all-extensions --skip-torch-cuda-test --medvram --opt-sub-quad-attention --opt-split-attention --no-half --precision full --no-half-vae --upcast-sampling --update-check

call webui.bat
```

生成中のCPU,GPU使用率は以下の通り、GPUが使われておらずCPU使用率が高くなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737026/c832ddf5-a994-a100-2e2d-563cc5d135a6.png)

１枚生成するのに約4分40秒でした。
![00007-1806436568.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737026/7ca63853-2697-82c4-3868-3f56a70a7cff.png)


### 手順（GPU利用）
Gitの以下のレポジトリをクローン

```
git clone https://github.com/lshqqytiger/stable-diffusion-webui-directml
```

[stable diffusion webui directml](https://github.com/lshqqytiger/stable-diffusion-webui-directml "Stable Diffusion WebUI Direct ML")


webui-user.bat
を実行すると、必要なファイルのインストールが実行される。

途中で以下のエラーが発生する
```
Traceback (most recent call last):
  File "C:\temp\stable-diffusion-webui-directml\launch.py", line 48, in <module>
    main()
  File "C:\temp\stable-diffusion-webui-directml\launch.py", line 39, in main
    prepare_environment()
  File "C:\temp\stable-diffusion-webui-directml\modules\launch_utils.py", line 590, in prepare_environment
    raise RuntimeError(
RuntimeError: Torch is not able to use GPU; add --skip-torch-cuda-test to COMMANDLINE_ARGS variable to disable this check
```

~~途中でエラーが発生するので
torchのdirectmlをインストールする。
cd venv\Scripts
activate~~


Torch(PyTorch)がGPUでは使えないというメッセージのようなので、direct MLに対応したTorchをインストールする必要があります。

Stable Diffusionの起動バッチwebui.batの中身をみると、以下の記述がありPythonの仮想環境への切り替えはstable-diffusion-webui-directml配下のvenv\Scripts/activate.batで切り変えていることが分かります。
``` webui.bat
set PYTHON="%VENV_DIR%\Scripts\Python.exe"
call "%VENV_DIR%\Scripts\activate.bat"
echo venv %PYTHON%
```

コマンドプロンプト上で次のコマンドを入力しactivate.batを実行てPythonの仮想環境を有効化します。
``` 
cd C:\GitでCloneを実行したフォルダのパス\stable-diffusion-webui-directml\venv\Scripts
activate.bat
```

このコマンドを実行すると、コマンドプロンプトの先頭に (venv) と表示されるようになります。
これは、仮想環境が有効化されたことを示しています。

仮想環境が有効化された状態で、torch_directmlなどの必要なパッケージをインストールします。
``` 
pip install torch_directml
``` 

解説
仮想環境が有効化された状態では、pipコマンドでインストールするすべてのパッケージは、仮想環境内にインストールされ、システム全体には影響を与えません。この状態でインストールを行うことで、他のプロジェクトやシステム環境に影響を与えることなく、必要な依存関係を管理することができます。


その後、
webui-user.batを以下のように編集
```webui-user.bat
@echo off

set PYTHON=
set GIT=
set VENV_DIR=
set COMMANDLINE_ARGS=--use-directml --update-all-extensions --medvram --opt-sub-quad-attention --opt-split-attention --no-half --precision full --no-half-vae --upcast-sampling --update-check

call webui.bat
```

COMMANDLINE_ARGSで指定するオプションは環境と好みにより調整
--use-directml は必須。
--medvram　はメモリが少ないので指定。
 

webui-user.batを実行するとwebuiが起動しブラウザから画像生成ができます。


![スクリーンショット 2024-05-03 212651.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737026/1cc6a7bc-c475-6493-4182-db7fca0f8d8f.png)

CPU 使用率が低く、GPUが99%とGPUをしっかり使えているようです。

![スクリーンショット 2024-05-03 205933.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737026/597d8fd4-3f35-5c73-85ac-4cf31f5e92bf.png)

実行時間は一枚40秒程度


### まとめ

| CPU Ryzen7 5800H | GPU RX6600M |
|:-----------|------------:|
| 280秒      | 40秒     |

Mini PCのGPUを使いStable Diffusionで画像生成したところ、
CPUのみの場合と比較して約7倍高速に生成できることが分かりました。



###  2024/8/10 追記
手順（GPU）の後、webui-user.batで起動しようとすると、エラーが発生するようになっていました。

```
    from .onnxruntime_pybind11_state import *  # noqa
ImportError: DLL load failed while importing onnxruntime_pybind11_state: ダイナミック リンク ライブラリ (DLL) 初期化ルーチンの実行に失敗しました。
```

環境依存の問題のようですが、私の環境ではVisual C++の再配布可能パッケージを更新したところ起動できるようになりました。

[最新の Microsoft Visual C++ 再頒布可能パッケージ バージョン](https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-160)