傳統容器運行需要將全量鏡像數據下載后再解包,然而容器啟動可能僅使用其中部分的內容,導致容器啟動耗時長。通過容器鏡像服務企業版的按需加載功能,允許僅下載和解壓容器啟動所必需的部分,而不是整個鏡像,從而大幅提高應用部署速度和提升彈性體驗。本文以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應用。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
執行以下命令,部署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獲取文生圖結果。首次使用可能會有卡頓情況,請耐心等待或刷新頁面。