您可以在ACK叢集使用阿里雲第八代企業級執行個體ECS g8i作為Worker節點,並結合IPEX技術來加速文生圖模型的推理速度。您也可以在叢集中建立TDX機密虛擬機器節點池,並將樣本服務遷移至其中,提升推理服務資料的安全性。本文以Stable Diffusion XL Turbo模型為例,介紹如何在合理運用CPU加速策略和模型推理的前提下,基於g8i CPU執行個體獲得類似於GPU執行個體的使用體驗,實現穩定、高效、高性價比且安全機密的文生圖服務。
背景資訊
阿里雲第八代企業級執行個體g8i
阿里雲第八代企業級通用計算執行個體ECS g8i採用CIPU+飛天技術架構,搭載最新的Intel第五代至強可擴充處理器(代號EMR),效能進一步提升。同時,ECS g8i執行個體擁有AMX加持的AI能力增強,擁有AI增強和全面安全防護的兩大特色優勢。此外,ECS g8i執行個體全量支援Intel® TDX技術能力。您無需更改業務應用代碼,即可將工作負載部署到可信執行環境(TEE,Trusted Execution Environment)中,不僅能有效降低技術門檻,還支援以極低的效能損耗為大模型等AI應用提供隱私增強算力。請參見通用型執行個體規格類型系列g8i。
Intel® TDX
Intel® TDX是一項基於CPU硬體的Elastic Compute Service保護技術,TDX執行個體的CPU寄存器、記憶體資料、中斷處理等均受到CPU硬體的機密保護,雲廠商和外部攻擊者均無法監控或篡改TDX執行個體的內部運行狀態(如啟動並執行進程、計算中的敏感性資料等)。關於Intel® TDX技術的更多資訊,請參見Intel® Trusted Domain Extension(Intel® TDX)。
Intel® TDX可以為您的執行個體和應用提供預設的安全保護,即您可以將現有應用隨即轉移至TDX執行個體上並獲得TDX能力帶來的安全保護,而無需重新開發現有的應用程式。
IPEX
Intel® Extension for PyTorch(IPEX)是由Intel開源並維護的一個PyTorch擴充庫,大幅度提升了使用PyTorch在Intel處理器上運行AI應用,尤其是深度學習應用的效能。Intel正不斷為PyTorch貢獻IPEX的最佳化效能,為PyTorch社區提供最新的Intel硬體和軟體改進。更多資訊,請參見IPEX。
阿里雲不對第三方模型“Stable Diffusion”和“stabilityai/sdxl-turbo”的合法性、安全性、準確性進行任何保證,阿里雲不對由此引發的任何損害承擔責任。
您應自覺遵守第三方模型的使用者協議、使用規範和相關法律法規,並就使用第三方模型的合法性、合規性自行承擔相關責任。
本文的樣本服務僅用於教程實踐、功能測試、POC等情境,其結果資料僅為參考值,實際資料可能會因您的作業環境而發生變化。
前提條件
已在華北2(北京)地區建立一個ACK叢集Pro版。具體操作,請參見建立Kubernetes託管版叢集。
準備節點池
普通節點池:已在叢集內建立一個使用阿里雲第八代企業級執行個體g8i的節點池,且滿足以下要求:
地區及可用性區域:在ECS執行個體支援的地區和可用性區域內。更多資訊,請參見ECS執行個體規格可購買地區總覽。
執行個體規格:CPU為16 vCPU及以上,推薦使用
ecs.g8i.4xlarge
、ecs.g8i.8xlarge或ecs.g8i.12xlarge
。磁碟空間:節點池內節點可用磁碟空間為200GiB以上(可設定節點系統硬碟大於200GiB或者增加一塊大於200GiB的資料盤)。
TDX機密計算節點池:如您需要將樣本應用無縫遷移到TDX機密計算節點池,為推理服務提供資料安全保護,準備工作請參見前提條件。
已通過kubectl工具串連叢集。具體操作,請參見通過kubectl串連Kubernetes叢集。
步驟一:準備Stable Diffusion XL Turbo模型
本樣本服務使用的Stable Diffusion XL Turbo模型為stabilityai/sdxl-turbo
。
操作步驟
使用官方stabilityai/sdxl-turbo
模型
將以下範例程式碼儲存為values.yaml檔案。您也可以根據叢集節點池內的執行個體規格來調整資源配置。
resources:
limits:
cpu: "16"
memory: 32Gi
requests:
cpu: "14"
memory: 24Gi
自訂stabilityai/sdxl-turbo
模型
您可以使用儲存在OSS上的自訂stabilityai/sdxl-turbo
模型。請建立具有OSS存取權限的RAM使用者並擷取其AccessKey,供下文步驟使用。
操作步驟
將以下範例程式碼儲存為models-oss-secret.yaml。
apiVersion: v1 kind: Secret metadata: name: models-oss-secret namespace: default stringData: akId: <yourAccessKeyID> # 替換為RAM使用者的AccessKey ID。 akSecret: <yourAccessKeySecret> # 替換為RAM使用者的AccessKey Secret。
執行以下命令,建立Secret。
kubectl create -f models-oss-secret.yaml
預期輸出:
secret/models-oss-secret created
將以下內容儲存為models-oss-pv.yaml。
apiVersion: v1 kind: PersistentVolume metadata: name: models-oss-pv labels: alicloud-pvname: models-oss-pv spec: capacity: storage: 50Gi accessModes: - ReadOnlyMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: models-oss-pv nodePublishSecretRef: name: models-oss-secret namespace: default volumeAttributes: bucket: "<yourBucketName>" # 替換為待掛載的OSS Bucket的名稱。 url: "<yourOssEndpoint>" # 替換為待掛載的OSS的接入網域名稱,推薦使用內網地址。本樣本使用oss-cn-beijing-internal.aliyuncs.com。 otherOpts: "-o umask=022 -o max_stat_cache_size=0 -o allow_other" path: "/models" # 模型存放路徑,該路徑下需要存在stabilityai/sdxl-turbo目錄。
關於OSS參數配置的更多資訊,請參見方式一:使用Secret建立靜態卷PV及PVC。
執行以下命令建立靜態卷PV。
kubectl create -f models-oss-pv.yaml
預期輸出:
persistentvolume/models-oss-pv created
將以下內容儲存為models-oss-pvc.yaml。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: models-oss-pvc spec: accessModes: - ReadOnlyMany resources: requests: storage: 50Gi selector: matchLabels: alicloud-pvname: models-oss-pv
執行以下命令建立靜態卷PVC。
kubectl create -f models-oss-pvc.yaml
預期輸出:
persistentvolumeclaim/models-oss-pvc created
將以下範例程式碼儲存為values.yaml。
您可以根據叢集節點池內的執行個體規格調整來資源配置。
resources: limits: cpu: "16" memory: 32Gi requests: cpu: "14" memory: 24Gi useCustomModels: true volumes: models: name: data-volume persistentVolumeClaim: claimName: models-oss-pvc
服務部署組態說明values.yaml
步驟二:部署樣本服務
執行以下命令,在叢集內部署一個使用IPEX加速的Stable Diffusion XL Turbo模型。
helm install stable-diffusion-ipex https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/pre/charts-incubator/stable-diffusion-ipex-0.1.7.tgz -f values.yaml
預期輸出:
NAME: stable-diffusion-ipex LAST DEPLOYED: Mon Jan 22 20:42:35 2024 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None
等待約10分鐘,然後執行以下命令檢查Pod狀態,確保運行正常。
kubectl get pod |grep stable-diffusion-ipex
預期輸出:
stable-diffusion-ipex-65d98cc78-vmj49 1/1 Running 0 1m44s
服務部署完成後,對外提供了一個文生圖API。關於API的說明,請參見API說明。
步驟三:測試樣本服務
操作步驟
執行以下命令,將Stable Diffusion XL Turbo模型服務轉寄到本地。
kubectl port-forward svc/stable-diffusion-ipex 5000:5000
預期輸出:
Forwarding from 127.0.0.1:5000 -> 5000 Forwarding from [::1]:5000 -> 5000
使用提示詞,請求本地服務產生圖片。
本步驟以產生
512x512
或1024x1024
的圖片為例。512x512的圖片
執行以下命令,使用提示詞
A panda listening to music with headphones. highly detailed, 8k.
請求本地的服務執行任務,產生圖片。curl -X POST http://127.0.0.1:5000/api/text2image \ -d '{"prompt": "A panda listening to music with headphones. highly detailed, 8k.", "number": 1}'
預期輸出:
{ "averageImageGenerationTimeSeconds": 2.0333826541900635, "generationTimeSeconds": 2.0333826541900635, "id": "9ae43577-170b-45c9-ab80-69c783b41a70", "meta": { "input": { "batch": 1, "model": "stabilityai/sdxl-turbo", "number": 1, "prompt": "A panda listening to music with headphones. highly detailed, 8k.", "size": "512x512", "step": 4 } }, "output": [ { "latencySeconds": 2.0333826541900635, "url": "http://127.0.0.1:5000/images/9ae43577-170b-45c9-ab80-69c783b41a70/0_0.png" } ], "status": "success" }
您可以在瀏覽器中訪問輸出包含的URL,查看產生的圖片。
1024x1024的圖片
執行下面的命令,使用提示詞
A panda listening to music with headphones. highly detailed, 8k.
請求本地的服務執行任務,產生圖片。curl -X POST http://127.0.0.1:5000/api/text2image \ -d '{"prompt": "A panda listening to music with headphones. highly detailed, 8k.", "number": 1, "size": "1024x1024"}'
預期輸出:
{ "averageImageGenerationTimeSeconds": 8.635204315185547, "generationTimeSeconds": 8.635204315185547, "id": "ac341ced-430d-4952-b9f9-efa57b4eeb60", "meta": { "input": { "batch": 1, "model": "stabilityai/sdxl-turbo", "number": 1, "prompt": "A panda listening to music with headphones. highly detailed, 8k.", "size": "1024x1024", "step": 4 } }, "output": [ { "latencySeconds": 8.635204315185547, "url": "http://127.0.0.1:5000/images/ac341ced-430d-4952-b9f9-efa57b4eeb60/0_0.png" } ], "status": "success" }
您可以在瀏覽器中訪問輸出包含的URL,查看產生的圖片。
測試資料
以下為Container ServiceACK團隊使用不同ECS g8i執行個體規格在Stable Diffusion XL Turbo模型中產生512x512、1024x1024圖片的耗時資訊。下表結果資料僅為實驗參考,實際資料可能會因您的作業環境而發生變化。
執行個體規格 | Pod Request/Limit | 參數 | 單次平均耗時 (512x512) | 單次平均耗時 (1024x1024) |
ecs.g8i.4xlarge (16 vCPU 64 GiB) | 14/16 | batch: 1 step: 4 | 2.2s | 8.8s |
ecs.g8i.8xlarge (32 vCPU 128 GiB) | 24/32 | batch: 1 step: 4 | 1.3s | 4.7s |
ecs.g8i.12xlarge (48 vCPU 192 GiB) | 32/32 | batch: 1 step: 4 | 1.1s | 3.9s |
(可選)步驟四:將服務遷移到TDX機密虛擬機器節點池
樣本服務部署完成後,您可以將該應用無縫遷移到TDX機密計算節點池中,為您的推理服務提供資料安全保護。
前提條件
已在ACK叢集內建立一個TDX機密虛擬機器節點池,且TDX機密虛擬機器節點池需滿足其使用限制。具體操作,請參見建立TDX機密虛擬機器計算節點池。
同時,TDX機密虛擬機器節點池還需滿足以下條件:
執行個體規格:CPU為16 vCPU及以上(推薦使用ecs.g8i.4xlarge)。
磁碟空間:節點池內節點可用磁碟空間為200GiB以上(可設定節點系統硬碟大於200GiB或者增加一塊大於200GiB的資料盤)。
節點標籤:配置節點標籤為
nodepool-label=tdx-vm-pool
。
操作步驟
將以下內容儲存為tdx_values.yaml。
關於values.yaml的完整說明,請參見服務部署組態說明values.yaml。
說明此處以為TDX機密虛擬機器節點池配置了標籤
nodepool-label=tdx-vm-pool
為例。如果您配置了其他標籤,需替換nodeSelector
中nodepool-label
取值。nodeSelector: nodepool-label: tdx-vm-pool
執行以下命令,將部署的Stable Diffusion樣本模型遷移到TDX機密計算節點池。
helm upgrade stable-diffusion-ipex https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/pre/charts-incubator/stable-diffusion-ipex-0.1.7.tgz -f tdx_values.yaml
預期輸出:
Release "stable-diffusion-ipex" has been upgraded. Happy Helming! NAME: stable-diffusion-ipex LAST DEPLOYED: Wed Jan 24 16:38:04 2024 NAMESPACE: default STATUS: deployed REVISION: 2 TEST SUITE: None
等待約10分鐘,然後檢查Pod狀態,確保運行正常。
kubectl get pod |grep stable-diffusion-ipex
預期輸出:
stable-diffusion-ipex-7f8c4f88f5-r478t 1/1 Running 0 1m44s
參見步驟三:測試樣本服務,再次測試部署在TDX機密計算節點池中的Stable Diffusion樣本模型。
參考資料
API說明
當您使用stabilityai/sdxl-turbo
模型部署Stable Diffusion XL Turbo服務後,該服務對外提供了一個文生圖API。API說明如下。
請求文法
POST /api/text2image
請求參數
請求樣本
響應參數
響應樣本
效能比對
在ACK叢集的TDX機密虛擬機器節點池中,通過採用ECS g8i執行個體並結合AMX + IPEX技術,能夠有效加速文生圖模型的推理速度,並可以開啟TEE實現對模型推理的安全保護。本實踐教程採用阿里雲第八代(Intel至強第五代處理器)ecs.g8i.4xlarge機型運行stabilityai/sdxl-turbo
模型及相關的微調模型為例,展示如何?高性價比、模型安全的文生圖推理服務。
從推理速度的絕對效能來看,CPU的推理速度仍然與A10的GPU執行個體有所差距。採用ecs.g8i.8xlarge的CPU機型、step為30、batch為16時,圖片產生速度為0.14 images/s;採用A10的GPU執行個體、step為30,batch為16時,圖片產生速度為0.4 images/s。但從最佳映像產生品質的推理效能來看,採用ecs.g8i.8xlarge的CPU機型、step為4、batch為16時,映像產生速度為1.2 images/s,仍可實現秒級出圖效能。
因此,通過合理運用CPU加速策略和文生圖模型推理的最佳實務,ECS g8i等第八代CPU執行個體可用於替代GPU執行個體,提供穩定、高效、高性價比且安全機密的文生圖服務。
在追求性價比、模型安全TEE和大規模資源供給的文生圖推理情境下,建議採用ecs.g8i.4xlarge機型運行stabilityai/sdxl-turbo
及相關的微調模型,以最優性價比的方式提供高品質的文生圖服務。
使用ecs.g8i.8xlarge執行個體代替ecs.gn7i-c8g1.2xlarge時,可有效節省約9%的成本,並依然保持1.2 images/s的映像產生速度。
使用ecs.g8i.4xlarge執行個體替代ecs.gn7i-c8g1.2xlarge時,映像產生速度降為0.5 images/s,但可有效節省超過53%的成本。
不同地區的ECS執行個體價格請以Elastic Compute Service定價中的執行個體價格頁簽定價為準。