Stable Diffusion WebUI で画像生成（Windows版 Python利用）

## はじめに

いまさらですが、ローカル環境で Stable Diffusion WebUI を使用した画像生成を試してみました。
今後は Windows＋AMD GPU での最適化や高速化などをいろいろ試していきたいと思います。

NVIDIA GPU を利用する場合は下記リンク先の手順が参考になります。
[Install and Run on NVidia GPUs](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Install-and-Run-on-NVidia-GPUs)

## 前提

* Windows 11 のコマンドプロンプトで実行します。
* Git for Windows をインストールしておきます。
  * [Windows の PowerShell(posh-git) で git を利用する](https://qiita.com/kerobot/items/718d50ba8ebc2e199bc1)
* Python 3.10.6（できれば pyenv）をインストールしておきます。
  * [Windows で Python の開発環境を構築する（Poetry と pyenv を利用）](https://qiita.com/kerobot/items/8b371ba51501ddc806a7)

## 参照元

[stable-diffusion-webui-directml](https://github.com/lshqqytiger/stable-diffusion-webui-directml)

## 構築手順

コマンドプロンプトを利用して下記手順を進めます。

* github から stable-diffusion-webui-directml を取得します。

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

* stable-diffusion-webui-directml ディレクトリに移動します。

  ``` batch
  > cd stable-diffusion-webui-directml
  ```

* サブモジュールを取得して更新します。

  ``` batch
  > git submodule update --init --recursive
  ```

* pyenv を利用している場合は、対象のバージョンの Python 3.10.6 をインストールします。  
新しいバージョンの Python は torch をサポートしていないため 3.10.6 を使用します。

  ``` batch
  > pyenv install 3.10.6
  ```

* プロジェクトディレクトリの Python のバージョンを 3.10.6 に切り替えます。

  ``` batch
  > pyenv local 3.10.6
  ```

* プロジェクトディレクトリの Python のバージョンを確認しておきます。

  ``` batch
  > python -V
  Python 3.10.6
  ```

* Python 仮想環境を構築して切り替えます。

  ``` batch
  > python -m venv venv
  > .\venv\Scripts\activate.bat
  ```

* Python の pip をアップデートします。

  ``` batch
  (venv)> python -m pip install --upgrade pip
  ```

* WebUI を起動します。

  ``` batch
  (venv)> webui-user.bat
  ```

* しばらく待つと下記のような表示になります。

  ``` batch
  100%|███████████████████████████████████████████████████████████████| 3.97G/3.97G [00:45<00:00, 94.5MB/s]
  Calculating sha256 for D:\Develop\Git\stable-diffusion-webui-directml\models\Stable-diffusion\v1-5-pruned-emaonly.safetensors: Running on local URL:  http://127.0.0.1:7860

  To create a public link, set `share=True` in `launch()`.
  Startup time: 99.9s (launcher: 37.8s, import torch: 6.2s, import gradio: 3.1s, setup paths: 2.0s, other imports: 3.6s, list SD models: 45.7s, load scripts: 1.0s, create ui: 0.4s).
  6ce0161689b3853acaa03779ec93eafe75a02f4ced659bee03f50797806fa2fa
  Loading weights [6ce0161689] from D:\Develop\Git\stable-diffusion-webui-directml\models\Stable-diffusion\v1-5-pruned-emaonly.safetensors
  Creating model from config: D:\Develop\Git\stable-diffusion-webui-directml\configs\v1-inference.yaml
  LatentDiffusion: Running in eps-prediction mode
  DiffusionWrapper has 859.52 M params.
  Applying attention optimization: InvokeAI... done.
  Model loaded in 6.8s (calculate hash: 3.3s, load weights from disk: 0.2s, create model: 0.5s, apply weights to model: 0.8s, apply half(): 0.7s, move model to device: 1.1s, calculate empty prompt: 0.2s).
  ```

* Ctrlキーを押しながら、上記表示の http://127.0.0.1:7860 をクリックするか、ブラウザのアドレスバーに入力して移動します。

* ブラウザに WebUI が表示されます。
  ![img01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283306/34a09f5b-6129-95d1-fd78-7089f415b3a7.png)

## Diffusersのモデル設定

* 必要に応じて、任意の safetensors ファイルを stable-diffusion-webui-directml\models\Stable-diffusion ディレクトリに配置しておきます。

* safetensor ファイルがモデルファイルです。checkpoint と呼ばれます。ckpt ファイルもありますが、任意のコードを実行できる問題があるので、safetensor ファイルを利用することをお勧めします。

* あわせて、LoRA（追加学習を効率化する手法）を stable-diffusion-webui-directml\models\Lora に配置しておきます。

* モデルファイルやプロンプトの確認および設定値については下記サイトなどが参考になります。（アカウント登録が必要な場合があります。）

  - [CIVITAI](https://civitai.com/)
  - [Hugging Face](https://huggingface.co/)
  - [chichi-pui](https://www.chichi-pui.com/)

## 画像生成

1. WebUI の [Stable Diffusion checkpoint] を更新して、safetensors を選択します。

2. プロンプトを入力します。

3. ネガティブプロンプトを入力します。

4. サンプリングメソッドを選択します。（例：DPM++ 2M SDE Karras）

5. サンプリングステップを調整します。（例：40）

6. 幅と高さを任意で調整します。まずは 512×512 程度が良いです。
サイズを大きくすると謎画像が生成されやすくなるようです。

7. LoRAを指定する場合は、[Generate]の下にある[Show/hide extra network]をクリックし、LoraタブでLoRAを選択します。これにより LoRA がプロンプトに追加されます。

8. [Generate]をクリックしてしばらく待つと画像が生成されます。

512×512 サイズで Ryzen 9 5900X と Radeon 6700 XT OC の組み合わせで 60 秒程度かかりました。

AC6 を常時 WQHD120FPS でプレイするため Radeon 7900 XT に換装したのですが、それでも 45 秒程度でしたので、やはり Stable Diffusion においては、NVIDIA GPU が圧勝（同等性能の GPU で 5 秒程度と聞いています）のようです。

AMD GPU でも Linux + ROCm (Radeon Open Compute) 環境であれば 20 秒を切るらしい（ただし、xformers（画像生成のプロセスを最適化するライブラリ）は動かないためこれ以上の高速化は難しい）ので、Windows と Ubuntu のデュアルブート環境構築や、ROCm の Windows 対応なども試していきたいと思います。

![img02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283306/4eac3373-109b-f5ce-ee3d-bbc6e9e5bf4c.png)

## AMD GPU で高速化したい

ちょうど先日 AMD のブログに「[How-To] Running Optimized Automatic1111 Stable Diffusion WebUI on AMD GPUs」が掲載されたので試してみましたが、最適化モデルを指定した WebUI での生成時に実行時エラーが発生しました。

[[How-To] Running Optimized Automatic1111 Stable Diffusion WebUI on AMD GPUs](https://community.amd.com/t5/gaming/how-to-running-optimized-automatic1111-stable-diffusion-webui-on/ba-p/625585)

Anaconda/Miniconda 環境を利用しないとうまくいかないっぽいです。

また、2023/8/22 時点で、stable-diffusion-webui-directml の requirements_versions.txt にバグ？があり、「accelerate==0.18.0」を「accelerate==0.20.3」に書き換えてから実行する必要がありました。

結局のところ、NVIDIA GPU を購入するのが手っ取り早いのですが、引き続きいろいろ試してみます。