背景介绍
Stable Diffusion 是于 2022 年发布的文本到图像的潜在扩散模型,它可以根据文本提示词产生对应的图像。Stable Diffusion 模型是扩散模型的变种,可以通过逐步对随机高斯噪声进行去噪以获得感兴趣的样本。与传统生成模型相比,Stable Diffusion 可以在不需要复杂训练过程或大量数据集的情况下生成出真实感强、细节丰富的图像。目前该项目已经应用于多种场景,包括计算机视觉、数字艺术、视频游戏等领域。
本文将基于阿里云 AMD 服务器和龙蜥 AI 容器服务,快速搭建出个人版文生图服务。
创建 ECS 实例
创建 ECS 实例时需要根据模型的大小对实例规格进行选择。由于整个模型的推理过程需要耗费大量的计算资源,运行时内存占用大量内存,为了保证模型运行的稳定,实例规格选择 ecs.g8a.16xlarge。同时,Stable Diffusion 的运行需要下载多个模型文件,会占用大量存储空间,在创建实例时,存储盘至少分配 100 GB。最后,为了保证环境安装以及模型下载的速度,实例带宽分配 100 Mbps。
实例操作系统选择 Alibaba Cloud Linux 3.2104 LTS 64 位。
创建 Docker 运行环境
安装 Docker
在 Alibaba Cloud Linux 3 上安装 Docker 可以参考 安装Docker并使用(Linux)。安装完成后请确保 Docker 守护进程已经启用。
systemctl status docker
创建并运行 PyTorch AI 容器
龙蜥社区提供了丰富的基于 Anolis OS 的容器镜像,其中就包括针对 AMD 优化的 PyTorch 镜像,可以使用该镜像直接创建一个 PyTorch 运行环境。
docker pull registry.openanolis.cn/openanolis/pytorch-amd:1.13.1-23-zendnn4.1 docker run -d -it --name pytorch-amd --net host -v $HOME:/root registry.openanolis.cn/openanolis/pytorch-amd:1.13.1-23-zendnn4.1
以上命令首先拉取容器镜像,随后使用该镜像创建一个以分离模式运行的,名为pytorch-amd
的容器,并将用户的家目录映射到容器中,以保留开发内容。
手动部署流程
进入容器环境
PyTorch 容器创建运行后,使用以下命令进入容器环境。
docker exec -it -w /root pytorch-amd /bin/bash
后续命令需在容器环境中执行,如意外退出,请使用以上命令重新进入容器环境。如需查看当前环境是否为容器,可以使用以下命令查询。
cat /proc/1/cgroup | grep docker # 有回显信息则为容器环境
软件安装配置
在部署 Stable Diffusion 之前,需要安装一些必备软件。
yum install -y git git-lfs wget mesa-libGL gperftools-libs
后续下载预训练模型需要启用 Git LFS 的支持。
git lfs install
下载源码与预训练模型
下载 Stable Diffusion web UI 的源码。
git clone -b v1.5.2 https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
Stable Diffusion web UI 在部署过程中需要克隆多个代码仓库,由于克隆过程受到网络波动,可能会出现失败。
mkdir stable-diffusion-webui/repositories && cd $_ git clone https://github.com/Stability-AI/stablediffusion.git stable-diffusion-stability-ai git clone https://github.com/Stability-AI/generative-models.git generative-models git clone https://github.com/crowsonkb/k-diffusion.git k-diffusion git clone https://github.com/sczhou/CodeFormer.git CodeFormer git clone https://github.com/salesforce/BLIP.git BLIP
所有代码仓库克隆成功后,需要将各代码仓库切换到指定分支,以保证生成结果的稳定。
git -C stable-diffusion-stability-ai checkout cf1d67a6fd5ea1aa600c4df58e5b47da45f6bdbf git -C generative-models checkout 5c10deee76adad0032b412294130090932317a87 git -C k-diffusion checkout c9fe758757e022f05ca5a53fa8fac28889e4f1cf git -C CodeFormer checkout c5b4593074ba6214284d6acd5f1719b6c5d739af git -C BLIP checkout 48211a1594f1321b00f14c9f7a5b4813144b2fb9
在 Stable Diffusion 运行时,需要使用到预训练模型,由于模型文件较大(约 11G),这里将手动下载预训练模型。
cd ~ && mkdir -p stable-diffusion-webui/models/Stable-diffusion wget "https://www.modelscope.cn/api/v1/models/AI-ModelScope/stable-diffusion-v1-5/repo?Revision=master&FilePath=v1-5-pruned-emaonly.safetensors" -O stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safetensors mkdir -p ~/stable-diffusion-webui/models/clip git clone --depth=1 https://gitee.com/modelee/clip-vit-large-patch14.git ~/stable-diffusion-webui/models/clip/clip-vit-large-patch14
由于 Stable Diffusion 运行时需要从 HuggingFace 下载 ViT 多模态模型,由于该模型已经使用国内镜像下载,需要修改脚本文件直接从本地调用该模型。
sed -i "s?openai/clip-vit-large-patch14?${HOME}/stable-diffusion-webui/models/clip/clip-vit-large-patch14?g" ~/stable-diffusion-webui/repositories/stable-diffusion-stability-ai/ldm/modules/encoders/modules.py
部署运行环境
在部署 Python 环境之前,可以更换 pip 下载源,加快依赖包的下载速度。
mkdir -p ~/.config/pip && cat > ~/.config/pip/pip.conf <<EOF [global] index-url=http://mirrors.cloud.aliyuncs.com/pypi/simple/ [install] trusted-host=mirrors.cloud.aliyuncs.com EOF
安装 Python 运行依赖。
pip install cython gfpgan open-clip-torch==2.8.0 httpx==0.24.1 pip install git+https://github.com/openai/CLIP.git@d50d76daa670286dd6cacf3bcd80b5e4823fc8e1
为了保证 ZenDNN 可以完全释放 CPU 算力,需要设置两个环境变量:OMP_NUM_THREADS
、GOMP_CPU_AFFINITY
。
cat > /etc/profile.d/env.sh <<EOF export OMP_NUM_THREADS=\$(nproc --all) export GOMP_CPU_AFFINITY=0-\$(( \$(nproc --all) - 1 )) EOF source /etc/profile
最后运行脚本自动化部署 Stable Diffusion 的运行环境。
cd ~/stable-diffusion-webui venv_dir="-" ./webui.sh -f --skip-torch-cuda-test --exit
运行网页版 Demo
在项目源码中提供了网页版 Demo,可以用来和 Stable Diffusion 进行实时交互。
export LD_PRELOAD=/usr/lib64/libtcmalloc.so.4 export venv_dir="-" python3 launch.py -f --skip-torch-cuda-test --skip-version-check --no-half --precision full --use-cpu all --listen
部署完成后可以通过 http://<ECS 公网 IP>:7860
来访问服务。