WSL2でAUTOMATIC1111/Stable Diffusion WebUIを構築する

# 目標
WindowsWSL2でStableDiffusionを立ち上げたい。
https://github.com/CompVis/stable-diffusion
https://github.com/AUTOMATIC1111/stable-diffusion-webui
今回はwebuiで環境構築してみる。

※追記
20230430時点ではこちらのほうが活発。
https://github.com/vladmandic/automatic
構築は以下
[WSL2でvladmandic/automaticを構築する](https://qiita.com/iwanagat85/items/02b249ea6f1c45a11b5e)

# WSL2の設定
自身のPCのスペックに合わせて調整。
```.wslcomfig
[wsl2]
memory=16GB
swap=128GB
```

# WSL2の再起動
```powershell
wsl --shutdown
```

# pyenvのインストール

```shell
# apt
$ sudo apt update
$ sudo apt upgrade

# depencies
$ sudo apt install \
build-essential \
libffi-dev \
libssl-dev \
zlib1g-dev \
liblzma-dev \
libbz2-dev \
libreadline-dev \
libsqlite3-dev \
libopencv-dev \
tk-dev

# pyenv
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv

# path
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init --path)"' >> ~/.bashrc
$ source ~/.bashrc

# check version
$ pyenv --version
pyenv 2.3.16-1-gb1ee6c93
```

# pythonのインストール
```shell
# python
$ pyenv install 3.10.6
$ pyenv global 3.10.6

# check version
$ python --version
Python 3.10.6
```

# stable diffusion webuiのクローン
```shell
$ git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
$ cd stable-diffusion-webui/
```

# 起動引数の追加
```shell:webui-user.sh
export COMMANDLINE_ARGS="--xformers --opt-channelslast"
```

# stable diffusion webuiのセットアップ
起動手順と同じ。
このときcudaやxformer等の他に必要なファイル群がインストールされる。
起動し終わったら一旦終了。
```shell
$ bash webui.sh
```

# CUDA Toolkitへのパスを設定
```shell
$ echo 'export LD_LIBRARY_PATH="/usr/lib/wsl/lib:$LD_LIBRARY_PATH"' >> ~/.bashrc
$ source ~/.bashrc

# グラフィックカードの確認
$ nvidia-smi -L
GPU 0: NVIDIA GeForce RTX 4090 (UUID: GPU-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)

# CUDAの確認
$ nvidia-smi -q
==============NVSMI LOG==============

Timestamp                                 : 
Driver Version                            : 537.42
CUDA Version                              : 12.2
...
```

# stable diffusion webuiの起動
```shell
$ bash webui.sh
```

# 起動引数(よく使いそうなものだけ)
- --listen
    - `0.0.0.0`で起動してネットワーク越しに応答する
- --port
    - 起動時のポート
- --gradio-auth
    - `username:password`みたいな感じに設定すると認証できる
    - [[Bug]: Error: Connection errored out. #9074](https://github.com/AUTOMATIC1111/stable-diffusion-webui/issues/9074)
- --nowebui
    - uiなしでapiを起動する
- --xformers
    - xformersを使う。画像生成速度の向上と、VRAM使用量の削減
- --reinstall-xformers
    - 起動するたびにxformersを再インストールする。アップデートに便利。使い終わったら削除
- --opt-channelslast
    - 16xx以上のTensorコアを積んでるNvidiaグラボで処理が高速になるかも
- --no-half-vae
    - VAEモデルを16bit floatに切り替えない。黒飛びしすぎる時につけると現象が緩和されるかもしれない
- --medvram
    - VRAMが少ないときはこれ。もっと少なければ`--lowvram`
- --autolaunch
    - 起動時にUIを自動表示

# ファイルの配置
- Textual Inversion
    - ./stable-diffusion-webui/embeddings
- Check Point
    - ./stable-diffusion-webui/models/Stable-diffusion
- LoRAモデル
    - ./stable-diffusion-webui/models/Lora
    - モデルファイルと同名の画像を用意すればサムネイルになる
- VAE
    - ./stable-diffusion-webui/models/VAE
- LyCORIS(LoCo, LoHA)
    - 要Extension([https://github.com/KohakuBlueleaf/a1111-sd-webui-locon](https://github.com/KohakuBlueleaf/a1111-sd-webui-locon))。Loraと同じ場所でも良いけど、分けておいたほうが後々よさそう
    - ./stable-diffusion-webui/models/Lora/LyCORIS

# 注意事項
職場や公共の場所などで試すときは必ずNegativePromptにセンシティブワードを入れておく

# 所感
使うだけなら非常に簡単だった
条件次第で本当にマトモな画像が出てくるから凄い
次はCheckPointやLoRAを作ってみよう