AI镜像构建及拉取加速方案

传统容器运行需要将全量镜像数据下载后再解包,然而容器启动可能仅使用其中部分的内容,导致容器启动耗时长。通过容器镜像服务企业版的按需加载功能,允许仅下载和解压容器启动所必需的部分,而不是整个镜像,从而大幅提高应用部署速度和提升弹性体验。本文以Stable Diffusion应用为例,介绍如何基于ACR企业版实现AI镜像构建及拉取加速功能。

前提条件

使用限制

金融云与政务云地域不支持按需加载功能。

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企业版实例仓库。开启镜像加速后,推送到该镜像仓库中的镜像都会被自动制作对应的加速转换镜像。

  1. 登录容器镜像服务控制台

  2. 在顶部菜单栏,选择所需地域。

  3. 单击已创建的企业版实例,然后在左侧导航栏,单击仓库管理 > 镜像仓库

  4. 单击创建镜像仓库,根据页面提示配置相关配置项,然后单击创建镜像仓库

    下文仅介绍主要配置项。详细信息,请参见步骤三:创建镜像仓库

    配置项

    说明及示例值

    控制台界面

    命名空间

    目标命名空间。

    image.png

    仓库名称

    目标仓库。

    镜像加速

    开启后,推送到该镜像仓库中的镜像都会被自动制作对应的加速转换镜像。

    本实践开启。

    摘要

    自定义摘要内容。

    代码源

    已完成ACR实例绑定且已创建Dockerfile的目标代码源。

    image.png

    构建设置

    开启代码变更时自动构建镜像和海外源智能加速。

    • 代码变更时自动构建镜像:当分支有代码提交后会自动触发构建规则。

    • 海外源智能加速:构建时会在海外机房构建,构建成功后推送到指定地域。如果您项目的Dockerfile文件需要从国外站点下载文件,但是跨境网络不稳定,您可以使用海外源智能加速

  5. 进入镜像仓库详情页面,在左侧导航栏,单击构建,在构建规则设置区域单击添加规则,在配置向导中按照页面提示配置相关信息,然后单击确定

    下文仅介绍主要配置项。详细信息,请参见步骤四:构建镜像

    配置项

    说明及示例值

    控制台界面

    类型

    设置源代码仓库的类型,可以是Branch或Tag。

    image.png

    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中捕获的内容。

    image.png

    架构配置

    选择构建架构和构建参数。本实践保持默认选项。

    image.png

  6. 构建页面的构建规则设置区域,单击目标规则操作列的立即构建

    image.png

    构建任务下发并创建成功后,您可以在下方构建日志区域查看状态。状态显示成功时,表明对应镜像构建成功。

    开启构建功能加速优化的情况下,本次构建耗时约30分钟左右。

  7. 镜像构建成功后,在左侧导航栏,单击镜像版本,查看镜像的加速版本(类型为加速镜像)和常规版本(类型为容器镜像)信息。

    image.png

    本仓库为镜像加速仓库,仓库下的镜像都会被自动制作对应的加速转换镜像。以上图为例,ACR已为您创建两个加速镜像和一个常规容器镜像。

  8. 在常规版本(类型为容器镜像)区域,单击版本,然后复制仓库地址,供后续在ACK集群中启用Stable Diffusion应用使用。

    image.png

步骤三:在ACK集群中加速Stable Diffusion应用启动

1、安装镜像加速组件

为启动加速容器,需要为集群Worker节点安装镜像加速组件。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

  3. 在组件管理页面,搜索并定位aliyun-acr-acceleration-suite组件,按照页面提示完成组件安装。

2、配置镜像节点池

测试本镜像加速功能时,您需要新建一个节点池。新建节点池时,您需要为节点添加镜像加速标签alibabacloud.com/image-accelerate-enabled: true,以便在节点初始化时开启镜像加速能力。

说明

标签alibabacloud.com/image-accelerate-enabled: true对存量节点不生效。推荐您创建单独的节点池以便统一管理具备镜像加速能力的节点。

  1. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

  2. 在页面右上角,单击创建节点池。在新建节点池时,创建1个CPU节点(期望节点数为1),规格为16 Core 32 GB及以上,并在高级配置区域为节点添加镜像加速标签,设置节点标签alibabacloud.com/image-accelerate-enabled: true

    具体操作,请参见创建节点池image.png

  3. 执行以下命令,检查集群中带有镜像加速标签的节点。

    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集群中拉取镜像时网络通畅。

  1. 登录容器镜像服务控制台

  2. 在顶部菜单栏,选择所需地域。

  3. 单击已创建的企业版实例,然后在左侧导航栏,单击仓库管理 > 访问控制

  4. 单击添加专有网络,选择ACK集群的专有网络和镜像节点的交换机,然后单击确定

    添加后,等待专有网络列表的状态列变更为已生效,表明添加成功。

    说明

    您可以登录容器服务管理控制台,在集群列表页面,单击目标集群名称,按照如下步骤获取相应地址。

    • 获取ACK集群专有网络:在左侧导航栏,选择集群信息,然后单击集群资源页签,查看集群虚拟专有网络VPC地址。

    • 获取镜像节点的交换机:在左侧导航栏,选择节点管理 > 节点池,单击目标节点池名称,然后单击基本信息页签,在节点配置区域,获取节点虚拟交换机地址。

4、在ACK集群Pro版中部署业务Pod

您可以通过YAML文件拉取ACR实例中的加速镜像,部署在ACK集群中,观察加速情况。

  1. 执行以下命令,创建Stable Diffusion应用所属的命名空间。

    kubectl create ns accelerate-ai-demo
  2. 执行以下命令,为Stable Diffusion应用的命名空间增加镜像加速标签。

    kubectl label namespaces accelerate-ai-demo k8s.aliyun.com/image-accelerate-mode=on-demand
  3. 执行以下命令,在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>
  4. 使用以下示例代码创建并保存stable-diffusion-ack-gpu-accelerate.yaml文件,用于部署名为tea的Deployment以及名为tea-svc的Service,以创建Stable Diffusion应用。

    展开查看完整示例代码

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: stable-diffusion
      name: stable-diffusion
      namespace: accelerate-ai-demo
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: stable-diffusion
      template:
        metadata:
          labels:
            app: stable-diffusion
        spec:
          containers:
          - args:
            - --listen
            - --skip-torch-cuda-test 
            - --no-half
            command:
            - python3
            - launch.py
            image: <Stable Diffusion业务镜像名称> # ACR实例仓库中获取的Stable Diffusion业务镜像的仓库地址。
            imagePullPolicy: Always
            name: stable-diffusion
            ports:
            - containerPort: 7860
              protocol: TCP
            readinessProbe:
              tcpSocket:
                port: 7860
            resources:
              requests:
                cpu: "8"
                memory: 16Gi
                ephemeral-storage: 50Gi
          imagePullSecrets:
            - name: acr-credential-test
    ---
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: internet
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-instance-charge-type: PayByCLCU
      name: stable-diffusion
      namespace: accelerate-ai-demo
    spec:
      externalTrafficPolicy: Local
      ports:
      - port: 7860
        protocol: TCP
        targetPort: 7860
      selector:
        app: stable-diffusion
      type: LoadBalancer
  5. 执行以下命令,部署Stable Diffusion应用。

    kubectl apply -f stable-diffusion-ack-gpu-accelerate.yaml
  6. 执行以下命令,查看Stable Diffusion应用Pod容器状态。

    kubectl -n accelerate-ai-demo get pod

    预期输出:

    NAME                                READY   STATUS    RESTARTS   AGE
    stable-diffusion-75759ff59f-hw5zm   1/1     Running   0          73s
  7. 执行以下命令,查看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服务的启动时间。

步骤五:结果验证

  1. 执行以下命令,查看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值。

  2. 执行以下curl命令,测试Stable Diffusion服务的响应。

    请将<EXTERNAL-IP>替换为上一步获取到的EXTERNAL-IP值。

    curl http://<EXTERNAL-IP>:7860/ 

    您也可以直接使用http://<EXTERNAL-IP>:7860/在浏览器中访问。在左上角,选择checkpoint,然后在Prompt区域输入内容,单击Generate获取文生图结果。

    首次使用可能会有卡顿情况,请耐心等待或刷新页面。

    image.png