0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

優(yōu)化 Stable Diffusion 在 GKE 上的啟動(dòng)體驗(yàn)

谷歌開發(fā)者 ? 來源:未知 ? 2023-06-03 08:35 ? 次閱讀

以下文章來源于谷歌云服務(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í)間的方案。


優(yōu)化 Dockerfile


首先,我們可以參考官方 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ò)縮容的使用場景。



掛載磁盤到 GKE 節(jié)點(diǎn)


然而,問題來了,如何將這個(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)效果如下:



按時(shí)序排列

觸發(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


通過 VolumeSnapshot


除了掛載 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


我們嘗試擴(kuò)容更多的副本。


kubectl scale statefulset stable-diffusion-statefulset-image --replicas=15


可見 GKE 可以支持并行的啟動(dòng)這些 Pod,并且分別掛載相應(yīng)的磁盤。



PersistentVolumeClaims



完整代碼:

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)投訴
  • 谷歌
    +關(guān)注

    關(guān)注

    27

    文章

    6128

    瀏覽量

    104951

原文標(biāo)題:優(yōu)化 Stable Diffusion 在 GKE 上的啟動(dòng)體驗(yàn)

文章出處:【微信號:Google_Developers,微信公眾號:谷歌開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    主板優(yōu)化PCIe通道設(shè)置

    主板優(yōu)化PCIe通道設(shè)置是提升系統(tǒng)性能的重要步驟,以下是具體的優(yōu)化建議: 一、了解主板和PCIe規(guī)格 查閱主板手冊 :首先,需要了解主板支持的PCIe版本(如PCIe 3.0、PC
    的頭像 發(fā)表于 11-06 09:30 ?319次閱讀

    DRA7xx器件的Android啟動(dòng)優(yōu)化

    電子發(fā)燒友網(wǎng)站提供《DRA7xx器件的Android啟動(dòng)優(yōu)化.pdf》資料免費(fèi)下載
    發(fā)表于 10-11 09:41 ?0次下載
    DRA7xx器件<b class='flag-5'>上</b>的Android<b class='flag-5'>啟動(dòng)</b><b class='flag-5'>優(yōu)化</b>

    使用TPS61178x優(yōu)化啟動(dòng)的環(huán)路補(bǔ)償

    電子發(fā)燒友網(wǎng)站提供《使用TPS61178x優(yōu)化啟動(dòng)的環(huán)路補(bǔ)償.pdf》資料免費(fèi)下載
    發(fā)表于 09-25 09:58 ?0次下載
    使用TPS61178x<b class='flag-5'>優(yōu)化</b><b class='flag-5'>啟動(dòng)</b>的環(huán)路補(bǔ)償

    實(shí)操: 如何在AirBoxStable Diffusion 3

    StableDiffusion3Medium是一種多模態(tài)擴(kuò)散變換器(MMDiT)文本到圖像模型,圖像質(zhì)量、排版、復(fù)雜提示理解和資源效率方面具有顯著提升的性能。目前瑞莎團(tuán)隊(duì)
    的頭像 發(fā)表于 07-23 08:34 ?207次閱讀
    實(shí)操: 如何在AirBox<b class='flag-5'>上</b>跑<b class='flag-5'>Stable</b> <b class='flag-5'>Diffusion</b> 3

    4.3s,Linux快速啟動(dòng)優(yōu)化方法分享,基于全志T113-i國產(chǎn)平臺!

    系統(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

    OpenHarmony之開機(jī)優(yōu)化

    對其進(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

    設(shè)置應(yīng)用冷啟動(dòng)優(yōu)化案例

    應(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 Procyon AI 發(fā)布圖像生成基準(zhǔn)測試,基于Stable Diffusion

    UL去年發(fā)布的首個(gè)Windows版Procyon AI推理基準(zhǔn)測試,以計(jì)算機(jī)視覺工作負(fù)載評估AI推理性能。新推出的圖像生成測試將提供統(tǒng)一、精確且易于理解的工作負(fù)載,用以保證各支持硬件間公平、可比的性能表現(xiàn)。
    的頭像 發(fā)表于 03-25 16:16 ?820次閱讀

    韓國科研團(tuán)隊(duì)發(fā)布新型AI圖像生成模型KOALA,大幅優(yōu)化硬件需求

    由此模型的核心在于其運(yùn)用了“知識蒸餾”(knowledge distillation)技術(shù),這使得開源圖像生成工具Stable Diffusion XL可大幅縮小其規(guī)模。原Stable Dif
    的頭像 發(fā)表于 03-01 14:10 ?565次閱讀

    Stability AI試圖通過新的圖像生成人工智能模型保持領(lǐng)先地位

    Stability AI的最新圖像生成模型Stable Cascade承諾比其業(yè)界領(lǐng)先的前身Stable Diffusion更快、更強(qiáng)大,而Stable
    的頭像 發(fā)表于 02-19 16:03 ?872次閱讀
    Stability AI試圖通過新的圖像生成人工智能模型保持領(lǐng)先地位

    MCU電不啟動(dòng)的可能原因分析

    GD32 MCU,BOOT引腳決定了MCU的啟動(dòng)方式,通常BOOT0引腳下拉時(shí)是flash啟動(dòng),如果BOOT電平不對就不會執(zhí)行我們下載的程序了。
    發(fā)表于 01-12 17:08 ?1920次閱讀
    MCU<b class='flag-5'>上</b>電不<b class='flag-5'>啟動(dòng)</b>的可能原因分析

    一種新的分割模型Stable-SAM

    SAM、HQ-SAM、Stable-SAM提供次優(yōu)提示時(shí)的性能比較,Stable-SAM明顯優(yōu)于其他算法。這里也推薦工坊推出的新課程《如何將深度學(xué)習(xí)模型部署到實(shí)際工程中?
    的頭像 發(fā)表于 12-29 14:35 ?607次閱讀
    一種新的分割模型<b class='flag-5'>Stable</b>-SAM

    免費(fèi)開源圖像修復(fù)工具lama-cleaner介紹

    Lama Cleaner 是由 SOTA AI 模型提供支持的免費(fèi)開源圖像修復(fù)工具??梢詮膱D片中移除任何不需要的物體、缺陷和人,或者擦除并替換(powered by stable diffusion)圖片的任何東西。
    的頭像 發(fā)表于 12-04 10:23 ?2655次閱讀
    免費(fèi)開源圖像修復(fù)工具lama-cleaner介紹

    Android ART玄鐵C910的移植和性能優(yōu)化

    在過去的3年里,我們玄鐵C910分別移植了Android 10和Android 12,ART我們也做了一些更加深入的優(yōu)化。
    的頭像 發(fā)表于 11-16 09:43 ?1392次閱讀
    Android ART<b class='flag-5'>在</b>玄鐵C910<b class='flag-5'>上</b>的移植和性能<b class='flag-5'>優(yōu)化</b>

    AMD發(fā)布23.11.1版顯卡驅(qū)動(dòng):AI性能飛躍

    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次閱讀