跳到主要内容

使用弹性容器集群部署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