Stable Diffusion web UI(AUTOMATIC)　導入　[環境：Windows WSL2(OracleLinux)]

# 概要
`グラフィックボード搭載のWindowsPC`に **`Stable Diffusion web UI(AUTOMATIC)`**　を導入する手順とその他をざっくり書きます。

※ 細かい流れでいうと、WindowsOS上のWSL2上に用意したOracleLinux8の中にpythonで仮想環境を用意して、PC環境に合わせたPyTorch(GPU版)、CUDAをぶち込んで、Stable Diffusionをgit cloneしてくるイメージです。

# 環境
 <img src="https://img.shields.io/badge/OS -Windows11-blue">
 <img src="https://img.shields.io/badge/WSL -2-yellow">
 <img src="https://img.shields.io/badge/distribution-RHEL Oracle Linux 8.7-red">
 <div>
 <img src="https://img.shields.io/badge/python -v3.9.13-green">
 <img src="https://img.shields.io/badge/GPU -NVIDIA_GeForce_RTX_3060_Ti-purple">
 </div>


# 導入

## WSL2上のOS内に仮想環境を作る

以下を参照してやってみる
:bangbang:仮想環境は /path **じゃなくて一般ユーザーディレクトリ内の `./path` に作る（$HOME/path）**

https://self-development.info/%e3%80%90%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%81%a7%e7%b0%a1%e5%8d%98%e3%80%91python%e3%81%a7venv%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e4%bb%ae%e6%83%b3%e7%92%b0%e5%a2%83%e3%82%92%e5%88%a9%e7%94%a8/

```zsh:仮想環境の準備と作成
# ホームディレクトリに path ディレクトリを作成 & 移動
cd $HOME
mkdir path && cd path; pwd

# 仮想環境（my_venv）を作成
python3 -m venv my_venv

# 初期ファイルが表示されればOK
ls my_venv
# bin  include  lib  lib64  pyvenv.cfg
```

ホームディレクトリから仮想環境を起動しておく
```zsh:仮想環境の起動
$ source $HOME/path/my_venv/bin/activate
```
```zsh:my_venvの仮想環境が起動状態
(my_venv) $
```
```zsh:仮想環境を停止する場合
(my_venv) $ deactivate
```
```zsh:my_venvの仮想環境が停止状態
$
```

## PyTorch（GPU版）を導入（WSL2OS内で Linux版を入れる）
※GPU版なので、グラフィックボード搭載のPCでないと使えない

↓まずここでローカル環境を選択してコマンドページへ遷移する
https://pytorch.org/get-started/locally/

↓今回の場合の遷移先

https://pytorch.org/get-started/previous-versions/#v1120

※ここは若干コマンドが怪しい。
**root（sudo）でコマンドは実行しないように。導入作業が進まなくなる。**

```zsh:
(my_venv) $ 
### ※仮想環境（my_venv）上で実施 
# CUDA 11.6
pip install torch==1.12.0+cu116 torchvision==0.13.0+cu116 torchaudio==0.12.0 --extra-index-url https://download.pytorch.org/whl/cu116

path/my_venv/bin/python3 -m pip install --upgrade pip

pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113
```

## CUDAを導入（WSL2OS内で Linuxコマンドで入れる）

※ 前項でインストールした参照バージョン（CUDA 11.6）に合わせたコマンドを実施する

https://developer.nvidia.com/cuda-11-6-0-download-archive?target_os=Linux&target_arch=x86_64&Distribution=RHEL&target_version=8&target_type=rpm_network

```zsh:
sudo dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/cuda-rhel8.repo
sudo dnf clean all
sudo dnf -y module install nvidia-driver:latest-dkms
sudo dnf -y install cuda
```
## Gitを導入

```zsh:
sudo dnf install git
```

## AUTOMATIC1111版web UIのインストール

https://self-development.info/automatic1111%e7%89%88web-ui%e3%81%ae%e7%b0%a1%e5%8d%98%e3%83%bb%e5%ae%89%e5%85%a8%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab/

```
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
```
```
cp -r stable-diffusion-webui/ my_venv/
cd my_venv/stable-diffusion-webui
```

## AUTOMATIC1111版web UIの実行

```zsh:起動
### ※仮想環境（my_venv）上で実施 
python3 launch.py
```

モデルファイルがない場合、初回起動時はモデルファイルのダウンロード処理が入る。
ダウンロードが成功すると勝手に起動する。
※2回目からはダウンロードなしでそのまま起動する

```
Downloading (…)olve/main/vocab.json: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 961k/961k [00:01<00:00, 956kB/s]
Downloading (…)olve/main/merges.txt: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 525k/525k [00:00<00:00, 622kB/s]
Downloading (…)cial_tokens_map.json: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 389/389 [00:00<00:00, 336kB/s]
Downloading (…)okenizer_config.json: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 905/905 [00:00<00:00, 651kB/s]
Downloading (…)lve/main/config.json: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 4.52k/4.52k [00:00<00:00, 1.82MB/s]
Applying cross attention optimization (Doggettx).
Textual inversion embeddings loaded(0):
Model loaded in 16.9s (calculate hash: 2.9s, create model: 9.3s, apply weights to model: 1.5s, apply half(): 0.4s, load VAE: 2.0s, move model to device: 0.7s).
Running on local URL:  http://127.0.0.1:7860
```
表示されたローカルIPにアクセスするとWebUIが起動しているはず。
http://127.0.0.1:7860

※ UI表示されるまで少し時間がかかるので、下記のように表示されない場合は少し待ってからブラウザを再読み込みする

![sd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23248/9d438085-695b-fdaa-b777-97ffe8bfeb95.png)

txt2Img で Prompt に `a cat` を入力して Generate したもの
![sd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23248/8bc6d4a1-1e5a-10c3-0271-175ce7b427a7.png)

`Save`をクリックして画像を保存。
`my_venv/stable-diffusion-webui/log/images` の中に保存されてるはず

※生成した画像はSaveを押さなくても履歴としてすべて保存されてます。

終了時はコンソール側で `Ctrl + c`

もう一度起動する場合は
`python3 launch.py`

コンソールに再ログインした際は 
`source  my_venv/bin/activate`
`cd path/my_venv/stable-diffusion-webui`
`python3 launch.py`

で起動できる。

----

# 別のモデルファイルを配置する

## ダウンロードと配置
https://huggingface.co/gsdf/Counterfeit-V2.5/tree/main

`Counterfeit-V2.5.safetensors`をダウンロードする
`Counterfeit-V2.5.vae.pt`もダウンロードしておく（必須ではない）

ダウンロードしたファイルはそれぞれ以下のディレクトリ配下に置く
**`～.safetensors`ファイルは：**
`my_venv/stable-diffusion-webui/models/Stable-diffusion/`

**`～.vae.pt`ファイルは：**
`my_venv/stable-diffusion-webui/models/VAE/`


起動中の場合は
スクリプトを再起動してください

※ コンソール側で `Ctrl + c` で終了してから再度`python3 launch.py`

モデル入れ替え時にエラーが出る場合でも
何回かスクリプト再起動とともにモデル変更を繰り返すと最終的に変更が成功する場合が多いです。

## モデルの選択
WebUI上で、別のチェックポイント（モデル）が選択できるようになっているので、そこで導入したモデルを選択すればよい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23248/95865074-c8da-6c7c-1fb0-a248865c902f.png)


## 実行テスト
txt2Img  `a cat` → `Generate`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23248/a05ad0ef-2dff-a0ed-a734-0ff53b1110cc.png)


あー、まぁこんなもんかな（2匹。。）

あとは基本としてはPromptとNegative promptの文言を追加していくなり、Sampling method や Sampling steps や CFG Scale をいじるなりで完成度を上げていきましょう。（ほかにも設定要素は無数にあるので、がんばって調べてください）
あと、モデルによって "イラスト風が得意" 、 "実写風が得意" とかあるので、いろんなモデルで試してみましょう

# VAEファイルについて
生成画像の完成度を向上してくれるファイルらしいです。
いい感じになる調整を自動でやってくれるらしい。

https://mayonaka-blog.com/stable-diffusion-web-ui-install/#outline_1__2_1

~~※画像生成処理に必須ではないので、あった方がいいけど無くてもよい~~

と思ったが、精度の高い画像を生成するならVAEは必須らしいので

https://freeblog-video.com/stable-diffusion_vae/

↑上記サイトで紹介されている汎用VAEを使ってみることをお勧めします

https://huggingface.co/stabilityai/sd-vae-ft-mse-original/tree/main

`vae-ft-mse-840000-ema-pruned.safetensors`ファイルを
ダウンロード後に
`my_venv/stable-diffusion-webui/models/VAE/`に配置する

`Settings`-`stable diffusion`-`SD VAE`から設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23248/c5925f46-e899-ba14-2602-3339126d247e.png)
右側の青色の更新マークを押してから`vae-ft-mse-840000-ema-pruned.safetensors`を選択して`Apply Settings`で設定を反映する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23248/38cc2bb9-545c-e4d7-f82e-20db94a07811.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23248/169f0718-8598-e153-6760-b78e7986c926.png)



# 2回目以降の起動
```zsh:準備
source my_venv/bin/activate
cd path/my_venv/stable-diffusion-webui
```
```zsh:起動
python3 launch.py --xformers
```

xformersオプションで起動すると
VRAMの使用効率を改善してくれて、画像の生成速度も速くなるらしいのでおすすめ
※ そのかわり、パラメータ値を合わせてまったく同じ画像を出力させる用途には向いてないらしい。

> https://takamunelabo.com/stable-diffusion-xformers/

# 画像の生成操作（Generate）
Generateボタンを押すより`Ctrl` + `Enter`で実行した方が早くて楽です。~~これ豆な~~

# アップデート
Stable Diffusion本体のアップデート

```zsh:gitリポジトリのディレクトリ内に移動してコマンド打つだけ
cd $HOME/path/my_venv/stable-diffusion-webui/
git pull
```

# エラー時、不具合時
※動かなくなったりした場合は消して入れ直しが無難。（自分でも体験済み:sob:）
※削除する前に生成した画像などはバックアップしておきましょう

```zsh:削除
cd $HOME/path/
rm -rf my_venv/stable-diffusion-webui/
# 以前の　stable-diffusion-webui　が存在する場合はそれも先に消しておく
# rm -rf stable-diffusion-webui
```
```zsh:gitクローン
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
```
```zsh:コピー＆ディレクトリ移動
cp -r stable-diffusion-webui/ my_venv/
cd my_venv/stable-diffusion-webui
```
※初回ダウンロードおよび起動後に画像生成して問題なく動くようであれば
任意のモデルを入れなおす（以下のディレクトリ内に配置）
`my_venv/stable-diffusion-webui/models/Stable-diffusion`
VAEはこちらに配置
`my_venv/stable-diffusion-webui/models/VAE`

---

## ソフト、ツールの更新（再インストール）（torch, xformers）
適切な最新バージョンのソフトを再インストールしてくれる
:bangbang:※pipの依存性問題等でうまく起動しなくなる可能性あり

```zsh:準備
source my_venv/bin/activate
cd path/my_venv/stable-diffusion-webui
```
```zsh:ソフト更新（torch, xformers）
python launch.py --xformers --reinstall-torch --reinstall-xformers
```
---
```zsh:pip更新
pip install --upgrade pip
```

# 画像の出力先例
```zsh:バックアップする場合はここからコピー
$HOME/path/my_venv/stable-diffusion-webui/log/images
$HOME/path/my_venv/stable-diffusion-webui/outputs/
```
```powershell:ファイルエクスプローラで確認する場合のパス
# ユーザ名 部分は自分のホームディレクトリユーザ名に置き換えてください
\\wsl.localhost\OracleLinux_8_6\home\ユーザ名\path\my_venv\stable-diffusion-webui\log\images
\\wsl.localhost\OracleLinux_8_6\home\ユーザ名\path\my_venv\stable-diffusion-webui\outputs\
```
※ OracleLinux は 8.6 から 8.7 にアップデートした場合はディレクトリ名が 8.6 のまま...？:rolling_eyes:


# 他モデルとか
絵画アート系をやりたい人は`dalcefoPainting`シリーズのモデルがおすすめ
リアル系は`chilloutmix`がおすすめ

# モデル参照サイト

https://civitai.com/

https://huggingface.co/models?pipeline_tag=text-to-image

# 他参考

https://supplepentan.com/programming/stable-diffusion-web-ui_04_command_option/