本記事では、Windows上で動作するStable Diffusion web UIをVSCodeでデバッグする方法を紹介します。
前提条件
この手順では、Stable Diffusion web UIが既にインストールされており、webui-user.bat
で動作済みであること、VSCodeでvenv環境を利用できることを前提とします。
- Stable Diffusion web UIのインストール方法はこちらが参考になります。
- 初期設定では
このシステムではスクリプトの実行が無効になっているため、ファイル ~ を読み込むことができません
といったエラーが発生しVSCodeでvenv環境を利用できない可能性がありますが、こちらを参考に解決できます。リンク先の解決法その2を実行済みであるとします。
上記のインストール状態まで実行してStable Diffusion web UIのフォルダをVSCodeで立ち上げると、以下のようにvenvの仮想環境が立ち上がっています。
batファイルに変更がない場合
初期状態からwebui.bat
やwebui-user.bat
などの起動時に読み込むバッチファイルを特に変更していない場合、以下の手順でブレークポイントを設定できます。
-
launch.json
ファイルを作成します。
a. VSCodeの左側にある実行とデバッグボタンをクリックします。
b. 実行とデバッグペインでlaunch.jsonファイルを作成しますをクリックします。
c. デバッガーの選択でPython
を選択します。
d. デバッグ構成を選択するでPythonファイル
を選択します。 -
configurations
の下のリストの内容を一部編集します。
a.name
: デバッグ用の任意の名前を設定します。ここではdebug_webui
とします。
b.program
:launch.py
に変更します。
これだけでOKです。結果的にlaunch.jsonは以下のようになります。
{
"version": "0.2.0",
"configurations": [
{
"name": "debug_webui",
"type": "python",
"request": "launch",
"program": "launch.py",
"console": "integratedTerminal",
"justMyCode": true,
}
],
}
試しに、launch.pyのprepare_environment()関数の中でブレークポイントを設定してみます。
デバッグを実行するには、左側ペインの実行とデバッグボタンを押し、launch.json
で設定した名前で登録されている項目を選択して▷ボタンを押します。
ブレークポイントで動作が止まっています。カーソルを合わせれば途中の変数に何が入っているかを確認することもできます。
batファイルを変更している場合
webui.bat
やwebui-user.bat
を変更し環境変数を設定しているときは、少し修正が必要です。
仮にwebui-user.bat
が以下のような状態であると仮定します。
@echo off
set PYTHON=
set GIT=
set VENV_DIR=
set COMMANDLINE_ARGS="--medvram --opt-split-attention"
call webui.bat
COMMANDLINE_ARGS
の行がデフォルト状態から変わっています。
この場合、バッチファイルで環境変数を設定しているので、launch.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
の設定が編集されていることを確認してください。
デバッグの実行方法は先と同じです。
実行すると起動時にスクリプトの画面出力から環境変数が設定されていることが確認できます。
webui.bat
とwebui-user.bat
で他に環境変数を設定している場合は、それぞれenv
に追加する必要があります。
スクリプト内での環境変数の読み込みはlaunch.py
スクリプトでos.environ.get()
関数で行っているため確認してみてもいいでしょう。