全部產品
Search
文件中心

Container Service for Kubernetes:AI鏡像構建及拉取加速方案

更新時間:Jun 19, 2024

傳統容器運行需要將全量鏡像資料下載後再解包,然而容器啟動可能僅使用其中部分的內容,導致容器啟動耗時間長度。通過Container Registry企業版的按需載入功能,允許僅下載和解壓容器啟動所必需的部分,而不是整個鏡像,從而大幅提高應用部署速度和提升彈性體驗。本文以Stable Diffusion應用為例,介紹如何基於ACR企業版實現AI鏡像構建及拉取加速功能。

前提條件

使用限制

金融雲與政務雲地區不支援按需載入功能。

Stable Diffusion介紹

Stable Diffusion WebUI是Github上一個熱門專案,可以通過文本產生映像。Stable Diffusion分為文字理解和圖片產生兩個部分。文字理解部分使用CLIP模型對文本進行Encoding,圖片產生採用Diffusion模型。

重要
  • 阿里雲不對第三方模型“Stable Diffusion”的合法性、安全性、準確性進行任何保證,阿里雲不對由此引發的任何損害承擔責任。

  • 您應自覺遵守第三方模型“Stable Diffusion”的使用者協議、使用規範和相關法律法規,並就使用第三方模型的合法性、合規性自行承擔相關責任。

步驟一:在原始碼平台中建立Dockerfile檔案

使用ACR企業版執行個體構建鏡像時,您需要綁定一個原始碼託管平台。ACR支援的代碼託管平台包括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. 登入Container Registry控制台

  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的鏡像(不支援立即構建),更多資訊,請參見Regex命名擷取的群組

    說明

    設定正則規則後僅支援系統自動構建,不支援手動立即構建。

    構建上下文目錄

    設定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. 登入Container Service管理主控台,在左側導覽列選擇叢集

  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、配置鏡像倉庫專用網路

您需要前往Container Registry控制台配置ACK叢集的專用網路資訊,確保在ACK叢集中拉取鏡像時網路通暢。

  1. 登入Container Registry控制台

  2. 在頂部功能表列,選擇所需地區。

  3. 單擊已建立的企業版執行個體,然後在左側導覽列,單擊倉庫管理 > 存取控制

  4. 單擊添加專用網路,選擇ACK叢集的專用網路和鏡像節點的交換器,然後單擊確定

    添加後,等待專用網路列表的狀態列變更為已生效,表明添加成功。

    說明

    您可以登入Container Service管理主控台,在叢集列表頁面,單擊目的地組群名稱,按照如下步驟擷取相應地址。

    • 擷取ACK叢集專用網路:在左側導覽列,選擇叢集資訊,然後單擊叢集資源頁簽,查看叢集Virtual Private Cloud絡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