全部產品
Search
文件中心

Container Service for Kubernetes:在TDX節點池中使用CPU加速Stable Diffusion XL Turbo的文生圖推理

更新時間:Jun 19, 2024

您可以在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,供下文步驟使用。

操作步驟

  1. 將以下範例程式碼儲存為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。
  2. 執行以下命令,建立Secret。

    kubectl create -f models-oss-secret.yaml

    預期輸出:

    secret/models-oss-secret created
  3. 將以下內容儲存為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

  4. 執行以下命令建立靜態卷PV。

    kubectl create -f models-oss-pv.yaml

    預期輸出:

    persistentvolume/models-oss-pv created
  5. 將以下內容儲存為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
  6. 執行以下命令建立靜態卷PVC。

    kubectl create -f models-oss-pvc.yaml

    預期輸出:

    persistentvolumeclaim/models-oss-pvc created
  7. 將以下範例程式碼儲存為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

展開查看完整的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

步驟二:部署樣本服務

  1. 執行以下命令,在叢集內部署一個使用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
  2. 等待約10分鐘,然後執行以下命令檢查Pod狀態,確保運行正常。

    kubectl get pod |grep stable-diffusion-ipex

    預期輸出:

    stable-diffusion-ipex-65d98cc78-vmj49   1/1     Running            0                1m44s

服務部署完成後,對外提供了一個文生圖API。關於API的說明,請參見API說明

步驟三:測試樣本服務

操作步驟

  1. 執行以下命令,將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
  2. 使用提示詞,請求本地服務產生圖片。

    本步驟以產生512x5121024x1024的圖片為例。

    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

操作步驟

  1. 將以下內容儲存為tdx_values.yaml。

    關於values.yaml的完整說明,請參見服務部署組態說明values.yaml

    說明

    此處以為TDX機密虛擬機器節點池配置了標籤nodepool-label=tdx-vm-pool為例。如果您配置了其他標籤,需替換nodeSelectornodepool-label取值。

    nodeSelector:
      nodepool-label: tdx-vm-pool
  2. 執行以下命令,將部署的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
  3. 等待約10分鐘,然後檢查Pod狀態,確保運行正常。

    kubectl get pod |grep stable-diffusion-ipex

    預期輸出:

    stable-diffusion-ipex-7f8c4f88f5-r478t   1/1     Running            0                1m44s
  4. 參見步驟三:測試樣本服務,再次測試部署在TDX機密計算節點池中的Stable Diffusion樣本模型。

參考資料

API說明

當您使用stabilityai/sdxl-turbo模型部署Stable Diffusion XL Turbo服務後,該服務對外提供了一個文生圖API。API說明如下。

請求文法

POST /api/text2image

請求參數

參數

類型

說明

prompt

string

提示詞。

number

integer

圖片數量。最終產生的圖片數量為number*batch

size

string

圖片大小。預設值:512x512

可選值:

  • 512x512

  • 1024x1024

step

integer

產生圖片時使用的步數配置。預設值:4

batch

integer

產生圖片時使用的批大小配置。預設值:1

請求樣本

{
  "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

圖片數量。最終產生的圖片數量為number*batch

output

array

產生的圖片資訊。

當請求參數number的值大於1時,將額外使用所有產生的圖片合成一張名為image_grid.png的圖片,方便您一次性預覽所有圖片。

output[].url

string

圖片訪問地址。只有當工作負載副本數為1時,才能通過該地址在瀏覽器中查看圖片。

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執行個體價格請以Elastic Compute Service定價中的執行個體價格頁簽定價為準。

展開查看不同CPU、GPU機型相關的結果資料

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"

效能趨勢

image

image

GPU機型

重要

下方資料來源於Lambda Diffusers的測試資料,僅供參考。其Benchmark可能會發生變化。實際資料及更多資訊請以官方頁面Lambda Diffusers Benchmarking inference為準。

image

image

相關文檔

建立TDX機密虛擬機器計算節點池