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を使えば簡単じゃん、って話でした。