Windows環境のDockerを使って、Stable Diffusion WebUIを動かしてみます。

Windows上のブラウザから、Dockerコンテナにlocalhostでアクセスして、画像生成するのがゴールになります。

一番ハマったのは、コンテナ側のWebサーバーのListon IPを、0.0.0.0に設定する必要があるということです。これはwebui.shのコマンドオプションで指定します。後ほど説明します。

モデルファイルは、ダウンロードしてdocker cp でコンテナにコピーする形をとります。

初期設定

Windowsが初期状態の場合に、以下の手順が必要になります。初期状態とはいっても、nvidiaのGPUを使っていることが前提です。

Windows用のnvidiaのGPUドライバはインストールされていると思います。

  • WSL2のインストール
  • Docker Desktop のインストールと設定
  • nvidia-container-toolkitのインストール
WSL2のインストール

コマンドプロンプトを開いて、

wsl --install

とすると、デフォルトのLinuxがインストールされます。

Docker Desktopをインストール

https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe

から、インストーラーをダウンロードして、インストールする。

WSL integrationをオンにする。

Docker Desktopを立ち上げて、(ギアマーク)をクリックして設定に入る。

Resources/WSL integration に入って、画面のUbuntuをスライドしてオンにする。

nvidia-container-toolkitのインストール

WSL2のUbuntuに、コンテナ用Toolkitをインストールする。CUDAドライバは、Windows上のものを使用し、コンテナで使用するCUDA Toolkitはコンテナにインストールされたものを使用するが、その間を取り持つレイヤーが、WSL2上に必要ということらしい。

まずは、Ubuntuのコンソールを開く。

OSはubuntu22.04なので、以下のKeyringをインストール

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/ubuntu22.04/libnvidia-container.list | \
            sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
            sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

Toolkitのインストール

sudo apt updata
sudo apt-get install -y nvidia-container-toolkit

Dockerコンテナの起動と設定

コマンドプロンプトを開き、コマンドラインから、以下のコマンドを実行して、nvidia/cudaのイメージをダウンロードして、コンテナを起動する。

TensorRTを使いたいので、今回使用するバージョンは、12.1.1-cudnn8-devel-ubuntu22.04 とする。

docker run --name my-cuda --gpus all -p 7860:7860 -it nvidia/cuda:12.1.1-cudnn8-devel-ubuntu22.04 bash

すると、Linuxのプロンプトが出ると思います。

初期状態では、rootになっているので、別のユーザーでアプリケーションは動作させるようにします。

tadokunoが今回のユーザー名です。

adduser tadokuno

まだ、sudoは使えないので、それに必要な設定をします。

apt update
apt install -y sudo
apt install -y vim
echo "tadokuno ALL=(ALL) ALL" > /etc/sudoers.d/users
chmod 0440 /etc/sudoers.d/users

ユーザーを、先ほど追加したtadokunoに変更します。

su - tadokuno

残りの必要なアプリケーションを追加します。

sudo apt install -y net-tools
sudo apt install -y git

sudo apt install -y python3-pip
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install -y python3.13 python3.13-venv
sudo apt install -y python3.10 python3.10-venv
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.13 100
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.10 110
sudo update-alternatives --config python

sudo apt install libgoogle-perftools-dev

以下のスクリプトを、.bashrcに追加します。

if [ -e /usr/local/cuda ]; then
        export PATH="/home/tadokuno/.local/bin:/usr/local/cuda/bin:$PATH"
        export LD_LIBRARY_PATH="/usr/local/TensorRT/lib:/usr/local/cuda/lib64:/opt/nvidia/nsight-compute/2023.1.1/host/linux-desktop-glibc_2_11_3-x64/Mesa"
fi

これで、基本的な環境構築は完了したので、いったんコミットします。

docker commit my-cuda yourname/cuda:latest

Stable Diffusion WebUIのダウンロードと実行

あとは、リポジトリをクローンして、pythonの仮想環境で実行すれば、サーバーが立ち上がります。

git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
cd stable-diffusion-webui
python -m venv .venv
source .venv/bin/activate
./webui.sh --server-name '0.0.0.0'

最後の、–server-nameがコンテナで動かす際の肝になります。ここにたどり着くのに数日掛かりました。

起動したら、Windows上のブラウザから、http://localhost:7860 とアクセスすると、アプリケーションが表示されます。

最初の実行の際には、Pythonのモジュール等、必要なプログラムを自動的にダウンロードしていくので、結構時間がかかります。

Pythonの仮想環境については、そもそもこのコンテナが仮想環境で、永続利用をするわけではないので、必要ないかもしれません。Stable Diffusionは容量が大きく、またモデルファイルを色々とダウンロードして使うとさらにコンテナの容量が増えていきます。ですので、モデルファイルはボリュームにして、そこで統合管理するのがよいかと考えています。

Windowsでダウンロードしたファイルは、コマンドプロンプトから以下のようにコンテナにコピーして使います。

docker cp c:\Users\user\downloads\xxxx.safetensors my-cuda:/home/tadokuno/stable-diffusion-webui/models/Stable-diffusion/

commitする直前までの処理を行うDockerfileを用意しておきました。テストはしていませんので、自己責任でお願いします。

最後に

色々とぐちゃぐちゃ試して、あとnvidia-container-toolkitが本当にいるのかどうか、アンインストールしたりインストールしたりするうちに、Docker Desktop自体が立ち上がらなくなった。

この環境はまだまだ不安定のように見受けられるので、実験的に利用して、問題点を洗い出していこうと思う。