見出し画像

SD AUTOMATIC1111 webui をマルチGPUで動かす利点─RTX4090が挿せないならRTX3060を2枚挿せばいいじゃない─

※ この記事は2023/01時点で掲載していた情報ですが、某所で公開できなくなりそうなので、こちらに加筆移転しております。また2023/07現在のバージョンでも俺が実際に使っている機能です

まいどお馴染み流浪の画像生成AIブログ民、カガミカミ水鏡です。

Stable Diffusionで一番利用者が多い実装 Stable Diffusion web UI AUTOMATIC1111 (以下automatic1111) は、実はGPU複数枚構成で使うことができ、その構成で実際に私が利用しているんですがスゲー便利ですよという話です。環境はWindows前提です。

最大のポイントは2枚以上刺しても1つの処理を高速化できないが、2つのWebUIを同時並行で走らせることができるので生成速度向上・用途の分割などユーティリティ向上に繋がるということです。どなたかの御役にたてれば幸いです。

【注意】この記事は、PCハードウェア・GPU周りに関するある程度のエラーにも自力対処ができる知識を保有している方々向けになります。

【注意】automatic1111に限らずジェネレーティブAI系は技術進歩と陳腐化が早く1ヶ月スパンで訪れるため、この記事の情報(2023年7月時点)がすでに古くなっている可能性があります。以下の手法で運用できない場合は私に質問せず、githubやredditから最新の情報をご確認ください。

なぜ俺は3060を2枚挿しすることになったのか

2021年1月、GPUが高騰するまえに3060Ti 8GBを搭載するゲーミングPCを購入してました。で、画像生成界隈が賑わった2022年10月ごろ、3060Ti とautomatic1111でアホのようにHENTAI画像を量産していましたが、やはり力不足を感じまして。同時期にAI術師の方々がこぞってRTX3090ないしRTX4090を入手するさまをみて、私自身も心がゆらぎました。

※ そもそも10万円くらいポンと出せるお金がない

という感じで指をセルフフェラして見てたのですが、ある日ふらりと寄った中古PC店で発見したのですよ。3060 VRAM12GB 非LHR版を……。このとき、AUTOMATIC1111などのマルチGPU対応状況を調べ、可能ならばGPU2枚挿しをするという作戦を思いつきました。github issueあたりを見て、どうやら対応できるっぽいというのを突き止めたので購入に至りました。いいっすよ!

2枚運用の魅力

ちなみに、1つのWebUI上で2枚のGPUを使って高速化することはできません。代わりに、WebUIは複数起動ができるため、それぞれに利用するGPUを割り当てることで、2枚=2画面同時に利用ができるようになります。これが実現できると、どうなるかというと……

同時に複数のプロンプトや設定で動かせる

GPU番号:GPU0(1枚目のGPUのこと。私の環境ではRTX3060Ti 8GB)ではマイクロビキニの爆乳黒ギャルを生成しつつ、GPU1(私の環境ではRTX3060 12GB)ではスクール水着の金髪ロリを生成することができます。夢が広がりますね(淫夢)!

……という用途で使うことは実はあまりなく、GPU1では好きな画像を生成させつつ、生成速度の早いGPU0でプロンプト研究を行う、ということが多かったりします。まあ用途の目的はドスケベなのですが。

また、GPU1の潤沢なVRAMを活かし、片方でdreamboothなどVRAMを要求される機能を回しながらGPU0でシコシコ画像を生成することも可能です。……いや、そもそも学習の目的もエロCG作りたいが為でした。

このように、2枚運用は速度というよりも「利便性」が広がります。

※ 「可能性」でないところがポイント

GPU負担のあるPCゲームを遊びながらSDを回せる

ゲームタイトルによりますが、ゲームは基本的にGPU0を優先して使うため、GPU1で画像を作りながら3Dゲームを遊ぶという芸当も可能です。

ただし対戦型ゲームには向きません。なにげにSDはCPU負荷・PC側メモリへの負荷もかかるため、遅延が影響するセンシティブなタイトルを遊ぶのは他のプレイヤーに迷惑がかかるため辞めましょう。

だから私はGPU1で学習させながらnintendo switchでsplatoonを遊ぶことが多いです。今までの話は何だったのか

3060系は電力対効率が高い

afterburnerなどGPUの電力やクロックをコントロールできるソフトがありまして、それで電力消費を抑制することで、性能と引き換えに省電力性能が手に入ります。とりわけ3060系はワッパ(電力対効率)が高いため、より低コストで運用することができます。

私の環境だとRTX3060Tiは200W、RTX3060は170Wが最大消費電力。でツール(両方ともPalit社なので、純正のソフトthunder master使ってます)で下げられる下限が60%。そうなると合計最大220Wで運用可能。

なに、RTX3090は350Wなのでワッパで負けているだって? 覚えておきたまえ、ときに真実は己を殺す刃になりうるとな……(まあ、片側だけ動かせるという利点を考えると、それはそれで電力効率が高いとも言えます)。

反論:RTX3090以上モデルの魅力

とはいえ、私が2枚挿しの道を選んだのは、すでに1枚持っていたという環境的事情と経済的事情が重なったものです。RTX4090も含め、やはり上位モデルも欲しかったと思うケースも多いです。まあつまり……予算の余裕があれば、この辺買うほうが良いですよという話です。

チカラisパワー

単純に早いので生成速度的に有利です。確か3090は3060Tiの2倍以上の速度で生成できたはずです。githubにて紹介されてた

もっとも、そう思っていたのは2022年11月前半の話で、現在は進化しつづけるモデルやDPM++など新しいsolverの台頭など、技術的進歩により生成速度が爆上がりしたので、3060Tiでもあまり困ってない……というか生成速度が早すぎて選ぶ方が大変なんですよね……cherry pick大変じゃないすか皆さん……?

高解像度画像の生成、loraなどの学習

とはいえ、VRAM 24GBという圧倒的スペックは、画像生成AIにおけるあらゆる「可能性」を内包しています。できることの範囲が違う。超高解像度の生成がカンタンにできる(outpaintingなしに!)、学習もVRAM多い方が有利です。もちろんモデル自作などは最低限必須というレベルでしょう(そちらはAxxxとかが必要になりそうですけど……)。

2枚挿しは利用者の自作PC力が問われる

パソコンに詳しくない……特にPCを自作したことがない・パーツ交換などをやったことがない、という場合は、GPU1枚での運用を強く推奨します。一番のオススメは、RTX3090以上を積んでるゲーミングPCを買うことです。実際AI界隈の知り合いがそうしてました。ノーリスク。

なのでこの記事は、ある程度のエラーにも自力対処ができるレベルの方々向けになります。私自身はそこそこ自作の経験があり、特にGPUに関しては1080tiを焼いた経験がある程度には知識を持っております(?)。

automatic1111を複数動かすための設定

さて、実際に動かすための設定をご紹介します。

設定方法は単純で、いつも起動時に使っている webui-user.bat を複製し、それぞれGPUナンバーとサーバのポート番号を指定するコマンドラインを追加し、起動するだけです。

webui-user.bat を2つ複製する

webui-user.bat を2個、同じフォルダに複製してください。

それぞれの名前の後ろに、ポート番号を付けることをオススメします。例えば……

webui-user-123.bat

webui-user-456.bat

※ 元のwebui-user.batは今後使用しません。git pullの際に更新される可能性もあり、編集していることが原因で簡単にアップデートできなかったりすることもあるので、そのままの方が良いでしょう。

それぞれのwebui-user.bat を編集する

片方のwebui-user-123.bat で「set COMMANDLINE_ARGS」の行に、以下のように編集。portのあとに、他で使っているコマンドラインを付けると良いです。例ではxformersを有効にしています。

webui-user123.batでの書き方

set COMMANDLINE_ARGS=--device-id 0 --listen --port 123 --xformers


もう片方はこんな感じ。 最大のキモは、前述のGPU番号を --device-id に割り当てるということ。

webui-user456.batでの書き方

set COMMANDLINE_ARGS=--device-id 1 --listen --port 456 --deepdanbooru

あとはそれぞれのwebui-user.bat を起動するだけです。あとはコマンドラインに表示されたURLにアクセスするだけ! 一応、片方の起動が終わった段階でもう片方を起動すると良いです。

※ portとは、WebUIを起動する上で必要なネットワークポート番号です。番号の選択基準は、まあ100未満と443以外を選ぶようにしてください

おすすめ:webui-user.bat だけでなく、config.json も分割する

さらに1歩進んで、GPUごとに設定/settingsのパラメータを別々に変更できるようにしましょう。config.json を同じように複製し、ui-settings-fileにそれぞれのconfigファイルを割り当てます。

webui-user123.batでの書き方

set COMMANDLINE_ARGS=--device-id 0 --ui-settings-file config123.json --xformers --deepdanbooru --listen --port 123

これは必須ではないですが強くオススメします。設定が別々に編集できる、というより、2画面から出力される画像データを、それぞれ別のフォルダに割り当てられる という利点があるためです。……想像してみてごらん。1つのフォルダにマイクロビキニの爆乳黒ギャルとスクール水着の金髪ロリが混在するフォルダの中身(画像10000枚)を……。

あとはそれぞれのwebui-user.batから起動、黒画面に表示されたURLを開くだけです。URLの後ろに、先程コマンドラインで指定したポート番号が出ているかも確認しておきましょう。特に変わったエラーがコマンドラインコンソール(黒い画面)に出ないことを確認しつつ、同時にプロンプトを回せれば成功!

※ 片方のwebui-user.bat を起動し、ブラウザの表示が確認できたら、もう片方を起動する方が良いでしょう。アップデート後など、pythonのlibraryアップデートが入ったりすることがあるので、念のためです

他にもコマンドライン編集の詳細は以下を御覧ください。環境に合わせた高速化設定などありますので、オススメです!

https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Command-Line-Arguments-and-Settings

おわりに

という訳で、あまり一般的でない自分の環境を公開してみました。

……なお、私はこの記事を書いた数カ月後にはRTX A4000を調達したという……


この記事が気に入ったらサポートをしてみませんか?