Quantumleap
961 words
5 minutes
Stable DiffusionをDockerで動かすチュートリアル

環境#

必要なものは以下の三つです。ちなみに環境は Ubuntu 22.04 です。

  • CUDA
  • Docker
  • Docker Compose

CUDA#

$ nvidia-smi
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.41.03              Driver Version: 530.41.03    CUDA Version: 12.1     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                  Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf            Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 4070 Ti      Off| 00000000:01:00.0 Off |                  N/A |
|  0%   33C    P8                9W / 285W|   3043MiB / 12282MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|    0   N/A  N/A      1156      G   /usr/lib/xorg/Xorg                          475MiB |
|    0   N/A  N/A      1376      G   /usr/bin/gnome-shell                         45MiB |
|    0   N/A  N/A      4887      C   python                                     2518MiB |
+---------------------------------------------------------------------------------------+

ドライバー自体は Ubuntu の Software Updater から導入しました。このままでは Docker のコンテナ内から CUDA が利用できないので、NVIDIA container toolkit を使って、docker のコンテナ上で cuda を動かすの記事を参考に NVIDIA container toolkit を導入してください。

Docker#

$ docker -v
Docker version 23.0.6, build ef23cbc

Docker Compose#

$ docker compose version
Docker Compose version v2.10.2

Stable Diffusion WebUI Docker#

GitHub で公開されているのでこれを利用します。

git clone https://github.com/AbdBarho/stable-diffusion-webui-docker
cd stable-diffusion-webui-docker

ここに既にdocker-compose.ymlがあるのでこれを利用します。

docker compose --profile auto up --build

とすれば AUTOMATIC1111 版の Stable Diffusion WebUI が起動します。他にもいろいろ UI があるのですが、とりあえずこれでいいと思います。

するとビルドから何まですべてやってくれます。container toolkit を入れ忘れているとここでなんかエラーが出ます。

で、このままだとlocalhost:7860でしかアクセスできないので、外からアクセスできるようにします。ルーターのポートフォワードなどは各自やっているものとします。

docker-compose.yml#

以下の内容をdocker-compose.ymlに追記します。いつも使っているnginx-proxyletsencrypt-nginx-proxy-companionの組み合わせです。

TSL が必須でなければ後者は不要です。

またautoのところをちょっと変えます。portsが本当に必要かどうかはわからないので、有識者教えて下さい。

CLI_ARGSで実行時に渡されるオプションを変えられるので、xformersをとりあえず有効化しておきます(多分デフォルトで有効です)。

これを有効にすると速度がちょっと速くなる代わりに同一シードでの完全な再現性がなくなります。なのでお好みで。

  auto: &automatic
    <<: *base_service
    profiles: ["auto"]
    build: ./services/AUTOMATIC1111
    image: sd-auto:55
    ports:
      - '7860:7860'
    environment:
      VIRTUAL_HOST: $LETSENCRYPT_HOST
      VIRTUAL_POST: 7860
      LETSENCRYPT_HOST: $LETSENCRYPT_HOST
      LETSENCRYPT_EMAIL: $LETSENCRYPT_EMAIL
      CLI_ARGS: --allow-code --enable-insecure-extension-access --api --xformers --opt-sdp-attention --no-half-vae

  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    profiles: ["external"]
    ports:
      - 80:80
      - 443:443
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./certs:/etc/nginx/certs:ro
      - /etc/nginx/vhost.d
      - /usr/share/nginx/html
    restart: always
    logging:
      driver: none

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt
    profiles: ["external"]
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./certs:/etc/nginx/certs:rw
    volumes_from:
      - nginx-proxy
    restart: always

環境変数から値を読み取っているので.envを作成してください。

LETSENCRYPT_HOST=
LETSENCRYPT_EMAIL=

二つだけ指定しておけば大丈夫です。

Makefile#

自分は何度もコマンドを打つのがめんどくさかったので Makefile 化しました。

ローカルで動かしたいときならmake up、外部からも使えるようにしたいときはmake startという感じです。

.PHONY: up
up:
	docker compose --profile auto up --build

.PHONY: start
start:
	docker compose --profile auto --profile external up --build -d

.PHONY: down
down:
	docker compose down

VScode であれば SSH で繋げばそのへんもよしなにやってくれるので実は外部に公開しなくても SSH で繋げばローカル扱いでアクセスできます。

なのでこれは完全に第三者に公開するためのものです。

ここまで書いてあれですが、第三者に公開する必要がないならここまでの手順は全部要らないです。Docker で動かして終わりです。

記事は以上。

Stable DiffusionをDockerで動かすチュートリアル
https://fuwari.vercel.app/posts/2023/05/stablediffusion-docker/
Author
tkgling
Published at
2023-05-12