跳到主要内容

使用弹性容器集群部署stable-diffuision-webui

Stable Diffusion WebUI 是一个基于 Stable Diffusion 模型的图形用户界面,使得用户可以更容易地生成和编辑图像。
Stable Diffusion 是一种深度学习模型,专门用于生成高质量的图像。通过 WebUI,用户可以方便地调整参数、运行生成任务,并查看结果。 本文介绍如何使用弹性容器集群,快速部署Stable Diffusion WebUI。

前置条件

安装docker,请参考安装Docker
开通弹性容器集群
连接弹性容器集群,具体请参考使用弹性容器集群

方案概述

  1. 准备镜像,并推送镜像仓库
  2. 下载模型文件,并上传对象存储管理
  3. 声明命名空间
  4. 创建密钥,用于容器从镜像仓库拉取镜像
  5. 创建容器,从对象存储下载模型文件,放置在容器代码指定的位置
  6. 创建服务
  7. 发布服务

image

操作步骤

准备镜像

关于镜像仓库使用,请参考镜像仓库的使用
用户名密码:查看开通镜像仓库时的通知短信
镜像仓库地址:由 访问域名/项目 组成

拉取源镜像

在开始部署前,需要先拉取Stable Diffusion WebUI的源镜像,然后根据部署需求,以源镜像为基础镜像,自定义镜像。
拉取源镜像:

docker pull freeze1111/stable-diffusion-webui

自定义镜像文件

可以把一些工具打包到镜像里,如:rclone,curl,vim 等。
rclone.conf 需要与Dockerfile文件放在同一目录下。

FROM freeze1111/stable-diffusion-webui:latest
ARG VERSION=3.0

# 切换回root用户来安装软件
USER root

# 安装rclone, curl, vim, ping 和 sudo
RUN apt-get update && apt-get install -y rclone curl vim iputils-ping sudo && \
apt-get clean && rm -rf /var/lib/apt/lists/*

# 拷贝rclone配置文件,这个镜像里的用户为"user",所以将配置文件拷贝至"user"用户的home路径下
COPY rclone.conf /home/user/.config/rclone/

# 切换回之前的非root用户, 保持原有的工作目录和用户
WORKDIR /workspace
USER user

# 保留原有的启动命令
CMD ["sh", "-c", "./webui.sh --listen --no-download-sd-model"]

重打自定义镜像

docker build -t 镜像仓库地址/freeze1111/stable-diffusion-webui:5.0 .

推送到镜像仓库:

docker login 域名 -u username -p password

docker push 镜像仓库地址/freeze1111/stable-diffusion-webui:5.0

下载模型文件

本文档部署示例需要两个模型 clip-vit-large-patch14 和 stable-diffusion-v1-5
模型文件下载可以有多种渠道,如 modelscopehuggingface
本文从modelscope下载模型文件, 以stable-diffusion-v1-5为例,下载方法如下:

pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple

modelscope download --model AI-ModelScope/stable-diffusion-v1-5

将下载的模型文件,上传到对象存储,对象存储的使用请参考对象存储的使用

创建命名空间

# 创建namespace
kubectl create namespace sd-test

创建密钥

具体创建方式参考使用指南->弹性容器集群->创建密钥
此处我们创建名称为 sd-harbor-secret 的密钥,所属命名空间为 sd-test

  apiVersion: v1
kind: Secret
metadata:
name: sd-harbor-secret
namespace: sd-test
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: base64编码后的docker config.json内容

创建容器

以deployment方式,管理pod,创建容器

# sd_deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: sd-deploy
namespace: sd-test
labels:
app: sd
spec:
replicas: 1 # 指定你希望运行的副本数量
selector:
matchLabels:
app: sd
template:
metadata:
labels:
app: sd
spec:
restartPolicy: Always
securityContext:
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
containers:
- name: sd-cuda-container
image: registry.hd-01.alayanew.com:8443/vc-huangxs/freeze1111/stable-diffusion-webui:5.0 # 替换成你的镜像
resources:
requests:
memory: "100G"
cpu: "18"
nvidia.com/gpu-l40s: 1
limits:
memory: "100G"
cpu: "18"
nvidia.com/gpu-l40s: 1
ports:
- containerPort: 7860
name: http-port
protocol: TCP
volumeMounts:
- name: data-vol
mountPath: "/workspace/models/Stable-diffusion"
subPath: "workspacemodels/Stable-diffusion"
- name: data-vol
mountPath: "/home/user/.cache/huggingface/hub"
subPath: "home/user/.cache/huggingface/hub"
- name: data-vol
mountPath: "/workspace/output"
imagePullSecrets:
- name: sd-harbor-secret
volumes:
- name: data-vol
persistentVolumeClaim:
claimName: pvc-capacity-userdata

进入pod中,从对象存储中下载模型文件

# 下载stable-diffusion模型文件到/workspacemodels/Stable-diffusion目录
rclone -v copy [my-s3:/models01/stable-diffusion-v1-5.tar.gz] /workspacemodels/Stable-diffusion

# 下载huggingface模型文件到/home/user/.cache/huggingface/hub目录
rclone -v copy [my-s3:/models01/models--openai--clip-vit-large-patch14.tar.gz] /home/user/.cache/huggingface/hub

# 解压stable-diffusion模型文件
cd /workspacemodels/Stable-diffusion
tar -xzvf stable-diffusion-v1-5.tar.gz

# 解压huggingface模型文件
cd /home/user/.cache/huggingface/hub
tar -xzvf models--openai--clip-vit-large-patch14.tar.gz

注意:在pod中从对象存储下载模型文件时,请将一下信息替换为你实际的存储位置:

示例路径实际路径
my-s3:/models01/stable-diffusion-v1-5.tar.gz实际对象存储存放路径
my-s3:/models01/models--openai--clip-vit-large-patch14.tar.gz实际对象存储存放路径

创建服务

具体参考使用指南->弹性容器集群->创建服务
此处创建如下服务:

服务名命名空间标签服务端口目标端口
sd-svcsd-testapp: sd88887860

发布服务

具体参数使用指南->弹性容器集群->发布服务
此处发布服务参数:

serviceExporterName命名空间服务名称服务端口
sd-svc-exportersd-testsd-svc8888

执行如下命令,获取服务域名

kubectl describe serviceexporter  sd-svc-exporter -n sd-test

执行结果如图:
image

上图中url,拼接内置端口22443
得到实际访问服务域名:https://sd-svc-x-sd-test-x-vc2qofwoe524.sproxy.hd-01.alayanew.com:22443 访问服务,结果如下:
image