Azure HPC VMでStable Diffusionすると速いのか?(結論:すげえ速かった)

Azure

手元にあるSDできる環境はMac Studioのみなのだけど、GPUとして見た時にはMac Studioの性能はRTX3090の半分以下のようなので、もうちょっと速い環境が欲しいっちゃ欲しい。メモリ24GBを搭載しているRTX4090は確実に3090より速いわけだが、執筆時点で約30万円。うーん、ゲームをプレイするにしてもこいつはあまりコスパが良くないなということで、AzureのHPC用のVMでSDを動かしてみた。

どのVMを使うか

Azure VMでGPUが使えるシリーズはいくつもあるけれど、VDIがしたいわけではないし、そんなにデカいインスタンスを使ったところでStable Diffusionが生成できる画像のサイズには限度があるので、NVIDIAのA100が使えるNC_A100_v4シリーズから選択。

West US 2での見積もり

電気代とか諸費用の関係でリージョンによって結構お値段は異なるので、執筆時点で出来るだけ安いところということでWest US 2にStandard_NC24ads_A100_v4を。500円/時間で80GBのGPUメモリが搭載されたA100付きのVMを「継続して」使えるのだけど、もうホント1時間だけ安く使いたい、という使い方なんでスポットインスタンスにして節約しましょう。同じWest US 2でスポットインスタンスだと、$1.4692/hour、ちょうど200円/時間ぐらいでイケそうです。ただしこれはデータディスクを付けない場合の料金なので、注意が必要。OSディスクが30GBなので、これを64GBにして生成された画像もそこに置いておく…の方がお安いと思われ。ディスクの容量はむしろ、モデルやLoRAをいくつ使いたいかに依るので、そこはよしなに。

くれぐれもビックリするような請求をされないように気を付けて楽しもう。

VMをデプロイする

AzureポータルからUbuntuベースのHPC VMをデプロイ。

Create a resourceして
Ubuntu-based HPC and AIを検索して
Ubuntu-HPC 20.04を選択

[Availability options]は冗長化無し、で[Run with Azure Spot discount]を選ぶと自動的に[Size]が”Standard_NC24ads_A100_v4″になるはず。

データディスクを付ける場合は、”Create and attach a new disk”から、

1TBもたぶん要らないかと。

あと、[Management]の[Auto-shutdown]を設定しておくと、クラウド破産しなくて済みます。あとは[Create]をクリックすればデプロイできます。

OSディスクを拡張する場合は、デプロイ完了後に一度VMを停止(Deallocate)してから、[Disks]からOSディスクを選択し、

64GBとかに。OSディスクは拡張すると自動的にファイルシステムも拡張されるので、データディスクを拡張するより楽ちんかも。

AUTOMATIC1111をどこにインストールするか

OSディスクの拡張ではなくデータディスクをアタッチした場合、ざっくり以下の手順が必要。

  1. sudo fdisk -lでデータディスクを確認。
  2. sudo fdisk /dev/sdcでパーティションを作成(1でsdcだった場合)。
  3. sudo mkfs.xfs /dev/sdc1
  4. sudo blkid /dev/sdc1して、/etc/fstabに
    UUID=xxxxx-xxxx… /opt/sd xfs defaults,discard 0 0
    とか追加。
  5. sudo mkdir /opt/sd
  6. sudo mount /opt/sd
  7. sudo chown user.user /opt/sd

で、この/opt/sdにAUTOMATIC1111をcloneする感じ。OSディスク拡張なら、ユーザホームディレクトリの容量に余裕があるはずなので、そのまま~/sdとか作っても良し。

AUTOMATIC1111をインストールする

Bastionかsshでログインする

セキュリティ的にはBastionがオススメなんだけど、作業内容によってはBastionだと難しいこともあるので、その時だけsshを開けるのが良いかと。sshは時限で自動的に塞がれます。

sshも、Stable DiffusionのWeb UI(AUTOMATIC1111のtcp/7860)へのアクセスも、NSG(Network Security Group)でアクセス元IPアドレスを制限しておくこと。じゃないと、勝手に使われたりしちゃうので。

あと、MacでBastionを使う場合、Safariだとペーストが出来ないので、Edge / Chrome推奨。

以下、~/sdにインストールするものとして、適宜読み替えてください。

Python venv入れる

これが無いとAUTOMATIC1111が動かん。Ubuntu20.04なんで、Python 3.8で行きます。

$ sudo apt-get update
$ sudo apt-get -y install python3.8-venv

AUTOMATIC1111をclone

$ cd ~/sd
$ git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui

webui-user.shを編集

$ cd stable-diffusion-webui
$ vim webui-user.sh

コマンドラインの引数がコメントアウトされているので、

#export COMMANDLINE_ARGS=""

以下のように変更。その他の引数についてはドキュメント参照

export COMMANDLINE_ARGS="--listen --enable-insecure-extension-access --xformers --no-half-vae"

AUTOMATIC1111を起動

$ ./webui.sh

すると、URLが表示される。

Model loaded in 1.6s (create model: 0.3s, apply weights to model: 0.3s, apply half(): 0.1s, load VAE: 0.6s, move model to device: 0.2s).
Running on local URL:  http://0.0.0.0:7860

NSGの設定

上記URLにアクセスするには、Azure VMのtcp/7860がオープンになってないとならない。VMの[Network]→[Add inbound port rule]で以下。ソースIPは制限。

ブラウザでアクセスしてみる

http://VMのグローバルIP:7860/にアクセスすると、はい、表示できました。

AUTOMATIC1111の設定

Extensions、VAE、Model / LoRA等をインストールする。

Extensions

Install from URLから特に問題なくインストール可能。

Openpose Editor: https://github.com/fkunn1326/openpose-editor
WebUI Controlnet: https://github.com/Mikubill/sd-webui-controlnet

VAE

例えば、Hugging Faceからなら、

$ cd ~/sd/stable-diffusion-webui/models/VAE
$ wget https://huggingface.co/AIARTCHAN/aichan_blend/resolve/main/vae/Anything-V3.0.vae.safetensors

で、有効にして再起動。

Model / LoRA

例えば、CivitaiからRealDosMixなら、

$ cd ~/sd/stable-diffusion-webui/models/Stable-diffusions/
$ curl -LOJ https://civitai.com/api/download/models/8137

同様にLoRA(2B (NieR:Automata) LoRA / YorHA edition)なら、

$ cd ~/sd/stable-diffusion-webui/models/Lora/
$ curl -LOJ https://civitai.com/api/download/models/6031

Embedding

EasyNegativeなら、

$ cd ~/sd/stable-diffusion-webui/embeddings/
$ curl -LOJ https://civitai.com/api/download/models/9208

ControlNet

ControlNetのモデルはHugging Faceにあるので、openposeなら、

$ cd ~/sd/stable-diffusion-webui/models/ControlNet/
$ curl -LOJ https://huggingface.co/webui/ControlNet-modules-safetensors/res
olve/main/control_openpose-fp16.safetensors

やってみよう

以下の画像をMac Studioで描かせると、7分55秒かかった。

Azure VMだと同じシードでもかなり違う絵が出てくるが、なんと16秒しかかからない!

約30倍も速い!

同じ時間で、違うシード値を30回試せるということだ。え、どういうこと、なんでそんなに速いん?

Hires. fixで2880 x 1440

さらにAzure VMで試しにHires. fixで2倍、つまり2880 x 1440を描かせてみたところ2分54秒だった。ただし、WebUIからファイルがダウンロードできなかったので、Azure VMから自宅鯖にscpで転送した。転送サイズの制限か何かかな?

2880 x 1440あります、これ

2048 x 1024 + Hires. fix

ん?ひょっとしてもっとデカいの描ける?Web UIで2048ピクセルまで設定出来るので、2048 x 1024に設定してHires. fixしてみる。

torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 72.00 GiB (GPU 0; 79.17 GiB total capacity; 22.36 GiB already allocated; 48.94 GiB free; 28.66 GiB reserved in total by PyT
orch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

落ちたwww
メモリが足らん。Standard_NC48ads_A100_v4にすればたぶんイケる。

結論

200万円を超えるGPUは速い(速い)。でもスペックを見ると消費電力は300Wなのね…。

これを、時間あたり数百円で使えるクラウドってやっぱりスゴイね…。そして恐ろしいことに、今回試したのはA100が1枚のみのStandard_NC24ads_A100_v4。料金が4倍になるが、Standard_NC96ads_A100_v4では、このGPUが4枚使える…。グラボだけで900万円の構成です。対戦ありがとうございました。

作業終わったらVMを停止するのを忘れないように!

タイトルとURLをコピーしました