您可以在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硬件的云服務器ECS保護技術,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
# 工作負載副本數
replicaCount: 1
# 鏡像
image:
repository: registry-vpc.cn-beijing.aliyuncs.com/eric-dev/stable-diffusion-ipex
pullPolicy: IfNotPresent
tag: "v0.1.5" # 包含官方stabilityai/sdxl-turbo模型文件
tagOnlyApi: "v0.1.5-lite" # 不包含官方stabilityai/sdxl-turbo模型文件,需要自行掛載模型文件,詳見下方useCustomModels的說明
# 使用自定義的私有鏡像時,指定包含鏡像拉取憑證的 secret
imagePullSecrets: []
# 圖片在容器內的保存路徑
outputDirPath: /tmp/sd
# 是否使用自定義的stabilityai/sdxl-turbo模型
useCustomModels: false
volumes:
# outputDirPath對應的掛載配置
output:
name: output-volume
emptyDir: {}
# useCustomModels為true時,配置自定義的stabilityai/sdxl-turbo模型掛載配置
# 模型文件必須放在掛載目錄中的stabilityai/sdxl-turbo子目錄下
models:
name: data-volume
persistentVolumeClaim:
claimName: models-oss-pvc
# hostPath:
# path: /data/models
# type: DirectoryOrCreate
# 對外暴露的服務配置
service:
type: ClusterIP
port: 5000
# 容器資源配置
resources:
limits:
cpu: "16"
memory: 32Gi
requests:
cpu: "14"
memory: 24Gi
# 工作負載更新策略
strategy:
type: RollingUpdate
# 工作負載調度配置
nodeSelector: {}
tolerations: []
affinity: {}
# 容器安全配置
securityContext:
capabilities:
drop:
- ALL
runAsNonRoot: true
runAsUser: 1000
# 是否為工作負載啟用HPA自動伸縮
# https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 3
targetCPUUtilizationPercentage: 80
targetMemoryUtilizationPercentage: 90
步驟二:部署示例服務
執行以下命令,在集群內部署一個使用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,查看生成的圖片。
測試數據
以下為容器服務ACK團隊使用不同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
請求參數
參數 | 類型 | 說明 |
prompt | string | 提示詞。 |
number | integer | 圖片數量。最終生成的圖片數量為 |
size | string | 圖片大小。默認值: 可選值:
|
step | integer | 生成圖片時使用的步數配置。默認值: |
batch | integer | 生成圖片時使用的批大小配置。默認值: |
請求示例
{
"prompt": "A panda listening to music with headphones. highly detailed, 8k.",
"number": 1
}
響應參數
參數名稱 | 參數類型 | 參數說明 |
id | string | 任務ID。 |
averageImageGenerationTimeSeconds | float | 每批圖片的平均生成時間。單位:秒。 |
generationTimeSeconds | float | 生成所有圖片的耗時。單位:秒。 |
meta | object | 任務元數據信息。 |
meta.input | object | 任務輸入數據。 |
meta.input.model | string | 使用的模型名稱。 |
meta.input.batch | integer | 生成圖片時使用的批大小配置。 |
meta.input.step | integer | 生成圖片時使用的步數配置。 |
meta.input.number | integer | 圖片數量。最終生成的圖片數量為 |
output | array | 生成的圖片信息。 當請求參數 |
output[].url | string | 圖片訪問地址。只有當工作負載副本數為 |
output[].latencySeconds | float | 生成該批次圖片的耗時。單位:秒。 |
status | string | 任務狀態。 |
響應示例
{
"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"
}
性能比對
在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實例價格請以云服務器ECS定價中的實例價格頁簽定價為準。
CPU機型
本實踐使用阿里云ecs.g8i.8xlarge機型,展示了不同Benchmark取值下及使用不同應用模型時的性能結果。具體信息參見下表。更多信息,請參見Benchmark Tools:lambda-diffusers。
本結果數據僅為參考值,實際數據可能會因您的操作環境而發生變化。
實例規格 | AlibabaCloud ecs.g8i.8xlarge 32vCPU,128GiB VM, EMR | AlibabaCloud ecs.g8i.8xlarge 32vCPU,128GiB VM, EMR |
step | 4 | 30 |
模型 | sdxl-turbo | stable-diffusion-2-1-base |
執行命令 | python sd_pipe_sdxl_turbo.py --bf16 --batch 1 --height 512 --width 512 --repeat 5 --step 4 --prompt "A panda listening to music with headphones. highly detailed, 8k" | python sd_pipe_infer.py --model /data/models/stable-diffusion-2-1-base --bf16 --batch 1 --height 512 --width 512 --repeat 5 --step 30 --prompt "A panda listening to music with headphones. highly detailed, 8k" |
性能趨勢 |
GPU機型
下方數據源于Lambda Diffusers的測試數據,僅供參考。其Benchmark可能會發生變化。實際數據及更多信息請以官方頁面Lambda Diffusers Benchmarking inference為準。