传统容器运行需要将全量镜像数据下载后再解包,然而容器启动可能仅使用其中部分的内容,导致容器启动耗时长。通过容器镜像服务企业版的按需加载功能,允许仅下载和解压容器启动所必需的部分,而不是整个镜像,从而大幅提高应用部署速度和提升弹性体验。本文以Stable Diffusion应用为例,介绍如何基于ACR企业版实现AI镜像构建及拉取加速功能。
前提条件
已创建容器镜像服务ACR企业版实例,且实例规格为高级版或标准版。具体操作,请参见创建企业版实例。
已完成使用ACR企业版实例的前置工作,包括绑定源代码平台、创建命名空间、创建镜像仓库等。具体操作,请参见使用企业版实例构建镜像的步骤一至三。
已创建ACK集群Pro版。具体操作,请参见创建Kubernetes托管版集群。
已通过kubectl连接kubernetes集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
使用限制
金融云与政务云地域不支持按需加载功能。
Stable Diffusion介绍
Stable Diffusion WebUI是Github上一个热门项目,可以通过文本生成图像。Stable Diffusion分为文字理解和图片生成两个部分。文字理解部分使用CLIP模型对文本进行Encoding,图片生成采用Diffusion模型。
阿里云不对第三方模型“Stable Diffusion”的合法性、安全性、准确性进行任何保证,阿里云不对由此引发的任何损害承担责任。
您应自觉遵守第三方模型“Stable Diffusion”的用户协议、使用规范和相关法律法规,并就使用第三方模型的合法性、合规性自行承担相关责任。
步骤一:在源代码平台中创建Dockerfile文件
使用ACR企业版实例构建镜像时,您需要绑定一个源代码托管平台。ACR支持的代码托管平台包括阿里云Codeup、Gitee、GitHub、GitLab。
根据前提条件绑定源代码平台后,您需在对应平台创建Dockerfile,供后续拉取Stable Diffusion应用镜像使用。示例代码如下。
FROM yunqi-registry.cn-shanghai.cr.aliyuncs.com/lab/stable-diffusion:model-only-v1.5 as model
FROM docker.io/nvidia/cuda:12.1.0-cudnn8-runtime-ubuntu22.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \
libgl1 libglib2.0-0 wget git curl vim python3.10 python3-venv && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
RUN git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git && \
cd stable-diffusion-webui && git checkout v1.6.0
COPY --from=model /data/v1-5-pruned-emaonly.safetensors /stable-diffusion-webui/models/Stable-diffusion/
COPY --from=model /root/.cache/huggingface /root/.cache/huggingface
WORKDIR /stable-diffusion-webui/
RUN ./webui.sh -f can_run_as_root --exit --skip-torch-cuda-test
ENV VIRTUAL_ENV=/stable-diffusion-webui/venv
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
CMD ["python3", "launch.py", "--listen --skip-torch-cuda-test --no-half"]
步骤二:使用ACR企业版加速构建Stable Diffusion应用
本小节将创建一个带有镜像加速能力的ACR企业版实例仓库。开启镜像加速后,推送到该镜像仓库中的镜像都会被自动制作对应的加速转换镜像。
登录容器镜像服务控制台。
在顶部菜单栏,选择所需地域。
单击已创建的企业版实例,然后在左侧导航栏,单击仓库管理 > 镜像仓库。
单击创建镜像仓库,根据页面提示配置相关配置项,然后单击创建镜像仓库。
下文仅介绍主要配置项。详细信息,请参见步骤三:创建镜像仓库。
配置项
说明及示例值
控制台界面
命名空间
目标命名空间。
仓库名称
目标仓库。
镜像加速
开启后,推送到该镜像仓库中的镜像都会被自动制作对应的加速转换镜像。
本实践开启。
摘要
自定义摘要内容。
代码源
已完成ACR实例绑定且已创建Dockerfile的目标代码源。
构建设置
开启代码变更时自动构建镜像和海外源智能加速。
代码变更时自动构建镜像:当分支有代码提交后会自动触发构建规则。
海外源智能加速:构建时会在海外机房构建,构建成功后推送到指定地域。如果您项目的Dockerfile文件需要从国外站点下载文件,但是跨境网络不稳定,您可以使用海外源智能加速。
进入镜像仓库详情页面,在左侧导航栏,单击构建,在构建规则设置区域单击添加规则,在配置向导中按照页面提示配置相关信息,然后单击确定。
下文仅介绍主要配置项。详细信息,请参见步骤四:构建镜像。
配置项
说明及示例值
控制台界面
类型
设置源代码仓库的类型,可以是Branch或Tag。
Branch/Tag
选择或者填写Branch/Tag,支持正则规则。当正则规则为release-(?<imageTag>\w*)时,将识别release-v1源代码变更并自动构建版本为v1的镜像(不支持立即构建),更多信息,请参见正则表达式命名捕获组。
说明设置正则规则后仅支持系统自动构建,不支持手动立即构建。
构建上下文目录
设置Dockerfile文件所在的目录。指的是相对目录,以Branch/Tag的根目录为父目录,例如您的Branch为master,您的Dockerfile文件放在master下,则您的Dockerfile目录为/。
Dockerfile文件名
设置Dockerfile文件名,默认为Dockerfile。
镜像版本
设置镜像Tag,例如1.0.0。支持命名捕获,例如使用Branch/Tag中捕获的内容。
架构配置
选择构建架构和构建参数。本实践保持默认选项。
在构建页面的构建规则设置区域,单击目标规则操作列的立即构建。
构建任务下发并创建成功后,您可以在下方构建日志区域查看状态。状态显示成功时,表明对应镜像构建成功。
开启构建功能加速优化的情况下,本次构建耗时约30分钟左右。
镜像构建成功后,在左侧导航栏,单击镜像版本,查看镜像的加速版本(类型为加速镜像)和常规版本(类型为容器镜像)信息。
本仓库为镜像加速仓库,仓库下的镜像都会被自动制作对应的加速转换镜像。以上图为例,ACR已为您创建两个加速镜像和一个常规容器镜像。
在常规版本(类型为容器镜像)区域,单击版本,然后复制仓库地址,供后续在ACK集群中启用Stable Diffusion应用使用。
步骤三:在ACK集群中加速Stable Diffusion应用启动
1、安装镜像加速组件
为启动加速容器,需要为集群Worker节点安装镜像加速组件。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在组件管理页面,搜索并定位aliyun-acr-acceleration-suite组件,按照页面提示完成组件安装。
2、配置镜像节点池
测试本镜像加速功能时,您需要新建一个节点池。新建节点池时,您需要为节点添加镜像加速标签alibabacloud.com/image-accelerate-enabled: true
,以便在节点初始化时开启镜像加速能力。
标签alibabacloud.com/image-accelerate-enabled: true
对存量节点不生效。推荐您创建单独的节点池以便统一管理具备镜像加速能力的节点。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在页面右上角,单击创建节点池。在新建节点池时,创建1个CPU节点(期望节点数为1),规格为16 Core 32 GB及以上,并在高级配置区域为节点添加镜像加速标签,设置节点标签为
alibabacloud.com/image-accelerate-enabled: true
。具体操作,请参见创建节点池。
执行以下命令,检查集群中带有镜像加速标签的节点。
kubectl get nodes -l alibabacloud.com/image-accelerate-enabled=true
预期输出:
NAME STATUS ROLES AGE VERSION cn-hangzhou.172.XX.XX.115 Ready <none> 2m33s v1.24.6-aliyun.1
3、配置镜像仓库专有网络
您需要前往容器镜像服务控制台配置ACK集群的专有网络信息,确保在ACK集群中拉取镜像时网络通畅。
登录容器镜像服务控制台。
在顶部菜单栏,选择所需地域。
单击已创建的企业版实例,然后在左侧导航栏,单击仓库管理 > 访问控制。
单击添加专有网络,选择ACK集群的专有网络和镜像节点的交换机,然后单击确定。
添加后,等待专有网络列表的状态列变更为已生效,表明添加成功。
说明您可以登录容器服务管理控制台,在集群列表页面,单击目标集群名称,按照如下步骤获取相应地址。
获取ACK集群专有网络:在左侧导航栏,选择集群信息,然后单击集群资源页签,查看集群虚拟专有网络VPC地址。
获取镜像节点的交换机:在左侧导航栏,选择
,单击目标节点池名称,然后单击基本信息页签,在节点配置区域,获取节点虚拟交换机地址。
4、在ACK集群Pro版中部署业务Pod
您可以通过YAML文件拉取ACR实例中的加速镜像,部署在ACK集群中,观察加速情况。
执行以下命令,创建Stable Diffusion应用所属的命名空间。
kubectl create ns accelerate-ai-demo
执行以下命令,为Stable Diffusion应用的命名空间增加镜像加速标签。
kubectl label namespaces accelerate-ai-demo k8s.aliyun.com/image-accelerate-mode=on-demand
执行以下命令,在
accelerate-ai-demo
命名空间中创建acr-credential-test,用于拉取镜像密码。请将以下代码中的
<yourInstanceName>-<registry-vpc.cn-hangzhou.cr.aliyuncs.com>
替换为ACR镜像仓库地址,<yourUserName>
替换为阿里云账号名称,<yourPassword>
替换为ACR实例的访问密码。kubectl -n accelerate-ai-demo create secret docker-registry acr-credential-test --docker-server=<yourInstanceName>-<registry-vpc.cn-hangzhou.cr.aliyuncs.com> --docker-username=<yourUserName> --docker-password=<yourPassword>
使用以下示例代码创建并保存
stable-diffusion-ack-gpu-accelerate.yaml
文件,用于部署名为tea
的Deployment以及名为tea-svc
的Service,以创建Stable Diffusion应用。执行以下命令,部署Stable Diffusion应用。
kubectl apply -f stable-diffusion-ack-gpu-accelerate.yaml
执行以下命令,查看Stable Diffusion应用Pod容器状态。
kubectl -n accelerate-ai-demo get pod
预期输出:
NAME READY STATUS RESTARTS AGE stable-diffusion-75759ff59f-hw5zm 1/1 Running 0 73s
执行以下命令,查看Stable Diffusion应用Pod详情。
kubectl -n accelerate-ai-demo describe pod <pod-name>
预期输出:
... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 23s default-scheduler Successfully assigned accelerate-ai-demo/stable-diffusion-75ff55794f-5mj8p to cn-hangzhou.172.16.7.99 Normal AllocIPSucceed 19s terway-daemon Alloc IP 172.16.7.115/24 Normal Pulling 19s kubelet Pulling image "XXX" Normal Pulled 17s kubelet Successfully pulled image "XXX" in 1.61s (1.61s including waiting) Normal Created 17s kubelet Created container stable-diffusion Normal Started 16s kubelet Started container stable-diffusion
预期输出表明,约7s后,Stable Diffusion服务完全可用(具体时间以您的实际操作环境为准)。
在未开启镜像加速的情况下,使用ACK集群拉取此镜像约耗时4分钟(具体时间以实际操作环境为准)。对比可得,开启镜像加速能力后,ACK集群中拉取业务镜像时间大大缩短,有效减少了Stable Diffusion服务的启动时间。
步骤五:结果验证
执行以下命令,查看Stable Diffusion应用Pod的Service详情,记录External IP供下一步访问应用使用。
kubectl -n accelerate-ai-demo get svc
预期输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE stable-diffusion LoadBalancer 172.XX.XX.163 121.XX.XX.64 7860:32621/TCP 116s
记录
EXTERNAL-IP
值。执行以下curl命令,测试Stable Diffusion服务的响应。
请将
<EXTERNAL-IP>
替换为上一步获取到的EXTERNAL-IP
值。curl http://<EXTERNAL-IP>:7860/
您也可以直接使用
http://<EXTERNAL-IP>:7860/
在浏览器中访问。在左上角,选择checkpoint,然后在Prompt区域输入内容,单击Generate获取文生图结果。首次使用可能会有卡顿情况,请耐心等待或刷新页面。