Stable Diffusion web UIにブレークポイントを設定してデバッグする


本記事では、Windows上で動作する**Stable Diffusion web UI**をVSCodeでデバッグする方法を紹介します。

## 前提条件
この手順では、**Stable Diffusion web UI**が既にインストールされており、`webui-user.bat`で動作済みであること、VSCodeでvenv環境を利用できることを前提とします。

- **Stable Diffusion web UI**のインストール方法は[こちら](https://www.kkaneko.jp/ai/win/stablediffusion.html)が参考になります。
- 初期設定では`このシステムではスクリプトの実行が無効になっているため、ファイル ～ を読み込むことができません`といったエラーが発生しVSCodeでvenv環境を利用できない可能性がありますが、[こちら](https://zenn.dev/nekocodex/articles/eb3403961ad9b966ff6e)を参考に解決できます。リンク先の解決法その2を実行済みであるとします。

上記のインストール状態まで実行して**Stable Diffusion web UI**のフォルダをVSCodeで立ち上げると、以下のようにvenvの仮想環境が立ち上がっています。

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315871/96bfd086-b65c-f4f6-42d9-e90662bc58ee.jpeg)

## batファイルに変更がない場合

初期状態から`webui.bat`や`webui-user.bat`などの起動時に読み込むバッチファイルを特に変更していない場合、以下の手順でブレークポイントを設定できます。

1. `launch.json`ファイルを作成します。
    a. VSCodeの左側にある**実行とデバッグ**ボタンをクリックします。
    b. 実行とデバッグペインで**launch.jsonファイルを作成します**をクリックします。
    c. **デバッガーの選択**で`Python`を選択します。
    d. **デバッグ構成を選択する**で`Pythonファイル`を選択します。
    
    ここまで実行すると、以下のようなファイルができます。
        ![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315871/98539f7f-c995-ae99-716b-764050716b9f.jpeg)


2. `configurations`の下のリストの内容を一部編集します。
    a. `name`: デバッグ用の任意の名前を設定します。ここでは`debug_webui`とします。    
    b. `program`:`launch.py`に変更します。
    
これだけでOKです。結果的にlaunch.jsonは以下のようになります。

```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "debug_webui",
            "type": "python",
            "request": "launch",
            "program": "launch.py",
            "console": "integratedTerminal",
            "justMyCode": true,
        }
    ],
}
```

試しに、launch.pyのprepare_environment()関数の中でブレークポイントを設定してみます。

![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315871/4656e227-f904-4f78-23c1-8ba5866b5810.jpeg)

デバッグを実行するには、左側ペインの**実行とデバッグ**ボタンを押し、`launch.json`で設定した名前で登録されている項目を選択して▷ボタンを押します。

![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315871/967f9fd9-7608-0330-2100-9bba434821ae.jpeg)
ブレークポイントで動作が止まっています。カーソルを合わせれば途中の変数に何が入っているかを確認することもできます。


## batファイルを変更している場合

`webui.bat`や`webui-user.bat` を変更し環境変数を設定しているときは、少し修正が必要です。

仮に`webui-user.bat`が以下のような状態であると仮定します。

```bat
@echo off

set PYTHON=
set GIT=
set VENV_DIR=
set COMMANDLINE_ARGS="--medvram --opt-split-attention"

call webui.bat
```
`COMMANDLINE_ARGS`の行がデフォルト状態から変わっています。

この場合、バッチファイルで環境変数を設定しているので、`launch.json`でも同様に環境変数を設定してやる必要があります。次のように編集しましょう。

```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "debug_webui",
            "type": "python",
            "request": "launch",
            "program": "launch.py",
            "console": "integratedTerminal",
            "justMyCode": true,
            "env":{
                "COMMANDLINE_ARGS":"--medvram --opt-split-attention"
            }
        }
    ],
}
```

`env`の設定が編集されていることを確認してください。

デバッグの実行方法は先と同じです。
実行すると起動時にスクリプトの画面出力から環境変数が設定されていることが確認できます。

![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315871/ddf9b974-e047-ae7b-9fa4-ea1e99fd9398.jpeg)

`webui.bat`と`webui-user.bat`で他に環境変数を設定している場合は、それぞれ`env`に追加する必要があります。
スクリプト内での環境変数の読み込みは`launch.py`スクリプトで`os.environ.get()`関数で行っているため確認してみてもいいでしょう。