以下文章來源于谷歌云服務(wù),作者 Google Cloud
現(xiàn)如今隨著 AIGC 這個(gè)話題越來越熱,越來越多優(yōu)秀的開源項(xiàng)目基于文生圖的 AI 模型如 MidJourney,Stable Diffusion 等應(yīng)運(yùn)而生。Stable Diffusion 是一個(gè)文字生成圖像的 Diffusion 模型,它能夠根據(jù)給定任何文本輸入生成逼真的圖像。我們在 GitHub Repo 中提供了三種不同的解決方案 (可參考https://github.com/nonokangwei/Stable-Diffusion-on-GCP),可以快速地分別在 GCP Vertex AI,GKE,和基于 Agones 的平臺上部署 Stable Diffusion,以提供彈性的基礎(chǔ)設(shè)施保證 Stable Diffusion 提供穩(wěn)定的服務(wù)。本文將重點(diǎn)討論 Stable Diffusion 模型在 GKE 上的實(shí)踐。
在實(shí)踐中,我們也遇到了一些問題,例如 Stable Diffusion 的容器鏡像較大,大約達(dá)到 10-20GB,導(dǎo)致容器在啟動(dòng)過程中拉取鏡像的速度變慢,從而影響了啟動(dòng)時(shí)間。在需要快速擴(kuò)容的場景下,啟動(dòng)新的容器副本需要超過 10 分鐘的時(shí)間,嚴(yán)重影響了用戶體驗(yàn)。
我們看到容器的啟動(dòng)過程,按時(shí)序排列:
●觸發(fā) Cluster Autoscaler 擴(kuò)容 + Node 啟動(dòng)并調(diào)度 Pod: 225s
●啟動(dòng) Pull Image:4s
●拉取鏡像: 5m 23s
●啟動(dòng) Pod:1s
●能夠提供 sd-webui 的服務(wù) (大約): > 2m
在這段時(shí)序分析中,我們可以看到,在 Stable Diffusion WebUI 運(yùn)行在容器上啟動(dòng)慢主要面臨的問題是由于整個(gè) runtime 依賴較多,導(dǎo)致容器鏡像太大從而花費(fèi)了很長時(shí)間拉取下載、也造成了 pod 啟動(dòng)初始化加載時(shí)間過長。于是,我們考慮優(yōu)化啟動(dòng)時(shí)間從以下三個(gè)方面入手:
●優(yōu)化 Dockerfile,選擇正確的 base image,精簡 runtime 的依賴安裝,減小鏡像大小。
●借助基礎(chǔ)環(huán)境與 runtime 依賴分離方式,通過磁盤復(fù)制方式加速運(yùn)行環(huán)境的創(chuàng)建。
●通過 GKE Image Streaming 優(yōu)化鏡像加載時(shí)間,利用 Cluster Autoscaler 提升彈性擴(kuò)縮容速度。
本文著重為大家介紹通過基礎(chǔ)環(huán)境與 runtime 依賴分離方式,借助磁盤復(fù)制的高性能來優(yōu)化 Stable Diffusion WebUI 容器啟動(dòng)時(shí)間的方案。
首先,我們可以參考官方 Stable Diffusion WebUI 安裝說明,生成其 Dockerfile。在這里給大家一個(gè)參考: https://github.com/nonokangwei/Stable-Diffusion-on-GCP/blob/main/Stable-Diffusion-UI-Agones/sd-webui/Dockerfile
在初始構(gòu)建的 Stable Diffusion 的容器鏡像中,我們發(fā)現(xiàn)除了基礎(chǔ)鏡像 nvidia runtime 之外,還安裝了大量的庫和擴(kuò)展等。
▲調(diào)優(yōu)之前容器鏡像大小為 16.3GB
在 Dockerfile 優(yōu)化方面,我們對 Dockerfile 進(jìn)行分析后,發(fā)現(xiàn) nvidia runtime 約占 2GB,而 PyTorch 庫是一個(gè)非常大的包,約占 5GB。另外 Stable Diffusion 及其擴(kuò)展等也占據(jù)了一定的空間。因此,我們按照最小可用環(huán)境為原則,去除環(huán)境中不必要的依賴。將 nvidia runtime 作為基礎(chǔ)鏡像,然后把 PyTorch、Stable Diffusion 的庫和擴(kuò)展等從原始鏡像中分離出來,單獨(dú)存放在文件系統(tǒng)中。
以下是初始的 Dockerfile 的片段。
# Base image
FROM nvidia/cuda:11.8.0-runtime-ubuntu22.04
RUN set -ex &&
apt update &&
apt install -y wget git python3 python3-venv python3-pip libglib2.0-0 pkg-config libcairo2-dev &&
rm -rf /var/lib/apt/lists/*
# Pytorch
RUN python3 -m pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 --extra-index-url https://download.pytorch.org/whl/cu117
…
# Stable Diffusion
RUN git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
RUN git clone https://github.com/Stability-AI/stablediffusion.git /stable-diffusion-webui/repositories/stable-diffusion-stability-ai
RUN git -C /stable-diffusion-webui/repositories/stable-diffusion-stability-ai checkout cf1d67a6fd5ea1aa600c4df58e5b47da45f6bdbf
…
# Stable Diffusion extensions
RUN set -ex && cd stable-diffusion-webui
&& git clone https://gitcode.net/ranting8323/sd-webui-additional-networks.git extensions/sd-webui-additional-networks
&& git clone https://gitcode.net/ranting8323/sd-webui-cutoff extensions/sd-webui-cutoff
&& git clone https://ghproxy.com/https://github.com/toshiaki1729/stable-diffusion-webui-dataset-tag-editor.git extensions/stable-diffusion-webui-dataset-tag-editor
我們在移除 Pytorch 的庫和 Stable Diffusion 之后,我們只保留了基礎(chǔ)鏡像 nvidia runtime 在新的 Dockerfile 中。
FROM nvidia/cuda:11.8.0-runtime-ubuntu22.04
RUN set -ex &&
apt update &&
apt install -y wget git python3 python3-venv python3-pip libglib2.0-0 &&
rm -rf /var/lib/apt/lists/*
▲基礎(chǔ)鏡像變成了 2GB
其余的運(yùn)行時(shí)類庫和 extension 等存放在磁盤鏡像中,磁盤鏡像的大小為 6.77GB。采用磁盤鏡像的好處是,它可以最多支持同時(shí)恢復(fù) 1,000 塊磁盤,完全能滿足大規(guī)模擴(kuò)縮容的使用場景。
然而,問題來了,如何將這個(gè)單獨(dú)的文件系統(tǒng)掛載到容器運(yùn)行時(shí)中呢?一種想法是使用 Persistent VolumeClaim (PVC) 進(jìn)行掛載,但由于 Stable Diffusion WebUI 在運(yùn)行時(shí)既需要讀取又需要寫入磁盤,而 GKE 的 PD CSI 驅(qū)動(dòng)程序目前不支持多寫入 ReadWriteMany,只有像 Filestore 這樣的 NFS 文件系統(tǒng)才能支持,但是通過網(wǎng)絡(luò)掛載的 Filestore 就延遲來說仍然無法達(dá)到快速啟動(dòng)的效果。同時(shí),由于 GKE 目前不支持在創(chuàng)建或更新 Nodepool 時(shí)掛載磁盤,所以我們考慮使用 DaemonSet 在 GKE 節(jié)點(diǎn)啟動(dòng)時(shí)掛載磁盤。具體做法如下:
那么如何將磁盤掛載到 GKE 的節(jié)點(diǎn)上呢?可以直接調(diào)用 Cloud SDK,創(chuàng)建基于磁盤鏡像的磁盤。
gcloud compute disks create sd-lib-disk-$NOW --type=pd-balanced --size=30GB --zone=$ZONE --image=$IMAGE_NAME
gcloud compute instances attach-disk ${MY_NODE_NAME} --disk=projects/$PROJECT_ID/zones/$ZONE/disks/sd-lib-disk-$NOW --zone=$ZONE
利用 GKE Image Streaming
和 Cluster Autoscaler
另外,正如我們前面提到的那樣,在優(yōu)化鏡像下載和加載時(shí)間方面,我們還啟用了 GKE Image Streaming 來加速鏡像的拉取速度。它的工作原理是使用網(wǎng)絡(luò)掛載將容器數(shù)據(jù)層掛載到 containerd 中,并在網(wǎng)絡(luò)、內(nèi)存和磁盤上使用多個(gè)緩存層對其進(jìn)行支持。一旦我們準(zhǔn)備好 Image Streaming 掛載,您的容器就會在幾秒鐘內(nèi)從 ImagePulling 狀態(tài)轉(zhuǎn)換為 Running (無論容器大小);這有效地將應(yīng)用程序啟動(dòng)與容器映像中所需數(shù)據(jù)的數(shù)據(jù)傳輸并行化。因此,您可以看到更快的容器啟動(dòng)時(shí)間和更快速的自動(dòng)縮放。
我們開啟了 Cluster Autoscaler 功能,讓有更多的請求到來時(shí),GKE 節(jié)點(diǎn)自動(dòng)進(jìn)行彈性擴(kuò)展。通過 Cluster Autoscaler 觸發(fā)并決定擴(kuò)展到多少個(gè)節(jié)點(diǎn)來接收新增的請求。當(dāng) CA 觸發(fā)了新的一輪擴(kuò)容,新的 GKE 節(jié)點(diǎn)注冊到集群以后,Daemonset 就會開始工作,幫助掛載存儲了 runtime 依賴的磁盤鏡像,而 Stable Diffusion Deployment 則會通過 HostPath 來訪問這個(gè)掛載在節(jié)點(diǎn)上的磁盤。
我們還使用了 Cluster Autoscaler 的 Optimization Utilization Profile 來縮短擴(kuò)縮容時(shí)間、節(jié)省成本并提高機(jī)器利用率。
最后的啟動(dòng)效果如下:
●觸發(fā) Cluster Autoscaler 擴(kuò)容:38s
●Node 啟動(dòng)并調(diào)度 Pod:89s
●掛載 PVC:4s
●啟動(dòng) Pull Image:10s
●拉取鏡像:1s
●啟動(dòng) Pod:1s
●能夠提供 sd-webui 的服務(wù) (大約): 65s
總共經(jīng)歷了大約 3 分鐘的時(shí)間,就完成了啟動(dòng)一個(gè)新的 Stale Diffusion 容器實(shí)例,并在一個(gè)新的 GKE 節(jié)點(diǎn)上進(jìn)行正常服務(wù)的過程。相比于之前的 12 分鐘,可以看見,明顯的提升啟動(dòng)速度改善了用戶體驗(yàn)。
完整代碼: https://github.com/nonokangwei/Stable-Diffusion-on-GCP/tree/main/Stable-Diffusion-UI-Agones/optimizated-init
除了掛載 Disk 到 GKE 節(jié)點(diǎn)上,還有一種嘗試,我們可以使用 StatefulSet 來掛載 PVC。
具體做法如下:先定義一個(gè) storageclass,注意我們使用DiskImageType: images來指定 PVC從 Disk Image 來恢復(fù),而不是 Snapshot。
●Snapshot 每 10 分鐘只能恢復(fù)一次,一小時(shí)以內(nèi)恢復(fù) 6 次 Disk 的限制。
●而 Image 可以支持每 30 秒恢復(fù)一次,最多 1,000 個(gè) Disk。
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: image-class
driver: pd.csi.storage.gke.io
deletionPolicy: Delete
parameters:
DiskImageType: images
再定義一個(gè) VoluemSnapShotContent,它指定了 source 為一個(gè) Disk Image sd-image。
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
name: test-snapshotcontent-from-image
spec:
deletionPolicy: Retain
driver: pd.csi.storage.gke.io
volumeSnapshotClassName: image-class
source:
snapshotHandle:projects/flius-vpc-2/global/images/sd-image
volumeSnapshotRef:
name: test-snapshot
namespace: default
接下來,我們再創(chuàng)建一個(gè) VolumeSnapShot,指定它的 source 是剛剛定義的VoluemSnapShotContent。
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: test-snapshot
namespace: default
spec:
source:
volumeSnapshotContentName:test-snapshotcontent-from-image
最后,我們創(chuàng)建一個(gè) StatefulSet 來掛載這個(gè) VolumeSnapShot。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: stable-diffusion-statefulset-image
labels:
app: stable-diffusion
spec:
podManagementPolicy: "Parallel"
replicas: 1
selector:
matchLabels:
app: stable-diffusion
template:
metadata:
labels:
app: stable-diffusion
spec:
containers:
- name: stable-diffusion-webui
image: us-central1-docker.pkg.dev/flius-vpc-2/stable-diffusion-repo/sd-webui-final:0.1
command: ["/bin/bash"]
args: ["-c", "source /runtime-lib/bin/activate; cp/user-watch.py /runtime-lib/stable-diffusion-webui/user-watch.py;cp/start.sh /runtime-lib/stable-diffusion-webui/start.sh; cd /runtime-lib/stable-diffusion-webui; python3 launch.py --listen --xformers --enable-insecure-extension-access--no-gradio-queue" ]
volumeMounts:
- mountPath: "/runtime-lib"
name: runtime-lib
resources:
limits:
nvidia.com/gpu: 1
ports:
- containerPort: 7860
volumeClaimTemplates:
- metadata:
name: runtime-lib
spec:
dataSource:
name: test-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes: [ "ReadWriteOnce" ]
storageClassName: "standard-rwo"
resources:
requests:
storage: 30Gi
kubectl scale statefulset stable-diffusion-statefulset-image --replicas=15
可見 GKE 可以支持并行的啟動(dòng)這些 Pod,并且分別掛載相應(yīng)的磁盤。
完整代碼:
https://github.com/Leisureroad/volumesnapshot-from-diskimage
最終,我們可以看見如下的 Stable Diffusion 的 WebUI。
?點(diǎn)擊屏末|閱讀原文|了解更多 Google Cloud 技術(shù)趨勢與最新解讀
原文標(biāo)題:優(yōu)化 Stable Diffusion 在 GKE 上的啟動(dòng)體驗(yàn)
文章出處:【微信公眾號:谷歌開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報(bào)投訴
原文標(biāo)題:優(yōu)化 Stable Diffusion 在 GKE 上的啟動(dòng)體驗(yàn)
文章出處:【微信號:Google_Developers,微信公眾號:谷歌開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
相關(guān)推薦
在主板上優(yōu)化PCIe通道設(shè)置是提升系統(tǒng)性能的重要步驟,以下是具體的優(yōu)化建議: 一、了解主板和PCIe規(guī)格 查閱主板手冊 :首先,需要了解主板支持的PCIe版本(如PCIe 3.0、PC
發(fā)表于 11-06 09:30
?319次閱讀
電子發(fā)燒友網(wǎng)站提供《DRA7xx器件上的Android啟動(dòng)優(yōu)化.pdf》資料免費(fèi)下載
發(fā)表于 10-11 09:41
?0次下載
電子發(fā)燒友網(wǎng)站提供《使用TPS61178x優(yōu)化啟動(dòng)的環(huán)路補(bǔ)償.pdf》資料免費(fèi)下載
發(fā)表于 09-25 09:58
?0次下載
StableDiffusion3Medium是一種多模態(tài)擴(kuò)散變換器(MMDiT)文本到圖像模型,在圖像質(zhì)量、排版、復(fù)雜提示理解和資源效率方面具有顯著提升的性能。目前瑞莎團(tuán)隊(duì)
發(fā)表于 07-23 08:34
?207次閱讀
系統(tǒng)資源浪費(fèi),例如電力和硬件資源。而優(yōu)化啟動(dòng)時(shí)間可節(jié)省這些資源,從而提高系統(tǒng)的效率和可靠性。另外,在某些嵌入式系統(tǒng)和設(shè)備中,啟動(dòng)時(shí)間對于系統(tǒng)的穩(wěn)定性和可靠性至關(guān)重要,因此盡可能縮短
發(fā)表于 07-09 11:50
對其進(jìn)行詳細(xì)的性能分析,從而優(yōu)化系統(tǒng)啟動(dòng)速度和運(yùn)行效率。
三丶開機(jī)優(yōu)化
開機(jī)優(yōu)化的主要目的是為了快速啟動(dòng)開機(jī)動(dòng)畫和退出開機(jī)動(dòng)畫(顯示桌面)。
發(fā)表于 07-01 16:39
應(yīng)用,詳細(xì)介紹如何進(jìn)行冷啟動(dòng)的性能優(yōu)化。
AppSpawn 預(yù)加載
可以通過預(yù)加載一些so,加快冷啟動(dòng)的速度。預(yù)加載so 配置在appspawn_preload.json文件中。
文件
發(fā)表于 04-22 16:31
UL去年發(fā)布的首個(gè)Windows版Procyon AI推理基準(zhǔn)測試,以計(jì)算機(jī)視覺工作負(fù)載評估AI推理性能。新推出的圖像生成測試將提供統(tǒng)一、精確且易于理解的工作負(fù)載,用以保證各支持硬件間公平、可比的性能表現(xiàn)。
發(fā)表于 03-25 16:16
?820次閱讀
由此模型的核心在于其運(yùn)用了“知識蒸餾”(knowledge distillation)技術(shù),這使得開源圖像生成工具Stable Diffusion XL可大幅縮小其規(guī)模。原Stable Dif
發(fā)表于 03-01 14:10
?565次閱讀
Stability AI的最新圖像生成模型Stable Cascade承諾比其業(yè)界領(lǐng)先的前身Stable Diffusion更快、更強(qiáng)大,而Stable
發(fā)表于 02-19 16:03
?872次閱讀
在GD32 MCU上,BOOT引腳決定了MCU的啟動(dòng)方式,通常BOOT0引腳下拉時(shí)是flash啟動(dòng),如果BOOT電平不對就不會執(zhí)行我們下載的程序了。
發(fā)表于 01-12 17:08
?1920次閱讀
SAM、HQ-SAM、Stable-SAM在提供次優(yōu)提示時(shí)的性能比較,Stable-SAM明顯優(yōu)于其他算法。這里也推薦工坊推出的新課程《如何將深度學(xué)習(xí)模型部署到實(shí)際工程中?
發(fā)表于 12-29 14:35
?607次閱讀
Lama Cleaner 是由 SOTA AI 模型提供支持的免費(fèi)開源圖像修復(fù)工具??梢詮膱D片中移除任何不需要的物體、缺陷和人,或者擦除并替換(powered by stable diffusion)圖片上的任何東西。
發(fā)表于 12-04 10:23
?2655次閱讀
在過去的3年里,我們在玄鐵C910上分別移植了Android 10和Android 12,在ART上我們也做了一些更加深入的優(yōu)化。
發(fā)表于 11-16 09:43
?1392次閱讀
ai系列的情況是,改進(jìn)和優(yōu)化了RX 600M、RX 700M、RX 6000、RX 7000系列對DirectML的支持,Stable Diffusion、Adobe Lightroom、Davinci Resolve、Proc
發(fā)表于 11-13 10:04
?1930次閱讀
評論