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自体が立ち上がらなくなった。
この環境はまだまだ不安定のように見受けられるので、実験的に利用して、問題点を洗い出していこうと思う。