Docker 编译并运行 stable-diffusion-webui 镜像

Docker 编译并运行 stable-diffusion-webui 镜像

Cocytus Elias 223 2023-03-17

Docker 编译

stable-diffusion-webui 是一个基于 stable-diffusion 的集成环境,包含 可用于浏览器访问的 WebUIAPI 等。

首先,我们需要编译 stable-diffusion-webuidocker 镜像。因为 stable-diffusion 是一个稳定扩散绘图模型,所以需要 GPU 上的支持。

其次 stable-diffusion-webui 建议操作系统为 ubuntu 20.04

在者,在安装过程中,会遇到一些支持问题:

  • 需要 python 3.10.6 的支持,否则会在 /bin/bash webui.sh 时遇到 RuntimeError: Couldn't Install Torch相关 Issuse
  • 需要 cudaGPU 的支持,所以基础镜像采用 nvidia/cuda ,根据物理机上的 CUDA 版本来选择对应的 tag。 比如我在阿里云上选的是 CUDA11.4.1/Driver470.82.01/CUDNN8.2.4 那我基础镜像就应该选择 nvidia/cuda:11.4.1-base-ubuntu20.04
  • 需要安装一下 ffmpeg libsm6 libxext6 ,否则会报ImportError: libGL.so.1: cannot open shared object file: No such file or directoryStackoverflow 回答
  • 需要安装一下 libbz2-dev liblzma-dev,否则会报 No module named '_lzma'
  • 需要在 webui-user.sh 中设置下 export COMMANDLINE_ARGS="--skip-torch-cuda-test",否则不会通过 GPU 检查。
  • 需要使用非 root 用户运行 webui.sh,记住使用非 root 用户运行前,先对项目目录授权。
  • 因为 webui.sh 内集成了安装和运行,如果直接启动webui.sh会在最后一直卡住,所以需要在运行 webui.sh 加一下 --exit 参数。参数含义
  • 编译 docker 镜像时,会下载大量的境外资源,所以最好在海外服务器上。

下面是编译文件示例:

FROM nvidia/cuda:11.6.0-base-ubuntu20.04 AS builder

WORKDIR /

ENV TZ=Asia/Shanghai \
    DEBIAN_FRONTEND=noninteractive

RUN apt-get update && \
    apt-get install -y wget git bzip2 ca-certificates curl python3 python3-venv numactl libjemalloc-dev make automake gcc g++ subversion build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev libbz2-dev liblzma-dev ffmpeg libsm6 libxext6 && \
    git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git && cd stable-diffusion-webui && echo "export COMMANDLINE_ARGS=\"--skip-torch-cuda-test\"" >> webui-user.sh && \
    wget https://static.elias.ink/python/3/Python-3.10.6.tgz && tar -zvxf Python-3.10.6.tgz && cd Python-3.10.6/ && ./configure --enable-optimizations && make && make install && ln -s /usr/local/bin/python3.10 /usr/bin/python && \
    useradd -m -s /bin/bash diffusion && echo "diffusion:yupoo" | chpasswd && \
    chown -R diffusion /stable-diffusion-webui/

USER diffusion

WORKDIR /stable-diffusion-webui

RUN /bin/bash webui.sh --exit

CMD ["/bin/bash"]

直接运行 docker build -t ${your_image_name}:${you_image_tag} 慢慢等待编译即可。

image-20230317212943943

出现 Exiting because of --exit argument 就代表安装完成,只要耐心等待片刻即可。

基础环境安装

之后,需要设置下物理机来支持镜像的运行。

首先我们需要 docker 19.03 及以上的版本。安装教程可参考官方文档

安装之后,需要安装 NVIDIACUDA 及相关 GPU 驱动,这里我直接使用的阿里云的服务器,已经自动帮我安装好了。如果驱动安装正常,使用 nvidia-smi 可获得下面的输出。

image-20230317215337848

在上述操作完成后,需要安装 nvidia-docker 来使容器可以使用 GPU 资源。

我以两个主流操作系统为例展示如何安装 nvidia-docker

Ubuntu 20.02 安装 nvidia-docker

工具包的包存储库添加到系统:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
  && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
  && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

安装 nvidia-docker2

apt-get update && apt-get install -y nvidia-docker2

Centos 7 安装 nvidia-docker

工具包的包存储库添加到系统:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo

安装 nvidia-container-toolkit 以及 nvidia-docker2

sudo yum install -y nvidia-container-toolkit nvidia-docker2

安装后检测

安装完成后需要重启下 docker 进程,不管是 Centos 还是 Ubuntu 都执行下面的命令即可。

sudo systemctl restart docker

之后运行一个测试镜像来检测是否正常。

docker run -it --gpus all nvidia/cuda:11.4.0-base-ubuntu20.04 nvidia-smi

执行上面的命令会输出以下内容:

image-20230317215859283

之后,运行 stable-diffusion-webui 镜像:

docker run -it --gpus all cocytuselias2023/stable-diffusion-webui:cuda11.4.1-ubuntu20.04 /bin/bash webui.sh --share --no-half --enable-insecure-extension-access --xformers --gradio-queue

上面这个命令是在前台运行的。

docker run --gpus all cocytuselias2023/stable-diffusion-webui:cuda11.4.1-ubuntu20.04 /bin/bash webui.sh --share --no-half --enable-insecure-extension-access --xformers --gradio-queue

上面这个命令是在后台运行的。

启动后,会下一个 3.97Gsafetensors 文件。

image-20230317212731012

下载完成后,会给一个 Public URL ,这个地址是你的服务器即使不在公网上,只要能访问互联网就可以使用。像我的是https: //2bf2bdf1-6d8f-46c2.gradio.live

image-20230317213515640

然后就可以愉快的玩耍了。

image-20230317220934345

生成一个狗。

image-20230317221752755