Azure上のStable Diffusion (AUTOMATIC1111)をhttps対応する

gradio経由が安定しない

webui-user.shに”share”を追加するとgradio経由でアクセス出来るんだけども、とっても安定しない。まあ、作者もドキュメント

use share=True for gradio and make the UI accessible through their site (doesn’t work for me but you might have better luck)

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

と書いているので、やっぱダメか、と。

自己署名ルート証明書が使えない

一方、”tls-keyfile”、”tls-certfile”を指定する場合、自己署名だとエラーになる。さらにAzureの場合”azure.com”になるので、Let’s encryptでCAによるルート証明書も使えない。

certipieが動かない

で、まあその辺の議論はあったみたいで、extensionフォルダに放り込むだけでTLSにしてくれる拡張もあるんだけども、Ubuntu20.04ベースのAzure HPC VMはPython3.8だと、こいつが使ってるcertipieがPython3.9以降じゃないと動かないからダメ。

Pytorchが動かない

もちろん、aptのレポジトリをイジってPython3.11に上げてみるというのもやったが、今度はAUTOMATIC1111が使ってるPytorchのバージョンが見つからなくなって、やっぱり動かないw

やっぱnginxプロキシー最高

こんなに小出しに見出しを付けておいて、オチはそれかよって話ですがw

KV作って証明書作ってsecretを取得しておき、そのsecretをvm createに渡して、waagentが保存したcrt/prvペアをnginxの設定に追加(ここはyaml)し、tcp/443開けて、bastion作る、です。

#!/bin/bash

account=rio
location=westus3
rgname=${account}hpctestrg

az group create --name $rgname --location $location

keyvault_name=${account}keyvaultforhpctest

az keyvault create \
    --resource-group $rgname \
    --name $keyvault_name \
    --enabled-for-deployment

az keyvault certificate create \
    --vault-name $keyvault_name \
    --name mycert \
    --policy "$(az keyvault certificate get-default-policy)"

secret=$(az keyvault secret list-versions \
          --vault-name $keyvault_name \
          --name mycert \
          --query "[?attributes.enabled].id" --output tsv)

vm_secret=$(az vm secret format --secrets "$secret" -g $rgname --keyvault $keyvault_name)

#yaml

az vm create \
    --resource-group $rgname \
    --name ${account}hpctest \
    --public-ip-address-dns-name ${account}hpctest \
    --image "microsoft-dsvm:ubuntu-hpc:2004:latest" \
    --priority Spot \
    --public-ip-sku Standard \
    --eviction-policy Deallocate \
    --os-disk-size-gb 256 \
    --admin-username ${account} \
    --ssh-key-values ~/.ssh/id_rsa.pub \
    --custom-data cloud-init.txt \
    --size Standard_NC24ads_A100_v4 \
    --secrets "$vm_secret"
    
az vm open-port \
    --resource-group $rgname \
    --name ${account}hpctest \
    --port 443

az network vnet create \
    --resource-group $rgname \
    --name bastionvnet \
    --address-prefix 10.0.0.0/16 \
    --subnet-name AzureBastionSubnet \
    --subnet-prefix 10.0.0.0/24 \
    --location $location

az network public-ip create \
    --resource-group $rgname \
    --name MyIp \
    --sku Standard \
    --location $location

az network bastion create \
    --name MyBastion \
    --public-ip-address MyIp \
    --resource-group $rgname \
    --vnet-name bastionvnet \
    --location $location

途中のyamlは”cloud-init.txt”として以下のような感じで。

#cloud-config
package_upgrade: true
packages:
  - nginx
write_files:
  - owner: www-data:www-data
  - path: /etc/nginx/sites-available/default
    content: |
      server {
        keepalive_timeout 300;
        client_max_body_size 100m;
        listen 443;
        ssl on;
        ssl_certificate /etc/nginx/ssl/mycert.crt;
        ssl_certificate_key /etc/nginx/ssl/mycert.prv;
        location / {
            proxy_pass http://localhost:7860/;
        }
      }
runcmd:
  - secretsname=$(find /var/lib/waagent/ -name "*.prv" | cut -c -57)
  - mkdir /etc/nginx/ssl
  - cp $secretsname.crt /etc/nginx/ssl/mycert.crt
  - cp $secretsname.prv /etc/nginx/ssl/mycert.prv
  - apt-get update
  - apt-get -y install python3.8-venv
  - service nginx restart

waagentってのは、”W”indows “A”zure Agentで、こんなところに古いAzureの名称が残ってます。Agentと言ってもLinuxゲスト上で動いてるPythonで書かれたスクリプトでしか無いんだけど、こいつが定期的にハートビートを送信したり色々やってます。

残り

あとはAUTOMATIC1111をcloneしてwebui-user.shに”listen”を渡してあげると、0.0.0.0にtcp/7860をbindするので、nginxちゃんがフォワードしてくれます。なんだ、nginxを使えば簡単じゃん、って話でした。