😊
Google CloudにStable diffusion環境を作った
背景
画像生成AIのStable diffusionの環境構築
- モデルごとの違いやLoRaなどを試せる環境
- なるべく低価格で
- 気軽に使いたい
- 使い終わったらインスタンス停止する
環境
Google Cloud
- zone:
us-central1-a
通信速度的にはアジア圏のほうが良いですが、GPUを使うのでUS系が柔軟 - machine-type:
n1-standard-4
(4 vCPU, 15GB RAM)
動作速度が遅すぎず、高価過ぎない感じの構成 - GPU:
NVIDIA T4
1枚 - イメージ:
Debian 11 based Deep Learning VM with CUDA 11 M109
c0-deeplearning-common-gpu-v20230615-debian-11-py310` - ディスクサイズ:
200GB
当初100GBにしていたが容量不足により拡張した
(modelとかLoRaとか入れると気軽にこれぐらい行く) - 可用性ポリシー:
スポット
今回は検証用なのでスポットにしている
※ スポットインスタンスは、突然停止したり、起動できなかったりする代わりに、価格が通常の 1/3 程度になる
この構成で1ヶ月稼働し続けて月額2万円弱ぐらい
環境構築
初期構築
サーバー側で
sudo apt update && sudo apt upgrade -y
sudo apt install curl wget git nginx certbot
Stable Diffusion用の環境構築
サーバー側で
git clone https://github.com/AbdBarho/stable-diffusion-webui-docker
cd stable-diffusion-webui-docker
docker compose --profile download up --build # 最初だけ
docker compose --profile auto up --build # 起動時
その他
dockerコンテナが自動起動するように
~/stable-diffusion-webui-docker/docker-compose.yml
diff --git a/docker-compose.yml b/docker-compose.yml
index 815a9bf..497e94c 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -29,6 +29,7 @@ services:
<<: *base_service
profiles: ["auto"]
build: ./services/AUTOMATIC1111
+ restart: always
image: sd-auto:62
environment:
- CLI_ARGS=--allow-code --medvram --xformers --enable-insecure-extension-access --api
nginxの設定
Websocketか何かを使ってるので proxy_set_header Connection "upgrade";
とかが必要
/etc/nginx/sites-available/default
server {
listen 80;
server_name YOUR_SITE.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name YOUR_SITE.com;
ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_certificate /etc/letsencrypt/live/YOUR_SITE.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/YOUR_SITE.com/privkey.pem;
auth_basic "Restricted"; # ベーシック認証
auth_basic_user_file /etc/nginx/.htpasswd;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
log_not_found off;
access_log off;
}
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header X-Real-IP $http_u$remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header Host $host;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
client_max_body_size 500m;
location / {
proxy_pass http://localhost:7860/;
}
}
その他の設定
SSHのセキュリティ
- SSHは踏み台経由のみにする
- FirewallでSSH接続を踏み台IPのみにしておく
Nginxのセキュリティ
とりあえずIP直アクセスは禁止しといたほうが良い
/etc/nginx/sites-available/default
server {
listen 80 default_server;
server_name _;
return 444;
}
server {
listen 443 default_server;
server_name _;
ssl_certificate /etc/letsencrypt/live/YOUR_SITE.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/YOUR_SITE.com/privkey.pem;
return 444;
}
運用
ローカルで
gcloud compute instances start INSTANCE_NAME # 起動
gcloud compute instances stop INSTANCE_NAME # 停止
- モデル (ckpt, checkpoint) は
data/models/Stable-Diffusion/
に配置する - LoRa は
data/models/LoRa/
に配置する - 生成物は
output/
に出力される
Discussion