天天看點

如何在火山引擎雲上部署 Stable Diffusion

作者:技術聯盟總壇

馮明星 火山引擎開發者社群 2023-06-13 08:03 發表于北京

如何在火山引擎雲上部署 Stable Diffusion
本文将以 Stable Diffusion 模型為例,結合大模型企業正常工程化技術實踐,示範如何在火山引擎雲上部署使用者自己的 Stable Diffusion 服務。

随着算法的發展,AIGC 已經展現出其在藝術創意領域的巨大潛力。以近幾個月風靡全球的 Stable Diffusion 為例,這是一種基于潛在擴散模型(Latent Diffusion Models)的 text-to-image 模型,能夠根據使用者輸入的任意文本生成相應的高品質圖像,受到廣大藝術從業者和開發者的關注。

如何在火山引擎雲上部署 Stable Diffusion

作為位元組跳動旗下的雲服務平台,火山引擎提煉了位元組跳動多年雲原生機器學習、大模型推理架構、訓練/推理軟硬體方案等技術實踐,推出了一系列高性價的 AI 基礎設施。

為了讓對 AIGC 感興趣的開發者感受 AI 的魅力,本文将以 Stable Diffusion 模型為例,結合大模型企業正常工程化技術實踐,示範如何在火山引擎雲上部署使用者自己的 Stable Diffusion 服務。

Stable Diffusion 環境依賴

如果想把 Stable Diffusion 部署在雲端,使用者一般需要用到以下産品及服務:

  • 容器服務 VKE(Kubernetes v1.24)
  • 鏡像倉庫 CR
  • 彈性容器 VCI
  • 對象存儲 TOS
  • GPU 伺服器 ecs.gni2.3xlarge NVIDIA A10
  • 應用負載均衡 ALB
  • API 網關 APIG
  • GPU 共享技術 mGPU
  • Stable Diffusion:huggingface.co/CompVis/stable-diffusion-v1-4
  • Stable Diffusion WebUI:github.com/AUTOMATIC1111/stable-diffusion-webui

步驟一:準備 VKE 叢集環境

火山引擎容器服務 VKE 通過深度融合新一代雲原生技術,提供以容器為核心的高性能 Kubernetes 容器叢集管理服務,可以被使用者用于快速建構容器化的應用。

  1. 登入火山引擎控制台,建立 VKE 叢集,叢集版本選擇 1.24,容器網絡模型選擇 VPC-CNI,選擇立刻建立節點,節點規格選擇 GPU 計算型,ecs.gni2.3xlarge NVIDIA A10,元件勾選安裝 nvidia-device-plugin 元件。
  2. 開通 TOS 并建立桶,将 CompVis/stable-diffusion-v1-4 相關檔案(包括模型)上傳到 TOS。

stable-diffusion-v1-4 下載下傳可以參考 Huggingface(需要新增賬號擷取 token)提供到下載下傳接口進行下載下傳:huggingface.co/docs/huggingface_hub/v0.14.1/guides/download

1 pip install --upgrade diffusers
2 pip install transformers
3 #安裝pytorch,根據官網選擇對應環境的指令進行安裝。https://pytorch.org/get-started/locally/           
  1. 在自己的指令行上,輸入“huggingface-cli login”,出現 successful 即已經成功:

4. 使用 snapshot_download 方法進行下載下傳:

1 >>> from huggingface_hub import snapshot_download
2 >>> snapshot_download(repo_id="CompVis/stable-diffusion-v1-4",local_dir="/root/")           
  1. 下載下傳完成後,使用 rclone 工具将檔案上傳至 TOS,rclone 配置可參考:volcengine.com/docs/6349/81434

    1 rclone copy diffusers/ ${rclone_config_name}:${bucketname}/diffusers --copy-links

    2 #需要加上--copy-links參數,保證能通過軟連結上傳原始檔案

部署 Stable Diffusion

準備好對應的容器鏡像,push 到容器鏡像倉庫中供使用。本文使用 cr-demo-cn-beijing.cr.volces.com/diffusers/stable-diffusion:taiyi-0.1 鏡像,該鏡像可以在火山引擎北京 region 的 VPC 環境下直接拉取到。

登入容器服務 VKE 控制台,使用 TOS 建立 PV、PVC:

如何在火山引擎雲上部署 Stable Diffusion
如何在火山引擎雲上部署 Stable Diffusion

建立工作負載和服務部署應用時,由于 AI 鏡像都比較大,我們可以選擇火山引擎鏡像倉庫 CR 提供 P2P 加速、按需加載、鏡像緩存等能力。我們将在後續系列文章,詳細介紹這塊的能力。

火山引擎鏡像倉庫 CR 支援基于 P2P 方式的大規模叢集拉取:P2P 加速功能利用計算節點的帶寬資源,可以進行節點之間鏡像分發,減少對容器鏡像存儲的壓力,進而大幅提升鏡像拉取速度,減少應用部署時間。通過和開源社群合作,在大規模節點拉鏡像的場景下,目前容器鏡像拉取用時已節省超過 90%,極大提升了産品性能和客戶服務能力。

如何在火山引擎雲上部署 Stable Diffusion
如何在火山引擎雲上部署 Stable Diffusion

容器内挂載路徑:/stable-diffusion-webui/models/Taiyi-Stable-Diffusion-1B-Chinese-v0.1

容器監聽端口:7860

如何在火山引擎雲上部署 Stable Diffusion

Deployment yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sd-a10
  namespace: default
spec:
  progressDeadlineSeconds: 600
  replicas: 0
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: sd-a10
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: sd-a10
    spec:
      containers:
      - image: cr-demo-cn-beijing.cr.volces.com/${namespace}/stable-diffusion:taiyi-0.1
        # 需要替換為實際的鏡像位址
        imagePullPolicy: IfNotPresent
        name: sd
        resources:
          limits:
            vke.volcengine.com/mgpu-core: "30"
            vke.volcengine.com/mgpu-memory: "10240"
          requests:
            vke.volcengine.com/mgpu-core: "30"
            vke.volcengine.com/mgpu-memory: "10240"
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /stable-diffusion-webui/models/Taiyi-Stable-Diffusion-1B-Chinese-v0.1
          name: data
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: sd-tos-pvc
           

步驟三:暴露推理服務

選擇一:使用負載均衡 ALB

火山引擎應用型負載均衡 ALB 面向七層(HTTP、HTTPS、HTTP/2、WebSocket、QUIC等協定)網站、音視訊等應用的大流量高并發場景,基于内容進行精細化、均衡的流量排程,消除單點故障影響,可提升應用系統整體的穩定性、可靠性與服務能力。經過使用者實測,使用 ALB 後,單執行個體最高可承載百萬級并發請求。

  1. 建立 ALB 類型的 Ingress 用于暴露服務。
  2. 通過建立好的 ALB 類型的 Ingress 的 VIP 通路 Stable Diffusion WebUI 服務。

選擇二:使用 API 網關

火山引擎 API 網關 APIG 是基于雲原生的、高擴充、高可用的雲上網關托管服務。在傳統流量網關的基礎上,APIG 內建豐富的服務發現和服務治理能力,打通微服務架構的内外部網絡,可以幫助使用者快速實作各服務之間、服務與用戶端之間的安全通信。如果有認證鑒權、認證、流量控制等需求,使用者也可以通過 APIG 來暴露容器服務。

登入 APIG 控制台建立執行個體,建立好我們的 Upstream 來源,選擇對應的 VKE 叢集。需要注意的是,建立網關執行個體時,需要選擇跟 VKE 叢集相同的 VPC,然後建立對應的 API 網關服務,配置協定、認證資訊後,建立對應的路由資訊完成建立,建立完成後會自動生成 API 網關域名用于通路,同時我們也可以使用我們自己的域名進行 CNAME 解析。

如何在火山引擎雲上部署 Stable Diffusion
如何在火山引擎雲上部署 Stable Diffusion

完成以上操作後,您就已經成功在火山引擎容器服務上部署 Stable Diffusion 了。您可以在 WebUI 頁面進行模型推理驗證。

如何在火山引擎雲上部署 Stable Diffusion

大模型工程化部署

相比 Stable Diffusion 的部署,真正的企業級大模型部署還要考慮訓練和推理加速、資源使用率提升、控制應用成本等工程化問題。火山引擎結合位元組跳動大規模 AI 場景實踐經驗,也為使用者提供了真正的系統工程能力。

使用 mGPU 提升 GPU 資源使用率

目前,如何進一步提高 GPU 的使用率,将多個容器運作在單張 GPU 卡上,仍是業界在持續探索的難題。

如何在火山引擎雲上部署 Stable Diffusion

火山引擎的 mGPU(multi-container GPU)容器共享解決方案是針對該問題提出的解決方案,它支援單個容器申領 1% 精度的百分比算力和 1 MiB 級顯存排程,相容整卡排程場景,滿足同時使用 GPU 容器共享和整卡 GPU 的業務場景。經落地驗證,mGPU 可以幫助使用者提升超過 50% 的資源使用率。

現在 mGPU 可以在火山引擎公有雲 GPU 伺服器和容器服務中免費使用。

  1. 通過 VKE 控制台安裝 mGPU 元件。
  2. 開啟叢集的 Prometheus 監控,這樣可以友善我們對相關 GPU 名額進行觀測,了解叢集的工作負載情況。
  3. 我們可以通過給 GPU 節點增加 label 的方式啟用 mGPU 能力。為了友善操作,我們可以通過節點池管理,在節點池中配置對應的label。

通過該節點池擴容的節點都會打上對應的 label。如果是提前建立好的節點,我們也可以直接編輯節點打 label。

如何在火山引擎雲上部署 Stable Diffusion

這樣我們就可以根據業務需求設定 GPU 算力,可以設定 GPU 算力小于 1 卡,進而充分利用 GPU 資源、控制成本。

如何在火山引擎雲上部署 Stable Diffusion
如何在火山引擎雲上部署 Stable Diffusion
如何在火山引擎雲上部署 Stable Diffusion
  1. 檢視 Pod GPU 監控情況。

使用 Serverless GPU 部署 Stable Diffusion

除了 GPU 資源使用,提升模型服務彈性伸縮能力也是企業關注的一個重點,這可以在降低運作成本的同時,也提升了服務的可用性。

火山引擎彈性容器執行個體 VCI 是一種 Serverless 和容器化的計算服務,可無縫內建容器服務 VKE,提供 Kubernetes 編排能力。通過使用 VCI,使用者可以專注于建構應用本身,無需購買和管理底層雲伺服器等基礎設施,并僅為容器實際運作消耗的資源付費。VCI 還支援秒級啟動、高并發建立、沙箱容器安全隔離等能力。

  1. 打開火山引擎控制台,資料、鏡像準備同 VKE 部署方式一緻,唯一差別在于部署業務時選擇基于 VCI 部署,同時指定 GPU 規格。
  2. 我們可以通過注解指定 GPU 規格,本文使用 vci.vke.volcengine.com/preferred-instance-types: vci.ini2.26c-243gi NVIDIA A30 卡。
  3. 服務暴露方式也跟基于 VKE 部署一緻。

Deployment yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sd-vci
  namespace: default
spec:
  progressDeadlineSeconds: 600
  replicas: 0
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: sd-vci
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      annotations:
        vci.vke.volcengine.com/preferred-instance-types: vci.ini2.26c-243gi
        # 指定使用到GPU規格
        vci.volcengine.com/tls-enable: "false"
        vke.volcengine.com/burst-to-vci: enforce
        # 排程到VCI執行個體上
      creationTimestamp: null
      labels:
        app: sd-vci
    spec:
      containers:
      - image: cr-demo-cn-beijing.cr.volces.com/${namespace}/stable-diffusion:taiyi-0.1
        # 需要替換為實際的鏡像位址
        imagePullPolicy: IfNotPresent
        name: sd-vci
        resources:
          limits:
            nvidia.com/gpu: "1"
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /stable-diffusion-webui/models/Taiyi-Stable-Diffusion-1B-Chinese-v0.1
          name: sd
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - name: sd
        persistentVolumeClaim:
          claimName: sd-tos-pvc
           

結語

目前,AIGC 的競争主要圍繞應用層,即通過了解使用者和企業的需求,利用 AI 大模型生成文本、圖像、音頻、視訊等多模态内容的能力建構應用,進而提供切實解決問題的服務與方案。以下是幾個典型場景:

如何在火山引擎雲上部署 Stable Diffusion

作為擁有豐富雲原生機器學習平台搭建經驗的企業,火山引擎希望通過自身的技術實踐和解決方案,幫助企業不斷降低 AI 技術開發和應用的門檻。火山引擎雲原生團隊也在不斷疊代和創新解決方案,提供更高穩定性和更彈性的雲原生 AI 基建,面向客戶創造出更多價值!

相關連結

[1] 火山引擎: www.volcengine.com

[2] 容器服務: www.volcengine.com/product/vke

[3] 鏡像倉庫:www.volcengine.com/product/cr

[4] API 網關:www.volcengine.com/product/apig

[5] 托管 Prometheus:www.volcengine.com/product/vmp