😊

Google CloudにStable diffusion環境を作った

2023/07/19に公開

背景

画像生成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