西川和久の不定期コラム

「stable diffusion-webui」を無料のクラウド環境「Google Colab」で爆速で動かす!

イメージ

 2月にMicrosoftがBingチャットを発表してからIT関連に限らずAI系の話題で持ち切りだ。筆者もいろいろ試しており、今回はPromptへキーワードを並べることで絵や写真を出せる「stable diffusion-webui」と、それを簡単/高速に実行できる「Google Colab」をご紹介したい。

ChatGPTやgpt-3.5-turboまでは良かったが……

 筆者が取り上げるまでもなく、世間はChatGPTの話題で持ち切りだ。一言でChatGPTと言ってもいくつかパターンがあり、無料で使えるChatGPTのサイト(もしくはBingチャット)、有料/月額20ドルでChatGPT Plus(最近APIも使えるようになった)、そしてOpen AIにアカウントを作ってgpt-3.5-turboと呼ばれるAPIを使いアプリを作る(従量課金だがアカウントを作ると18ドル/3カ月間有効がもらえる)……など、用途に応じて使い方もさまざまだ。

 筆者はgpt-3.5-turbo使い、Chat UIを持ったWebクライアント、LINE Bot、Googleスプレッドシートの拡張機能でGAS(Google Apps Script)+APIで値を返す、お題から自動的に記事を作りWordpressで公開するcronなどを作って遊んでいる。gpt-3からgpt-3.5-turboになり、速度向上に加え、かかるコストが10分の1となり、結構使っている(ChatGPTの替わりに自作Chat UIを使用)割に18ドル中、まだ3ドルしか減っていない。

 このAPI自体は大規模言語モデルを手軽に使えるものなのだが、大規模言語モデル本体を処理するには強いGPUを搭載したPCでも到底無理な領域。とは言え、処理は先方のサーバーでしているため、手元のマシンは非力のものでも全く問題ない。

 と、ここまでAPIさえ分かればある意味楽勝だったのだが、少し前に、その大規模言語モデルをPCで実現できるFlexGenが発表されたり、もともとグラビア撮影をしていたこともあり、「そう言えばStable Diffusionから出る写真ってどの程度なのだろう?」と、PC側にパワーが必要な“まずい方面”へ踏み込んでしまったのが今回の話となる。

とりあえず手持ちで最強のGPU搭載、M1 Pro@MacBook Pro 14/16GBで試してみた

 Stable DiffusionはPyTorchをベースに構築されたディープラーニングのフレームワークで、画像やビデオのノイズ除去、イメージ生成、サンプリングなどが行なえる。そしてWebブラウザで簡単に扱えるようにしたのがstable diffusion-webuiと言う位置づけだ。

 やはりCPUだけで動かすには無理があり、GPU対応のPyTorchを必要とする。WindowsやLinuxだとCUDA対応版を使うのが一般的だが(AMDも動くことは動く)、M1/M2のGPUに対応したPyTorchもある。

 筆者の場合、大昔ビデオ編集をしていた関係から、当時それなりのdGPU搭載PCを使っていたものの、その仕事が終わってからは、主にテキスト中心と言うこともありiGPUマシンばかり(逆に)好んで使っている。去年作ったdGPUなしのi9-12900搭載機がその最たるものだろう。で、いきなり強いGPUと思っても持ち玉がなく、iGPUながら一番強いM1 Pro搭載のMacBook 14で試すことにした。

 M1 Pro上の環境構築は本原稿の趣旨から外れるので書かないが、macOS上では一般的な手順だ。Stable DiffusionをWebインターフェイスで使えるものは何種類かあり、AUTOMATIC1111版を使用した。

 なお、起動コマンドでwebui.sh(.bat)とwebui-user.sh(.bat)と2種類あるのは、前者は必要に応じてモジュールなどを自動的にインストールするが、後者は何もしないという違いがある。

 さて肝心な速度だが、Modelはstable diffusion-webuiをインストールすると自動的に入っていたv1-5-pruned-emaonlyを使用。Promptは季節柄「park with cherry blossoms, outside cafe」とした。ほかのパラメータは以下の通り(詳細は後述)。

  • Model: v1-5-pruned-emaonly
  • Sampler: DPM++ SDE Karras
  • Size: 512×512
  • Sampling steps: 20
  • CFG Scale: 7
M1 Pro@MacBook 14上で作動するstable diffusion-webui
生成された画像

 これで42秒かかる。Modelをより実写的なのに変え、ポートレートっぽい指示をすると1分半前後……。

 1枚だけなら待てない時間ではないが、Promptを変更して結果見て、また変更……と処理をするにはいささか辛い待ち時間となる。それなら解像度を落として速くして、決まったら解像度を上げれば……と言う話になるが、解像度が変わるとModelから拾う内容が変わるのか、絵も変わるので残念ながらこの手は使えない(正方形、横長、縦長でも変わる)。

 さてPromptの話を少し。Promptは2種類あり、出したいものを記述するのが上のPrompt。下はNegative Promptと言われ、逆に出したくないものを書く。どちらも「,」区切りで英語だ。

 基本書いた順番が優先されるが、()や(())で囲むとより強調される(後者の方が強い)。またoutside cafe:1.4とすれば:から後ろの数値で度合いを調整できる。リアルな写真を出したい時は文頭に、(8k), (RAW photo), (best quality), (photo-realistic:1.4), などを入れているケースが多ようだ。後述するがLoraは<lora:japaneseDollLikeness_v10:0.2>といった感じで<>で囲み、Lora:xxxxxで指定する。もしシステムに入っていない場合は無視される。

 Negative promptは、例えばポートレートだとskin spots, skin blemishes, age spot,などを入れると美肌エフェクト的な指示となる(つまり肌荒れ系は表示しない)。

 なおPromptの内容を具体的に書ければいいのだが、掲載できないキーワードが含まれている関係上(主にNegative prompt)、以降省略している。ご了承いただきたい。

 もう2点、パネルにあるseed: は-1がランダム、-1以外の数字だと画像の特徴などが固定になり、Promptでの違いなどをチェックしやすい。Restore facesはチェックすると顔の部分だけ再演算するのだが、オン/オフどちらがと言い難くケースバイケースとなる。

PNG Info。stable diffusion-webuiで作った画像には各パラメータが入っている。ModelにChilloutMixを使用
Extras。アップサンプリングなどの機能を持つ

 ここまではテキストから画像を生成するtxt2imgの話だったが、タブを見ると、img2img、Extras、PNG Info……と並んでるのが分かる。img2imgは名前の通り画像から画像を作る(話が長くなるので今回は省略)、Extrasはアップサンプリングなどの機能を持つ、PNG Infoはstable diffusion-webuiで作った画像は各パラメータ情報が入っている。これを表示するものだ。

 話戻って、dGPU環境だとどうなるのか気になり、調べたところ、個人サイトになるが、多くのdGPUの結果が載っている“512×768:神里綾華ベンチマーク”を実行すると……。

  • M1 Pro 1.92(it)/383秒(10枚)

という悲惨な結果に。ここの数値を見ると、手の出せる範囲(5万円前後)のGeForce RTX 3060/12GBで3.92(it)/51.8秒(10枚)とある。そんなに速いのか……と、思わずAmazonへ行きかけたものの、Google Colabの存在を思い出し踏み留まった。

Google Colabの使い方

 Google Colabは、一言で説明すると、Python with GPU/TPUをサクッと使えるクラウド環境だ。あれこれインストールする手間もかからない。Googleアカウントさえあれば、制限はあるものの無料で使うこともでき、搭載しているGPUは強力。Googleドライブとの連携もできる。非力なGPU搭載機しか手元にないユーザーにとっては願ったりかなったり的な存在だ。百聞は一見にしかず……ということで画面キャプチャをご覧いただきたい。手順は以下の通り。

  1. Google Colabへログインする
  2. ファイル > 新規ノートブックを開く
  3. ランタイムのタイプを変更でGPUへ
  4. とりあえず !nvidia-smi でランタイムの構成を表示するコードを書き実行(左上の再生ボタン)
  5. GPU使用制限があるので使い終わったら停止ボタン(再生ボタンから変わっている)を押し、停止後、ランタイム > ランタイムを接続解除して削除
  6. 書いたコードなどはGoogleドライブのColab NotebooksにUntitled0.ipynbで入っているのを確認
Google Colabのホーム画面
ファイル→新規ノートブックを開いた状態
ランタイム > ランタイムのタイプを変更でGPUにする
!nvidia-smi でランタイムの構成を調べる。Tesla T4になっている

 次は簡単なベンチマークテストを実行したい。実はこのコード、ChatGPTに教えてもらった(笑)なお、割り当てられるランタイムによっては、メモリ不足で動かないケースがあるためその時は30,000を適当に減らす。

import torch
import time

# Set device to GPU or CPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# Create random matrices
input_size = 30000
a = torch.randn(input_size, input_size).to(device)
b = torch.randn(input_size, input_size).to(device)

# Test performance
start_time = time.time()
c = torch.matmul(a, b)
end_time = time.time()

print("Time taken: {:.2f} seconds".format(end_time - start_time))
ベンチマークテストのコードを書いて実行

 結果は以下の通り。参考までにM1 Pro(GPU)、i9-12900(CPU)の結果も併記しているが、ざっくりM1 Proの10倍速い。これならStable Diffusionの速度にも期待できる。

  • Google Colab 2.79秒(GPU)
  • M1 Pro 26.62秒(GPU)
  • Core i9-12900 66.03秒(CPU)

 いかがだろうか。sshで接続したサーバーっぽい雰囲気で手軽に使えるのがお分かりいただけたと思う。なお、このコードの部分、普通にpythonのコードを書けばそれを実行、頭に!を付けるとlinux上のコマンドを実行する(頭に%だとshellの内部コマンド実行、#はコメント)。

Google Colabでstable diffusion-webuiを起動!

 ここから本題。Google Colabでstable diffusion-webuiを起動するには、先のコード部分へ手元のPCだと手作業で入力するところをそのまま書く感じとなる(以下をコピペでOK)。

# stable diffusion-webui取得
!git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui

# Model: v1-5-pruned-emaonly取得
!curl -Lo /content/stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.ckpt https://huggingface.co/LarryAIDraw/v1-5-pruned-emaonly/resolve/main/v1-5-pruned-emaonly.ckpt

# stable diffusion-webui起動
%cd /content/stable-diffusion-webui
!COMMANDLINE_ARGS="--share --xformers --theme dark --no-half-vae --opt-sub-quad-attention --enable-insecure-extension-access" REQS_FILE="requirements.txt" python launch.py

 GB級のModelファイルをダウンロードするので少し時間がかかるものの、数分待つとconsoleの下の方に

Running on local URL:  http://127.0.0.1:7860
Running on public URL: https://xxxxxxxx.gradio.live

と表示されるので、下の方のURLでアクセスするとWebブラウザ上にstable diffusion-webuiが現れる。あとは好きに試せば良い。

 停止した後、再起動する時は、別のコードで以下を実行する。これは既に必要なファイルが入っているため、単にstable diffusion-webui本体を起動すればOKだからだ。なお、ランタイムを接続解除して削除すると環境全てがなくなっているので、この場合は、1回目の方のコードを実行しなければならない。

%cd /content/stable-diffusion-webui
!python launch.py --xformers --theme dark --no-half-vae --opt-sub-quad-attention --share --enable-insecure-extension-access
Google Colabでスクリプトを入力し起動中
Running on public URL: https://xxxxxxxx.gradio.liveと出るのでそれをクリック
stable diffusion-webuiが起動する
「park with cherry blossoms, outside cafe」を実行したところ

 さて、M1 Proで42秒かかった「park with cherry blossoms, outside cafe」を試したところ13秒! 3.2倍も速い。これだとリアルな写真系で約1分半だった処理が30秒で済むことになる。これで無料とは驚きに値する。

 なおここまで説明した、ランタイムの構成表示、ベンチマークテスト、stable diffusion-webui起動、stable diffusion-webui再起動、そしてGoogleドライブを接続するコードを Colab Notebooksのipynb形式で公開したので、コピペするまでもなく遊ぶことができる。興味のある人はぜひ試して欲しい。開いた時点で自分のGoogleドライブに入っているため編集などしても大丈夫だ。

 Google Colab、無料版と有料版があり、さらに有料版は「Colab Pro」、「Colab Pro+」、「Pay As You Go」の3タイプに分かれている。とは言え、この手の用途の場合、実質対象となるのはColab Proではないだろうか。費用は1,179円/月。違いは公式ページに具体的な内容が書かれておらず、無料版より強いGPU、多くのメモリ、そしてターミナルで使用可能とあるだけ。このあたりはシステム全体のリソースを見て割り振っている関係であまり明確には出来ないのだろう(参考)。Colab全体で使っているGPUは、Tesla T4、V100、A100などが含まれている。ただし、無料版はT4のみ使用可能となる。

 ほかサイトの情報では、Colabは実行時間が最大12時間、Colab Proは最大24時間となっている。加えて90分ルール(何も操作しない状態。Proはなし)やGPU使用制限(GPUの使い過ぎ。Proもあるが無料版より長く使える)もあるようだ。

 特にGPU使用制限に引っかかった場合、「Colabでの使用量上限に達したため、現在 GPU に接続できません」と出てしばらくの間(時間は不明)、GPUが使えなくなる。この原稿を書いている間も何度か出て、動きを確認できず、解除されるまで待ちの状態があった。これはタイミングが悪いと結構ストレスになる。

stable diffusion-webuiでグラビアっぽい写真に挑戦!

 ここから先は筆者が数日試した内容からなので、もっとほかに良い方法もあるかと思われるが結果発表だ。まずModelだが、リアルな写真系となると「ChilloutMix」一択。ここからダウンロードできるが、civitaiのアカウントが必要になる。ただし、商用利用は不可、掲載時にChilloutMix使用と明記しなければならない。

 Colabで使うには、いったんGoogleドライブへファイルをアップロードし(例えば/models/Stable-diffusion/)、次にColabからGoogleドライブを接続する。この時、/content/drive/MyDrive/以下がGoogleドライブ側の/となる。

from google.colab import drive
drive.mount('/content/drive')

 実行するとパネルが出るので、接続するGoogleドライブのアカウントを選択、権限を与えるで許可する。これでGoogleドライブとColabのファイルシステムがつながったので、以下でファイルをコピーする。コードの場所は# Model: v1-5-pruned-emaonly取得のところに入れれば良い。なお、v1-5-pruned-emaonly側の!cpは使わないので#でコメントアウトする。

!cp /content/drive/MyDrive/models/Stable-diffusion/chilloutmix_NiPrunedFp32Fix.safetensors /content/stable-diffusion-webui/models/Stable-diffusion/

 次にLora(Low-Rank Adaptationの略)と呼ばれる、使用Modelに特徴を与えるものを追加する。筆者が好んで使っているのは、japaneseDollLikeness_v10、koreanDollLikeness_v10(V15)といったところ。名前からどんな感じかは想像つくだろう(笑)。

 先のColabの環境へ入れるには、該当ファイルをダウンロード、Googleドライブにアップロードし、それをColabへコピーすることになる。具体的には

!cp /content/drive/MyDrive/models/Lora/*.* /content/stable-diffusion-webui/models/Lora/

こんな感じだ。これは先のModel取得の下へ入れれば良い。ほかにもVAE(Variational AutoEncoderの略)やembeddingsのulzzang-6500-v1.1.binなどもあるので、興味のある人は調べて欲しい。ModelやLoraなど多くは、先のcivitaiか、Hugging Faceにあるので検索するのが近道だ。

桜の花バック。この1枚は普通の写真に見える人が多いのではないだろうか。なかなか良くできている(courtesy of Civitai)
カフェで。引くと顔のデータ量が足らなくなり、少し人形っぽくなるのが残念なところ(courtesy of Civitai)
夏っぽいので。アイキャッチを見ると左右から丸レフ2枚当てているが、この炎天下だと、女の子の眼が開かず、なかなかこんな感じには撮れない。更にこのアングルはカメラの水没が危うい(courtesy of Civitai)
ライブ写真。ちょっと肌がCGっぽいものの照明も含め雰囲気はよく出ている。これではないが、ほかに出てきた写真で、ステージ上で寝転がって撮らないと無理的なアングルもあった(courtesy of Civitai)

 さて、前置きが長くなってしまったが、これらを駆使して作った画像をシーンを分けて4枚並べてみた。Modelは全てChilloutMix。SamplerはDPM++ SDE Karras、サイズは768×512、Sampling steps: 20~30、CFG Scale: 8~14。後者2つは数値が大きいほどPromptに忠実になるが、大きくすると時間がかかる上、できた画像も妙なことになっているケースが多く、この辺りが無難だろうか。

 また768×512ドットだと掲載サイズとしては小さいため、Extrasで2.5倍(1,920×1,280ドット)へアップサンプリング(R-ESRGAN 4x+)している。

 txt2imgの項目に「Hires. fix」のチェックボックスがあり、これをチェックすると、アップサンプリングの項目が現れ、ここでも出来るのだが、微妙に画像の内容が変わるのと時間がかかるため、今回はExtras側を使用した。

 いかがだろうか? 「CGっぽい」っと思う人や「意外にリアル」っと思う人……人それぞれといった感じか。

 グラビアの場合は、日中だとレフを当てた上に、後から画像処理で肌を(ツルツルに)修正するのがほとんど。ある意味、似たような感じになってることが多い。特に桜バックと海辺の2点は、何も言わずに掲載すると気付かない人が結構いるのではないだろうか。ちょっと驚くほどの仕上がり具合だ。

 いずれにしてもこれは2023年現在の技術。CGっぽいのはおそらく数年内に解決するだろう。凄い時代になったものだと感心すると同時に、固有の顔(全体のルックスも含む)や衣装などを学習させれば、(権利関係がクリアになれば)AIグラビアアイドルやファッション誌で使えるのでは!?っと思ってしまった。企業の広告も行けそうだ。

 ロケやスタジオは不要(もちろんカメラマンなど人も含む)、背景や衣装などは一発で変更でき、おまけにスキャンダルが発生しないので安心だ。海辺の写真はあのアングルだとカメラが海水に浸かる可能性が高いので撮りにくく、ライブ撮影だと、絶対撮れないアングルも表現できる。関係者としてはちょっと複雑な気分だったりする。

 最後にGoogle Colabでstable diffusion-webuiを使っていて気付いた点は以下の通り(この2点に関してはM1 Proでは発生したことがない)。

  1. プログレスバーが出ない。Generateボタンが押せなくなる
  2. Batch Count/Sizeで1度に作る枚数を増やした時、終了後、画像表示せず加えて無反応になる

1)に関してはGitHubでもissuesとしてあがっており、どうやら起動したランタイム側の問題らしい。ランタイムを切断して再度起動すると直ったりする。この時、せっかく作った画像なのに……となるが、実は左側にあるファイルアイコンから/stable-diffusion-webui/outputs/txt2img-images/日付名のフォルダに画像が入っているので、ランタイムを切断する前なら個別にダウンロードすれば何とかなる。

 Generateボタンが押せなくなるのは、上記に加え何らかのエラーで止まっている(consoleを見る)。この場合はWebブラウザをリロードすると直るケースが多い。

 2)に関しては、Web UIを担当しているのがgradioなのだが、どうも無料版環境での仕様らしく、一度に多めのデータ(画像)を送信できないようだ。それにも関わらず送信完了を待っているのでロックする。これはgradioの替わりにngrokを使うなどすればいいが、長くなるので興味のある人は調べて欲しい。

 記事の最終確認でもう1度公開したコードを動かそうとしたところ、一晩経っても「Colabでの使用量上限に達したため、現在GPUに接続できません」が出るので、仕方なくProを契約した。Proにした場合のメリットがここにあるので、合わせてご覧頂きたい。

 ランタイムはGPUクラスに“標準”と“プレミアム”が選べるため、それぞれで“512×768:神里綾華ベンチマーク”を実行したところ……。

  • M1 Pro(GPU) 1.92(it)/383秒(10枚)
  • Colab (Pro)/標準(T4) 2.99(it)/66秒(10枚)
  • Colab Pro/プレミアム(A100) 6.24(it)/32秒(10枚)

とほぼ倍速! また無料版は先に書いたようにgradioの関係で1度に9枚(768×512)以上だと画面に画像が出なくなるが、Proではこの現象は発生せず良いことずくしだ。これで1,179円/月なら文句なし。


 以上、stable diffusion-webuiをGoogle Colabで動かす方法をご紹介した。無料版でも強くないGPU搭載機で気軽に楽しめるのがお分かり頂けたかと思う。頻度が高くProにしても月額千円程度ならお買い得と言える。

 筆者的な問題は、Proのまま行くか、はたまたいつでも即使えるよう、Core i9-12900へGeForce RTX 3060/12GB程度のdGPUを付けるか(ただしケースがコンパクトなDeskMeet)……悩ましい問題だったりする(笑)。