オタSEの日常(仮)

基本的に日記帳。概ねゲーム関連の垂れ流し

おぼえがき(改訂版):Google Colab + Google DriveでStable Diffusion(+α)動かすやつとか色々備忘録

※自分用にしても使いにくかったので完全(?)版として起こし直し。古いのは消します。

課金しよう(Google Colab)

身も蓋もないけど。
ColabはPro以上に。nVidia A100(普通に買ったら100万以上する)使えるし、無料枠は色々と不便すぎて話にならないので。
ProとPro+に関しては大規模な生成裏で流しっぱなしにしたい、とかでなければPro+である必要はない。
ただコンピューティングユニットに関しては丸一日起動していじってる、とかやってると平気で100とか持っていかれるので見越してPro+にしとくか、はあり。
※値段自体は付与されるユニット数と同数のユニットを購入するのと同額なので
詳しくは下記画像見て(現時点のもの)

従量課金なので結構かからないか?って思うかもしれないけど、SDをストレスなく動かせる性能のPCを用意するにも、ゴリゴリ動かそうとすると電気代も結構持っていかれるのでさほど高くはない(はず)。
あとAI用途のマシンはかなり酷使するから消耗も激しくて常用マシンにしにくいってのもある。

しばらく触らんな、ってなったら無料プランに戻しておけばいいしね。

Colab以外のクラウドサービス使ってもいいけど、単純に情報が多くてわかりやすくて楽って部分は多大なメリットだと思う。
そこらは自分の知識とか料金とか用途とか頻度とかと相談して決めよう。

課金しよう(Google Drive)

Colabは仮想環境なので接続解除するとすべての環境が失われる。
つまり使うたびにインストールからしないといけない。クソめんどいし時間もかかるしその間の負荷でも金かかるのでもったいない。
ColabはDriveに接続して使うことができるので、Drive内にインストールしてしまえばいちいち消える事もなくなる。
ただモデルなども含める結構なサイズになるため、無課金だとサイズが足りなくなる。(他に使ってなくて最低限程度とかなら足りるかも)
Driveは年間2500程度(月200円ちょい)で100GBまで容量増やせるのでとっとと課金してしまう方が楽。
少ない容量でColabやりとりしたり仮想環境に一部入れたりしてるとそのやりとりだけで月200円分のユニットなんて消費しちゃうのでは?説もある。

Colabのセットアップ

Colab開いて新規ノートブック(=仮想環境)作成する。
メニューバーの「ランタイム」から「ランタイムのタイプを変更」。
ハードウェアアクセラレータをGPUに変更、GPUクラスをプレミアムに変更。
これでA100(かV100)が使えるようになる。遅くても課金減らしたい場合はプレミアムにしなければ良い。
逆にGPUスペック低くてもメモリが欲しい使い方する場合はハイメモリを選ぶ。
どちらも欲しいならプレミアム+ハイメモリにすればいい。

事前準備

GoogleDriveに適当なフォルダを掘っておく。
Driveを接続すると「MyDrive」として認識される。
ここでは
/MyDrive/Colab
/MyDrive/Colab_Models
/MyDrive/Colab_Models/embeddings
/MyDrive/Colab_Models/Lora
を作成して使っていくとする。(任意に変更してOK)

コードの登録と実行

「+コード」ボタン押してセルを追加し、そこに記述する。
実行はShift+Enterもしくはセル左にある再生ボタンみたいなものをクリック。
なんらかの理由で停止する場合は同ボタン(停止ボタンに変わってる)をクリック。

# 毎回実行(ドライブの接続)
from google.colab import drive
drive.mount('/content/drive', force_remount=True)

Google Driveを接続する。
毎度認証のポップアップ出てくるのがめんどいが、使用するたびに実行する必要あり。

# 環境構築時用git clone
%cd /content/drive/MyDrive/Colab/
!git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui

AUTOMATIC1111版のインストール。初回のみ実施する。

# ControlNet環境構築用git clone
%cd /content/drive/MyDrive/Colab/
!git clone https://github.com/Mikubill/sd-webui-controlnet /content/drive/MyDrive/Colab/stable-diffusion-webui/extensions/sd-webui-controlnet

ControlNetのインストール。初回のみ実施。ControlNetを使わないなら不要。

# Merge Block Weighted環境構築用git clone
%cd /content/drive/MyDrive/Colab/
!git clone https://github.com/bbc-mc/sdweb-merge-block-weighted-gui /content/drive/MyDrive/Colab/stable-diffusion-webui/extensions/sdweb-merge-block-weighted-gui

Merge Block Weightedのインストール。初回のみ実施。使わないなら不要。
ckpt→safetensorの変換に使うので入れといた方が無難。

※追記(2023/03/07)
CheckPointManagerでもできるから別にいらんかもしれん

# 実行時用最新化(本体)
%cd /content/drive/MyDrive/Colab/stable-diffusion-webui
!git pull https://github.com/AUTOMATIC1111/stable-diffusion-webui

本体の更新用スクリプト。バージョン上がった時などに実施するが、事前に情報収集はしておくこと。
基本的に普段は触る必要なし。

# 実行時用最新化(ControlNet)
%cd /content/drive/MyDrive/Colab/stable-diffusion-webui/extensions/sd-webui-controlnet
!git pull https://github.com/Mikubill/sd-webui-controlnet
# 実行時用最新化(Merge)
%cd /content/drive/MyDrive/Colab/stable-diffusion-webui/extensions/sdweb-merge-block-weighted-gui
!git pull https://github.com/bbc-mc/sdweb-merge-block-weighted-gui

プラグイン更新用のスクリプト。どちらも必要な時に実施。

※初回構築時は以下を実行する前にモデルなどの必要なデータ投入を行うこと

# WebUI起動
%cd /content/drive/MyDrive/Colab/stable-diffusion-webui
!COMMANDLINE_ARGS="--share --deepdanbooru --gradio-debug --gradio-auth USER:PASS --ckpt-dir /content/drive/MyDrive/Colab_Models --xformers --lowram --disable-console-progressbars --embeddings-dir /content/drive/MyDrive/Colab_Models/embeddings --lora-dir /content/drive/MyDrive/Colab_Models/Lora" REQS_FILE="requirements.txt" python launch.py

起動用。一回セットアップしたら以降普段は最初のドライブ接続とこれだけ叩けば動く。
以前の記事でも書いた通り、gradio-authのところのWebUIのログイン認証用ユーザ・パスワードなので、USER:PASSは必要に応じて書き換えること。
※起動したWebUIは公開されてるので、URLクロールされて乗っ取られる(≒無駄金取られる)可能性がある

ランタイム接続後の初回は4~5分ぐらいかかる。以降停止して再起動する場合は1分かからない程度。
起動に成功すると以下のログが出る

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

gradio.liveの方のURLを叩けばログイン画面が開くので動かすだけ。

※追記(2023/03/07)

    • xformersついてるけどGPUがA100だと生成時有効にならない

現状では対応するものがないっぽい。自分でビルドしておけばいけるっぽいけどColab上でのやり方がよくわからん

ただgradio公式ではColabでセルにエラーとか出したいならdebugにしろってなってるのでどちらがいいのかは謎
→ 外したら起動時に"RuntimeError: Cannot add middleware after an application has started"で落ちるようになった
つけっぱでええか (2023/03/08追記)

    • gradio-queueつけると長時間の処理してもタイムアウトしなくなるっぽい

※2023/03/13追記
gradioくんちょいちょい死ぬのでngrok経由の方法も一応。
・ngrokでアカウント登録する(google連携とかでいい)
・左メニューの「Your Authtoken」選んでトークンをコピーしておく
・WebUI起動用のコマンドラインを変更する

以下を削除
--share

以下を追加
--ngrok コピーしたトークン --ngrok-region jp

これだけでOK。gradio-debugとかqueueとかは入れっぱなしでいい。
初回起動がgradioの倍ぐらいかかったのでそこは注意。
※動きはするけどgradioのアドレスとかも出るから多分なんか余計なことしてる。動くからまぁええかの精神


また表示されるアドレスが「公開用アドレス」→しばらく待つ→「ローカルアドレス」の順に出るが、ローカル出るまで公開用アドレス叩いてもエラー出るだけなので注意。
(俺は公開成功してるけどローカル叩け無いンゴみたいなエラーが出る)
※その後gradioのアドレスも出る()

# 出力をzipに保存
!zip -r /content/drive/MyDrive/sd.zip /content/drive/MyDrive/Colab/stable-diffusion-webui/outputs 

WebUIで出力した結果をまとめてドライブ直下のsd.zipに保存する。

# 出力結果をクリア
%cd /content/drive/MyDrive/Colab/stable-diffusion-webui/outputs/txt2img-grids/
!rm -rf *
%cd /content/drive/MyDrive/Colab/stable-diffusion-webui/outputs/txt2img-images/
!rm -rf *
# zipも消す
%cd /content/drive/MyDrive/
!rm -r sd.zip

出力結果、及びsd.zipを削除する。
※こまめに消さないとGoogleDriveの容量あっという間に持っていかれるため

この保存~削除あたりはもっと便利なの公開してる人もいると思うw

起動時のエラー対処例/k-diffusionのハッシュ


こんな感じのエラーが出た場合(現状は多分ほぼ確実に出ると思う)は以下のコードを実行する。

# repositories/k-diffusionがどうのこうの言われた時は以下でハッシュ撮ってlaunch.pyの該当の箇所書き換える
!git -C repositories/k-diffusion rev-parse HEAD

そうすると以下のような画面になる

そしたらMyDrive/Colab/stable-diffusion-webui/にあるpython.pyを開く。
(ダウンロードして編集して上書きアップロードでも、PCにドライブ接続して編集でもなんでもいい)
以下の「k_diffusion_commit_hash」部分を探して後ろにあるハッシュを取得した値に書き換える。

※PCにドライブ接続して直接書き換えた場合、反映されるのに若干間があるので少し待ってから試そう

起動時のエラー対処例/libnvinfer.so.7

※長いので抜粋

これ消したい場合は以下を実行

# WebUI起動時にlibnvinfer.so.7/libnvinfer_plugin.so.7がどうのこうの言われた時用
!pip install tensorflow-gpu==2.5.0

ただこれそのままでも普通に動くので必要なのかはよくわからん。
※StableDeffusionのファイルではなく環境のファイル置き換えてるので、ランタイム接続毎に実行が必要。

その他のエラー

基本的にはエラーの文章読んで頑張るしかない。
各種解説サイトとかwikiに事例がいっぱいあるのでそこ探すか、エラー文そのままコピペしてぐぐって海外サイトひっかけて頑張るか。
ちなみに俺に聞かれても多分わからない()

モデルとかの追加

/MyDrive/Colab_Models:モデル、VAEの類
/MyDrive/Colab_Models/embeddings:embeddings用
/MyDrive/Colab_Models/Lora:Lora用
まんまだけどこれらのファイルはここに格納しよう。
モデル関係は基本的に
https://huggingface.co/models
ここから拾ってくるが、各所でモデルの特徴とか解説してるサイトいっぱいあるのでそこで見比べて持ってくるといい。
VAEはモデルに付随して置いてあることが多いからそこから拾ってきて、色々試してこのみの発色するもの探そう。

embeddingsとかLoraは学習に関係するものだけど、配布されてるものが多いのでそれらを利用する時用。
embeddingはネガティブまとめて指定してくれる系の奴が便利なので、EasyNegativeでぐぐって調べると吉。
Loraは自分で作らなくても結構公開されてるので、このキャラで遊びたいんだけどモデルがいまいち反応してくれないんだよなぁ、って時は探してみるといい。
詳しくはcivitaiでぐぐれ。使用は自己責任でどうぞ。

ちなみに自分が使ってるのはモデル:anything-v4.5 + VAE:kl-f8-anime2。

モデルの配置の仕方は複雑なことしたくない人は普通にDLして、任意の場所にULしなおせばOK。
モデルは数GBあるけどそれなりの速度出る環境なら多少でかい奴でも数分。
速度が欲しいならColabでaria2をインストールして、直接ダウンロードコマンドを投げれば上げ直す部分を省略できるのでかなり早い。
以下のコマンドでできるはず

!apt-get -y install -qq aria2
!aria2c --console-log-level=error -c -x 16 -s 16 -k 1M URL -d PATH -o FILENAME

URL:拾ってくる先のURL
PATH:インストール先のパス
FILENAME:保存するファイル名(もともとのファイル名部分そのままでOK)

WebUIあれこれ

UI変更

WebUI立ち上げたあと、Settings→UserInterfaceからQuicksettings listの中身を

sd_model_checkpoint,sd_vae,CLIP_stop_at_last_layers

に変更しておくと便利。
変えたらApply Settingsして、多分プロセス再起動しないと駄目だったと思う(リロードとかではなくColab上でWebUIを停止して再度実行)

ちなみにモデル(これは最初から)、VAEなどは上部に追加されるドロップダウンで変更できるが、選んだところからロードが走って結構時間かかるのでしばらく待つこと。
UIでもわかるけど終わったらColab画面の方にロード完了のログが出るのでそっち見てた方がわかりやすいかも。

初期設定

WebUI立ち上げたあと、毎度設定変えるのめんどいなって人はstable-diffusion-webui直下にあるui-config.jsonの中身を書き換えればいい。
ただのテキストファイルなので中身読んで、目的の設定のvalueのところ書き換えるだけ。

設定とか

自分の使ってる設定例。これは好みだとか生成する内容とかに大きく依存するのであくまで参考に。

Sampling method:DPM++ SDE Karras
Sampling Steps:40
Width:672
Height:896
CFG Scale:11

Hires.fix:ON
Hires step:30
Denoising:0.6
Upscale by:1.5

基本的に指示に従って欲しいのでCFG Scaleは高め。
指示少なめでガチャで大当たり引きたい人は7以下とかにした方がいい。
俺はこういうキャラでこういう絵作れよ余計な事するなよ!って指示したいのでこんな感じ。

サイズはもうちょい小さい方が早いし複数人化けも起こしにくいと思うけどせっかく高性能環境使えるんだしなぁっていうアレ(てきとう)。

HiresのDenoisingは低すぎるとノイズが多く、大きすぎると元絵から離れやすくなる。
特にエフェクト多い奴とかはそこでおかしくなって元は大丈夫なのにHiresのせいで破綻するとかもあるのでよく考えて入れたほうがいい。
明らかにおかしいな、と思ったらSEED固定してHires切って確認するのも手。

WebUIのエラー/無反応

WebUI側が無反応になった場合。わかりやすいのはGenerateボタン押してもColab側に生成ログが出ない時。
時間のかかる生成などを実行するとほぼ確実にこれになる(バッチサイズを複数にするなど)。
この場合はWebUIリロードすれば元に戻る。プロンプトや設定は入れ直し。

※無反応になっても画面に結果が戻ってこなくても実行自体はされてるので、/content/drive/MyDrive/Colab/stable-diffusion-webui/outputs/に出力は保存されている。

WebUIのエラー/エラー画面が出た時
No interface is running right now

みたいなメッセージが出た場合はColab側のWebUIプロセスを上げ直さないと解消しない。

WebUIのエラー/NANがどうのこうののログが出てた

生成した結果なんかブランクできちゃったんで弾きましたの意。
※エロ制御外さずエロが生成された場合も同じような動作する(メッセージは違う)

エロいの作りたいんだけど

BANされてもいいなら構わないけどColabとかクラウドサービス使ってる時はやらない方がいいと思うわよ。
そりゃもちろん絶対されるって訳じゃないけど……。

ControlNet

使い方は解説サイトいくらでもあるからそこで調べてw
ControlNetはそれ用のモデルが必要なので投入も忘れずに。
設置する場所はここ:Colab/stable-diffusion-webui/extensions/sd-webui-controlnet/models

Merge Block Weighted

以下のサイトを参考にしよう!()
economylife.net