Paperspace Gradientの無料枠の範囲内でStable Diffusion web UIを動かす

2023年3月5日日曜日

stable-diffusion

t f B! P L

Google Colaboratoryのようにpythonが動かせてGPUも使えるサービスがあるらしいので触ってみる。

(2023-06-11: /tmp以下に全てをインストールする方法を末尾に追加)

目的

  • Paperspace GradientというGoogle Colaboratoryのようなサービスの使い方を知る
  • 無料枠の中でstable diffusion web uiを入れてAI画像生成する

動かしたというメモ。

登録して動かす準備ができるまで

流れに沿って進めれば難しいことは何もない。

https://www.paperspace.com/に行って右上のSIGN UP FREEをクリック。

GitHub、Google、メールアドレスで登録ができるので好きな方法で登録。

電話番号が必要。国が日本になっていることを確認して8012345678のように080などの最初の0を抜いた番号を入れる。 電話番号を登録するとSMSで認証コードが届く。

名前とユーザーネームを入力して

gradientを選択。

質問に適当に答える。

適当にプロジェクト名を決める。

Notebooksを選ぶ。

CREATE

Start from Scratchを選ぶ。

Free-GPU、1時間から6時間までの範囲で自分が利用する時間を選んでSTART NOTEBOOK。GPUに空きがなくて使えないことがあるので、そのときは少し時間を置く。

左下のOpen in JupyterLabを選ぶ。New Fileから(ファイル名).ipynbを作成してこの画面から操作することもできる。

NotebookのPython3を選ぶ。

コードが書けるようになったら準備完了。

Stable Diffusion web UIのインストール

Paperspace Gradientにはシャットダウンしてもデータが残る永続的なストレージと、マシンを起動している間だけ使える大きめの一時的なストレージがある。無料枠ではデータを残せるストレージを5Gb分使える。

AUTOMATIC1111/stable-diffusion-webuiを動かすのに必要なスペースは

  • webuiに800Mb
  • torchなど必要なライブラリに4.6Gb
  • モデルやVAEに数Gb

となっていて全てを永続ストレージに入れることができない。Google ColaboratoryでStable Diffusion web UIを使うときと同じように、使うたびに一時スペースにすべてインストールしてもいいが、せっかく5Gb使えるので少し工夫をしたい。

そこで今回はライブラリ、webuiの設定ファイル、生成した画像を永続ストレージに置くという方向でやってみる。

なお月に8ドル払うならこの永続ストレージが15Gbとなり、全て/storageにインストールしても問題ない。さらに良いGPUも使える。

ストレージに仮想環境を置く

初回だけ

%cd /storage
!pip install virtualenv
!virtualenv venv

!venv/bin/pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 --extra-index-url https://download.pytorch.org/whl/cu117
!venv/bin/pip install -U --pre triton
!venv/bin/pip install xformers==0.0.16rc425

Stable Diffusion web UIのclone

起動するたびにやる

%cd /tmp
!git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui

モデルのダウンロード

起動するたびにやる。これはwgetで最近流行りのAbyssOrangeMix3のモデルとVAEをダウンロードする例。それぞれ/tmp/SD/modelsと/tmp/SD/VAEに保存。webuiの起動時にこのディレクトリを指定する。

!mkdir -p /tmp/SD/{models,VAE}
!wget https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/Models/AbyssOrangeMix3/AOM3A1.safetensors -O /tmp/SD/models/AOM3A1.safetensors
!wget https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/VAEs/orangemix.vae.pt -O /tmp/SD/VAE/orangemix.vae.pt

gdownを使う方法もある。自分のgoogle driveからデータを転送できるとPaperspace公式ドキュメントも言っている。

インストールはpipでできる。しなくても最初からあるかもしれない。

!/storage/venv/bin/pip install gdown

Goolgeドライブに行き、転送したいファイルのリンクを取得する。右クリックなどから行ける。

一般的なアクセスをリンクを知っている全員に設定する。

リンクをコピーしてURLを得る。https://drive.google.com/file/d/{id}/view?usp=share_linkのようになっている。このidの部分を使う。

使用例。{id}{modelname}などをそれぞれ置き換えて使う。ファイルサイズが500Mbを超えるときは&confirm=tをつける。

# !mkdir -p /tmp/SD/{models,VAE} # ディレクトリがないとエラーが出るので必要なら先に作る。
!/storage/venv/bin/gdown "{id}&confirm=t" -O /tmp/SD/models/{modelname}
!/storage/venv/bin/gdown "{id}&confirm=t" -O /tmp/SD/VAE/{vaename}

webuiの起動

(2023-03-09:追記)--data-dirを指定するよりconfig.jsonなどの設定ファイルの場所を指定するほうが不具合が少なくて済む。

%cd /tmp/stable-diffusion-webui/
!/storage/venv/bin/python launch.py --share --xformers --enable-insecure-extension-access --ckpt-dir /tmp/SD/models --vae-dir /tmp/SD/VAE --ui-settings-file /storage/config.json --ui-config-file /storage/ui-config.json --styles-file /storage/styles.csv --lora-dir /tmp/SD/lora

--data-dirを指定する方も一応残しておく。

%cd /tmp/stable-diffusion-webui/
!/storage/venv/bin/python launch.py --share --xformers --enable-insecure-extension-access --ckpt-dir /tmp/SD/models --vae-dir /tmp/SD/VAE --data-dir /storage/sdwebuidata

生成されたリンク(https://(文字列).gradio.live)にアクセスする。動いた。colabの無料枠で使えるGPUと比べると流石に遅いが、試す分にはいい。

保存先の設定

AIが生成した画像の保存先は/notebooks以下にするとシャットダウンしても消えない上に確認もしやすくて便利。SettingsのPath for savingに行き、デフォルトのoutputs/~の部分を/notebooks/outputs/~に変えてApply settings。

生成した画像の保存

生成した画像をダウンロードするときは全てzipに詰めて/notebooksに配置すると楽でいい。左のメニューから右クリックでダウンロードできる。colabよりはダウンロードが速い。もちろんwebuiから普通にsaveしてdownloadでもいい。

import datetime
dt_now = datetime.datetime.now()
timestamp = dt_now.strftime('%Y%m%d%H%M%S')
!zip -r /notebooks/{timestamp}.zip /notebooks/outputs/*

永続ストレージの空きに余裕が無いので限界を迎える前に掃除する。上で作ったzipは左クリックからDelete Permanentlyで消す。

rm -r /notebooks/outputs/*

使い終わったら忘れずにマシンを止める

始めるときに指定した時間が来たら自動で止まるが、ここはしっかり止めて使わせてもらってるリソースを開放したい。

Open in JupyterLabで始めた場合は前の画面に戻ってから止める。微妙に分かりづらい。

不具合の対処

webuiが反応しなくなる

(最近トンネリングする外部ツールを使用するとアカウント停止の可能性があると聞いたので自己責任でお願いします。ngrokは確実に止まるらしい。)

私の環境だけかもしれないが、 デフォルトの縦512、横512以外のサイズで生成しようとすると、画像の生成自体はしているようだが画面に表示されず、その後webuiが操作を一切受け付けなくなるという不具合に遭遇した。boreを使うといいという情報を見たので使ってみる。

適当なところでboreをダウンロードして展開。

%cd /storage
!wget https://github.com/ekzhang/bore/releases/download/v0.4.0/bore-v0.4.0-x86_64-unknown-linux-musl.tar.gz
!tar -xf bore-v0.4.0-x86_64-unknown-linux-musl.tar.gz
!rm -f bore-v0.4.0-x86_64-unknown-linux-musl.tar.gz

boreを付けて起動。

%cd /storage/stable-diffusion-webui/
!/tmp/venv/bin/python launch.py --xformers --enable-insecure-extension-access & /storage/bore local 7860 --to bore.pub

どこかにbore_cli::client: listening at bore.pub:(ポート番号)という文字列が出てくるのでhttp://bore.pub:(ポート番号)/にアクセスする。そうするとwebuiにアクセスできて、生成する画像のサイズを変えても動き続ける。

httpな上にurlが単純すぎて怖いので何か他に良い方法があれば後で追記する。--secretオプションを付けると認証を付けられそうだが、動かす方法がわからなかった。

参考

途中経過が死ぬ

webuiは画像の生成途中で途中経過を表示するが、このときにエラーを吐いてプログレスメーターと途中経過が消える。まだ途中なのにgenerateが押せるように見えてて良くないのでこの機能を消す。

SettingsのLive previewsにあるShow live previews of the created imageのチェックを外す。

おわり

少しややこしいことをした気がする。そのせいかcolabやローカルでは普段見ない不具合も出てきた。だがPaperspace GradientでStable Diffusion web UIを動かし、実際にAI画像生成ができることがわかったのは良かった。使いやすいサービスでした。

追記: 容量を気にせず全てを/tmp以下に配置する方法

ただし環境が保存されないので毎回入れ直しになる。

torch関係とxformersのインストール

%cd /tmp
!pip install virtualenv
!virtualenv venv

!venv/bin/pip install torch==2.0.1 torchvision==0.15.2 --extra-index-url https://download.pytorch.org/whl/cu118
!venv/bin/pip install --no-deps xformers==0.0.17

stable diffusion webuiなどのインストール

%cd /tmp
!git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui

# ControlNet
%cd /tmp/stable-diffusion-webui/extensions
!git clone https://github.com/Mikubill/sd-webui-controlnet
# openpose modelをダウンロードする例
!wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_openpose.pth -O /tmp/stable-diffusion-webui/extensions/sd-webui-controlnet/models/control_v11p_sd15_openpose.pth


# モデルのダウンロード
!wget https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/Models/AbyssOrangeMix3/AOM3A1_orangemixs.safetensors -O /tmp/stable-diffusion-webui/models/Stable-diffusion/AOM3A1_orangemixs.safetensors
!wget https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/VAEs/orangemix.vae.pt -O /tmp/stable-diffusion-webui/models/VAE/orangemix.vae.pt

webuiを起動

%cd /tmp/stable-diffusion-webui/
!/tmp/venv/bin/python launch.py --share --xformers --enable-insecure-extension-access --ui-settings-file /storage/config.json --ui-config-file /storage/ui-config.json --styles-file /storage/styles.csv

QooQ