全部產品
Search
文件中心

Container Service for Kubernetes:基於Knative部署生產層級的Stable Diffusion服務

更新時間:Dec 25, 2025

使用Knative在ACK叢集中部署Stable Diffusion時,Knative支援根據單個Pod處理請求的吞吐率精準地控制單個Pod請求並發處理數,保證服務穩定性,還能在業務沒有流量時自動將執行個體縮容至零,節省GPU資源的使用成本。

前提條件

實現流程

重要

您應當自覺遵守第三方模型Stable Diffusion的使用者協議、使用規範和相關法律法規,阿里雲不對Stable Diffusion模型的合法性、安全性、準確性進行任何保證,且不對由此引發的任何損害承擔責任。

Stable Diffusion支援快速、準確地產生目標情境及圖片。但使用 Stable Diffusion 可能有以下訴求:

  • 單個 Pod 輸送量有限,多請求轉寄可能導致服務端過載。需精確控制單個 Pod 的並發請求數。

  • GPU 資源價格較高,需實現按需分配,並在業務低穀時及時釋放資源。

ACK Knative支援基於並發請求數精準調度,實現自動擴縮容,構建生產級的 Stable Diffusion 服務。具體實現流程如下所示。

image

步驟一:部署Stable Diffusion服務

重要

您需確保Stable Diffusion服務被正確部署在GPU節點上,否則服務將無法使用。

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇應用 > Knative

  3. 部署Stable Diffusion服務。

    ACK Knative提供了熱門 App模板。您可以通過應用模板快速部署,也可以通過YAML來部署。

    應用模板

    單擊熱門 App頁簽,在Stable Diffusion服務的卡片上完成一鍵部署。

    image

    部署後,您可以單擊服務管理,在服務列表查看部署進度。如果狀態顯示成功,則表明服務已成功部署。

    YAML

    單擊服務管理頁簽,選擇命名空間default,然後單擊使用模板建立,將以下YAML樣本粘貼至模板,最後單擊建立,建立一個名為stable-diffusion的服務。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: stable-diffusion
      annotations:
        serving.knative.dev.alibabacloud/affinity: "cookie"
        serving.knative.dev.alibabacloud/cookie-name: "sd"
        serving.knative.dev.alibabacloud/cookie-timeout: "1800"
    spec:
      template:
        metadata:
          annotations:
            autoscaling.knative.dev/class: kpa.autoscaling.knative.dev
            autoscaling.knative.dev/maxScale: '10'
            autoscaling.knative.dev/targetUtilizationPercentage: "100"
            k8s.aliyun.com/eci-use-specs: ecs.gn5-c4g1.xlarge,ecs.gn5i-c8g1.2xlarge,ecs.gn5-c8g1.2xlarge  
        spec:
          containerConcurrency: 1
          containers:
          - args:
            - --listen
            - --skip-torch-cuda-test
            - --api
            command:
            - python3
            - launch.py
            image: yunqi-registry.cn-shanghai.cr.aliyuncs.com/lab/stable-diffusion@sha256:62b3228f4b02d9e89e221abe6f1731498a894b042925ab8d4326a571b3e992bc
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 7860
              name: http1
              protocol: TCP
            name: stable-diffusion
            readinessProbe:
              tcpSocket:
                port: 7860
              initialDelaySeconds: 5
              periodSeconds: 1
              failureThreshold: 3

    如圖所示,表明服務已部署成功。

    image

步驟二:訪問服務

  1. 服務管理頁簽,擷取服務的訪問網關預設網域名稱

    說明

    如網關類型為ALB網關,可使用curl命令訪問服務地址,格式如下:

    curl -H "Host: stable-diffusion.default.example.com" http://alb-XXX.cn-hangzhou.alb.aliyuncsslb.com # 替換為實際的ALB網關地址。

    如需直接存取服務,可通過為ALB配置CNAME解析來實現。

  2. 將服務的網關地址與需要訪問的網域名稱進行Host綁定,在Hosts檔案中添加綁定資訊。綁定樣本如下。

    47.xx.xxx.xx stable-diffusion.default.example.com # 替換為實際的網關IP。
  3. 完成Host綁定後,在服務管理頁簽,單擊stable-diffusion服務的預設網域名稱即可訪問Stable Diffusion。

    如圖所示,可通過網域名稱直接對Stable Diffusion進行訪問。

    image.png

步驟三:基於請求實現自動彈性擴縮容

  1. 使用Hey壓測工具,執行壓測。

    說明

    Hey壓測工具的詳細介紹,請參見Hey

    hey -n 50 -c 5 -t 180 -m POST -H "Content-Type: application/json" -d '{"prompt": "pretty dog"}' http://stable-diffusion.default.example.com/sdapi/v1/txt2img

    發送50個請求,並發數為5,請求逾時時間為180秒。

    預期輸出:

    Summary:
      Total:    252.1749 secs
      Slowest:    62.4155 secs
      Fastest:    9.9399 secs
      Average:    23.9748 secs
      Requests/sec:    0.1983
    
    
    Response time histogram:
      9.940 [1]    |■■
      15.187 [17]    |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
      20.435 [9]    |■■■■■■■■■■■■■■■■■■■■■
      25.683 [11]    |■■■■■■■■■■■■■■■■■■■■■■■■■■
      30.930 [1]    |■■
      36.178 [1]    |■■
      41.425 [3]    |■■■■■■■
      46.673 [1]    |■■
      51.920 [2]    |■■■■■
      57.168 [1]    |■■
      62.415 [3]    |■■■■■■■
    
    
    Latency distribution:
      10% in 10.4695 secs
      25% in 14.8245 secs
      50% in 20.0772 secs
      75% in 30.5207 secs
      90% in 50.7006 secs
      95% in 61.5010 secs
      0% in 0.0000 secs
    
    Details (average, fastest, slowest):
      DNS+dialup:    0.0424 secs, 9.9399 secs, 62.4155 secs
      DNS-lookup:    0.0385 secs, 0.0000 secs, 0.3855 secs
      req write:    0.0000 secs, 0.0000 secs, 0.0004 secs
      resp wait:    23.8850 secs, 9.9089 secs, 62.3562 secs
      resp read:    0.0471 secs, 0.0166 secs, 0.1834 secs
    
    Status code distribution:
      [200]    50 responses

    預期輸出中持續發送了50個請求,請求成功率為100%。

  2. 執行如下命令,可即時觀察Pod擴縮容情況。

    watch -n 1 'kubectl get po'

    由於部署Stable Diffusion服務時配置了單Pod的最大並發數是1 (containerConcurrency: 1),因此壓測期間將自動擴容5個Pod。

步驟四:查看Stable Diffusion服務監控資料

Knative提供開箱即用的可觀測能力,在Knative頁面,單擊監控大盤頁簽,即可查看Stable Diffusion服務的監控資料情況。如何開啟和使用Knative監控大盤,請參見查看Knative服務監控大盤

相關文檔

如需在Knative中部署AI模型推理服務,可參見在Knative中部署AI模型推理服務的最佳實務擷取配置建議。