DockerでStableDiffusionを複数起動する方法[Webサービス開発記-2]
ちょっとエッチな画像も生成できるStableDiffusionを公開しようと思っていて、その記録。
今回はSDを複数起動する方法なんだけど、結構ポイントがあるのでメモ。
もっと生成したいから複数で起動したい
Stable Diffusionで、いい感じのプロンプトができたら、
一気に100枚生成する人が多いかと思います。
また、大量生成中にほかのプロンプトも並行してテストしたいという時がありますよね。
単純に二つ用意したらデッドロック的なことが起きる
単純にフォルダをstable-diffusion-webui-2みたいなのを作って同時に起動したらいいだけでは?と思ってやってみたところ、デッドロック的なことが起きて、両方とも動かなくなりました。理由はわからないけど、とにかくこうなる時があって非効率。
Dockerで解決した
もしかしたらDockerでできるんじゃない?
と思って調べてみたらやっぱりあった。
下記でとりあえず入る。
私の場合はエラーが発生したので下記で対処したら問題なく解決した。
この2つの記事でとりあえず動かせました。
ここから複数起動の肝
ポートの変更
まずポート。
衝突するのでdocker-compose.ymlのポートを変更する必要がある。
- "${WEBUI_PORT:-7860}:7860"
↓
- "${WEBUI_PORT:-7861}:7860"
コンテナ名?の変更
これをしておかないと複数立ち上げた時に同じプロセスを見るせいか
2つで1つの頭脳を共有している感じになる。
プログレスバーが同時に動くようになるのでこれはダメなんだと思う。
autoをauto2とかauto3にする
docker-compose.ymlに書かれているservice.autoって部分を重複しないようにすればいい。
省略...
services:
省略...
auto: &automatic ← ここと
<<: *base_service
profiles: ["auto"] ← ここを
↓
auto2: &automatic ← これに
<<: *base_service
profiles: ["auto2"] ← 変えましょう
省略...
コマンドは下記で実行してください
docker compose --profile auto up --build ←これではなく
↓
docker compose --profile auto2 up --build ← これ!
そうすると
こんなかんじで複数起動ができました。
割り込み作業ができるのがいい
Interruptボタンて、割り込みというより中断なのよね。大量生成しているときこれが結構しんどい。
遅くはなるんだけど、気になるプロンプトを割り込んで試せるのが良い。
割り込みというか同時に動かすので遅くなるけど大量生成の妨げにならないのがいい。
2つの方法のうち失敗した方法
既にwindowsに直接導入したstable diffusion webuiにdockerのファイルを用意して動かすこともできるみたいだけど、
私の場合は意味不明なエラーが出すぎてダメでした。
今回説明した内容はDocker専用のSD webuiで実現したものです。
これでやったほうが断然楽。
次回以降
Laravelで取得する
プロンプトをフォームから投げる
レスポンスの画像をとりあえず表示する
Jobに登録して動かしてみる→jobに関する備忘録
大量にJobを登録して漏れなく画像を取得できるか