馮明星 火山引擎開發者社群 2023-06-13 08:03 發表于北京
本文将以 Stable Diffusion 模型為例,結合大模型企業正常工程化技術實踐,示範如何在火山引擎雲上部署使用者自己的 Stable Diffusion 服務。
随着算法的發展,AIGC 已經展現出其在藝術創意領域的巨大潛力。以近幾個月風靡全球的 Stable Diffusion 為例,這是一種基于潛在擴散模型(Latent Diffusion Models)的 text-to-image 模型,能夠根據使用者輸入的任意文本生成相應的高品質圖像,受到廣大藝術從業者和開發者的關注。
作為位元組跳動旗下的雲服務平台,火山引擎提煉了位元組跳動多年雲原生機器學習、大模型推理架構、訓練/推理軟硬體方案等技術實踐,推出了一系列高性價的 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 容器叢集管理服務,可以被使用者用于快速建構容器化的應用。
- 登入火山引擎控制台,建立 VKE 叢集,叢集版本選擇 1.24,容器網絡模型選擇 VPC-CNI,選擇立刻建立節點,節點規格選擇 GPU 計算型,ecs.gni2.3xlarge NVIDIA A10,元件勾選安裝 nvidia-device-plugin 元件。
- 開通 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/
- 在自己的指令行上,輸入“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/")
-
下載下傳完成後,使用 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:
建立工作負載和服務部署應用時,由于 AI 鏡像都比較大,我們可以選擇火山引擎鏡像倉庫 CR 提供 P2P 加速、按需加載、鏡像緩存等能力。我們将在後續系列文章,詳細介紹這塊的能力。
火山引擎鏡像倉庫 CR 支援基于 P2P 方式的大規模叢集拉取:P2P 加速功能利用計算節點的帶寬資源,可以進行節點之間鏡像分發,減少對容器鏡像存儲的壓力,進而大幅提升鏡像拉取速度,減少應用部署時間。通過和開源社群合作,在大規模節點拉鏡像的場景下,目前容器鏡像拉取用時已節省超過 90%,極大提升了産品性能和客戶服務能力。
容器内挂載路徑:/stable-diffusion-webui/models/Taiyi-Stable-Diffusion-1B-Chinese-v0.1
容器監聽端口:7860
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 後,單執行個體最高可承載百萬級并發請求。
- 建立 ALB 類型的 Ingress 用于暴露服務。
- 通過建立好的 ALB 類型的 Ingress 的 VIP 通路 Stable Diffusion WebUI 服務。
選擇二:使用 API 網關
火山引擎 API 網關 APIG 是基于雲原生的、高擴充、高可用的雲上網關托管服務。在傳統流量網關的基礎上,APIG 內建豐富的服務發現和服務治理能力,打通微服務架構的内外部網絡,可以幫助使用者快速實作各服務之間、服務與用戶端之間的安全通信。如果有認證鑒權、認證、流量控制等需求,使用者也可以通過 APIG 來暴露容器服務。
登入 APIG 控制台建立執行個體,建立好我們的 Upstream 來源,選擇對應的 VKE 叢集。需要注意的是,建立網關執行個體時,需要選擇跟 VKE 叢集相同的 VPC,然後建立對應的 API 網關服務,配置協定、認證資訊後,建立對應的路由資訊完成建立,建立完成後會自動生成 API 網關域名用于通路,同時我們也可以使用我們自己的域名進行 CNAME 解析。
完成以上操作後,您就已經成功在火山引擎容器服務上部署 Stable Diffusion 了。您可以在 WebUI 頁面進行模型推理驗證。
大模型工程化部署
相比 Stable Diffusion 的部署,真正的企業級大模型部署還要考慮訓練和推理加速、資源使用率提升、控制應用成本等工程化問題。火山引擎結合位元組跳動大規模 AI 場景實踐經驗,也為使用者提供了真正的系統工程能力。
使用 mGPU 提升 GPU 資源使用率
目前,如何進一步提高 GPU 的使用率,将多個容器運作在單張 GPU 卡上,仍是業界在持續探索的難題。
火山引擎的 mGPU(multi-container GPU)容器共享解決方案是針對該問題提出的解決方案,它支援單個容器申領 1% 精度的百分比算力和 1 MiB 級顯存排程,相容整卡排程場景,滿足同時使用 GPU 容器共享和整卡 GPU 的業務場景。經落地驗證,mGPU 可以幫助使用者提升超過 50% 的資源使用率。
現在 mGPU 可以在火山引擎公有雲 GPU 伺服器和容器服務中免費使用。
- 通過 VKE 控制台安裝 mGPU 元件。
- 開啟叢集的 Prometheus 監控,這樣可以友善我們對相關 GPU 名額進行觀測,了解叢集的工作負載情況。
- 我們可以通過給 GPU 節點增加 label 的方式啟用 mGPU 能力。為了友善操作,我們可以通過節點池管理,在節點池中配置對應的label。
通過該節點池擴容的節點都會打上對應的 label。如果是提前建立好的節點,我們也可以直接編輯節點打 label。
這樣我們就可以根據業務需求設定 GPU 算力,可以設定 GPU 算力小于 1 卡,進而充分利用 GPU 資源、控制成本。
- 檢視 Pod GPU 監控情況。
使用 Serverless GPU 部署 Stable Diffusion
除了 GPU 資源使用,提升模型服務彈性伸縮能力也是企業關注的一個重點,這可以在降低運作成本的同時,也提升了服務的可用性。
火山引擎彈性容器執行個體 VCI 是一種 Serverless 和容器化的計算服務,可無縫內建容器服務 VKE,提供 Kubernetes 編排能力。通過使用 VCI,使用者可以專注于建構應用本身,無需購買和管理底層雲伺服器等基礎設施,并僅為容器實際運作消耗的資源付費。VCI 還支援秒級啟動、高并發建立、沙箱容器安全隔離等能力。
- 打開火山引擎控制台,資料、鏡像準備同 VKE 部署方式一緻,唯一差別在于部署業務時選擇基于 VCI 部署,同時指定 GPU 規格。
- 我們可以通過注解指定 GPU 規格,本文使用 vci.vke.volcengine.com/preferred-instance-types: vci.ini2.26c-243gi NVIDIA A30 卡。
- 服務暴露方式也跟基于 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 大模型生成文本、圖像、音頻、視訊等多模态内容的能力建構應用,進而提供切實解決問題的服務與方案。以下是幾個典型場景:
作為擁有豐富雲原生機器學習平台搭建經驗的企業,火山引擎希望通過自身的技術實踐和解決方案,幫助企業不斷降低 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