傳統容器運行需要將全量鏡像資料下載後再解包,然而容器啟動可能僅使用其中部分的內容,導致容器啟動耗時間長度。通過Container Registry企業版的按需載入功能,允許僅下載和解壓容器啟動所必需的部分,而不是整個鏡像,從而大幅提高應用部署速度和提升彈性體驗。本文以Stable Diffusion應用為例,介紹如何基於ACR企業版實現AI鏡像構建及拉取加速功能。
前提條件
已建立Container RegistryACR企業版執行個體,且執行個體規格為進階版或標準版。具體操作,請參見建立企業版執行個體。
已完成使用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支援的代碼託管平台包括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的鏡像(不支援立即構建),更多資訊,請參見Regex命名擷取的群組。
說明設定正則規則後僅支援系統自動構建,不支援手動立即構建。
構建上下文目錄
設定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節點安裝鏡像加速組件。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在組件管理頁面,搜尋並定位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、配置鏡像倉庫專用網路
您需要前往Container Registry控制台配置ACK叢集的專用網路資訊,確保在ACK叢集中拉取鏡像時網路通暢。
在頂部功能表列,選擇所需地區。
單擊已建立的企業版執行個體,然後在左側導覽列,單擊倉庫管理 > 存取控制。
單擊添加專用網路,選擇ACK叢集的專用網路和鏡像節點的交換器,然後單擊確定。
添加後,等待專用網路列表的狀態列變更為已生效,表明添加成功。
說明您可以登入Container Service管理主控台,在叢集列表頁面,單擊目的地組群名稱,按照如下步驟擷取相應地址。
擷取ACK叢集專用網路:在左側導覽列,選擇叢集資訊,然後單擊叢集資源頁簽,查看叢集Virtual Private Cloud絡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擷取文生圖結果。首次使用可能會有卡頓情況,請耐心等待或重新整理頁面。