ColabとPaperspce Gradientはどちらもjupyter notebookを用いるが、細かい挙動に違いがある。
どちらも&を用いたバックグラウンドプロセスの実行はサポートしていないという点は共通している。これを回避する為のバッドノウハウとして、subprocess.Popenを用いるというものがある。
from subprocess import PopenPopen(["syncthing"])Popen(["filebrowser", "-p", "18080"])
このような記述を用いることで、notebookでも複数のプロセスをバックグラウンドで起動することが可能になる。
しかしautomatic1111のlaunch.pyを起動することについては、Paperspaceの場合は問題なく行えるがColabではうまく行かなかった。(後述する理由によりColabの場合に限り無理にPopenから実行させるメリットがない為、原因は調べていない)
もうひとつ重要なのが、「セル内の全ての行が実行(▶️)し終わった後の挙動」である。
この時、Paperspaceは特に何も行わない。しかし、Colabは「そのセル内で実行していたすべてのプロセスにKeyboardInturrupt(Ctrl+C)を送る」という挙動をする。その為、せっかくバックグラウンドで実行していたプロセスは全て終了してしまうのだ。故にColabでは一旦バックグラウンドで必要なプロセスを実行しつつ他のセルで色々なことをする、ということは出来ない。自由度はPaperspaceの方がかなり高い。
故に、Paperspaceは以下のようなセルを作ると使いやすい。セルの終了後も他のセルで色々な処理を書いたりシェル的に使ったりも出来る。
%cd /stable-diffusion-webui/
Popen(["/usr/bin/syncthing"], stdout=DEVNULL, stderr=DEVNULL)
Popen(["filebrowser", "-p", "18080"], stdout=DEVNULL, stderr=DEVNULL)
Popen(["nginx"], stdout=DEVNULL, stderr=DEVNULL)
Popen(["python", "launch.py", "--medvram", "--no-half-vae"])
対してColabの場合は以下のような書き方をする。どうせセルが終われば全プロセスがInterruptされてしまうのでlaunch.pyをBGに回す意味がないのだ。
%cd /content/stable-diffusion-webui/
Popen(["/usr/bin/syncthing"], stdout=DEVNULL, stderr=DEVNULL)
Popen(["filebrowser", "-p", "18080"], stdout=DEVNULL, stderr=DEVNULL)
Popen(["nginx"], stdout=DEVNULL, stderr=DEVNULL)
! COMMANDLINE_ARGS="--medvram --no-half-vae" REQS_FILE="requirements.txt" python launch.py