<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

優化 Stable Diffusion 在 GKE 上的啟動體驗

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

以下文章來源于谷歌云服務,作者 Google Cloud

背景


現如今隨著 AIGC 這個話題越來越熱,越來越多優秀的開源項目基于文生圖的 AI 模型如 MidJourney,Stable Diffusion 等應運而生。Stable Diffusion 是一個文字生成圖像的 Diffusion 模型,它能夠根據給定任何文本輸入生成逼真的圖像。我們在 GitHub Repo 中提供了三種不同的解決方案 (可參考https://github.com/nonokangwei/Stable-Diffusion-on-GCP),可以快速地分別在 GCP Vertex AI,GKE,和基于 Agones 的平臺上部署 Stable Diffusion,以提供彈性的基礎設施保證 Stable Diffusion 提供穩定的服務。本文將重點討論 Stable Diffusion 模型在 GKE 上的實踐。


提出問題


在實踐中,我們也遇到了一些問題,例如 Stable Diffusion 的容器鏡像較大,大約達到 10-20GB,導致容器在啟動過程中拉取鏡像的速度變慢,從而影響了啟動時間。在需要快速擴容的場景下,啟動新的容器副本需要超過 10 分鐘的時間,嚴重影響了用戶體驗。



我們看到容器的啟動過程,按時序排列:

觸發 Cluster Autoscaler 擴容 + Node 啟動并調度 Pod: 225s

啟動 Pull Image:4s

拉取鏡像: 5m 23s

啟動 Pod:1s

能夠提供 sd-webui 的服務 (大約): > 2m


在這段時序分析中,我們可以看到,在 Stable Diffusion WebUI 運行在容器上啟動慢主要面臨的問題是由于整個 runtime 依賴較多,導致容器鏡像太大從而花費了很長時間拉取下載、也造成了 pod 啟動初始化加載時間過長。于是,我們考慮優化啟動時間從以下三個方面入手:

優化 Dockerfile,選擇正確的 base image,精簡 runtime 的依賴安裝,減小鏡像大小。

借助基礎環境與 runtime 依賴分離方式,通過磁盤復制方式加速運行環境的創建。

通過 GKE Image Streaming 優化鏡像加載時間,利用 Cluster Autoscaler 提升彈性擴縮容速度。


本文著重為大家介紹通過基礎環境與 runtime 依賴分離方式,借助磁盤復制的高性能來優化 Stable Diffusion WebUI 容器啟動時間的方案。


優化 Dockerfile


首先,我們可以參考官方 Stable Diffusion WebUI 安裝說明,生成其 Dockerfile。在這里給大家一個參考: https://github.com/nonokangwei/Stable-Diffusion-on-GCP/blob/main/Stable-Diffusion-UI-Agones/sd-webui/Dockerfile


在初始構建的 Stable Diffusion 的容器鏡像中,我們發現除了基礎鏡像 nvidia runtime 之外,還安裝了大量的庫和擴展等。


▲調優之前容器鏡像大小為 16.3GB


在 Dockerfile 優化方面,我們對 Dockerfile 進行分析后,發現 nvidia runtime 約占 2GB,而 PyTorch 庫是一個非常大的包,約占 5GB。另外 Stable Diffusion 及其擴展等也占據了一定的空間。因此,我們按照最小可用環境為原則,去除環境中不必要的依賴。將 nvidia runtime 作為基礎鏡像,然后把 PyTorch、Stable Diffusion 的庫和擴展等從原始鏡像中分離出來,單獨存放在文件系統中。


以下是初始的 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 之后,我們只保留了基礎鏡像 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/*


▲基礎鏡像變成了 2GB


其余的運行時類庫和 extension 等存放在磁盤鏡像中,磁盤鏡像的大小為 6.77GB。采用磁盤鏡像的好處是,它可以最多支持同時恢復 1,000 塊磁盤,完全能滿足大規模擴縮容的使用場景。



掛載磁盤到 GKE 節點


然而,問題來了,如何將這個單獨的文件系統掛載到容器運行時中呢?一種想法是使用 Persistent VolumeClaim (PVC) 進行掛載,但由于 Stable Diffusion WebUI 在運行時既需要讀取又需要寫入磁盤,而 GKE 的 PD CSI 驅動程序目前不支持多寫入 ReadWriteMany,只有像 Filestore 這樣的 NFS 文件系統才能支持,但是通過網絡掛載的 Filestore 就延遲來說仍然無法達到快速啟動的效果。同時,由于 GKE 目前不支持在創建或更新 Nodepool 時掛載磁盤,所以我們考慮使用 DaemonSet 在 GKE 節點啟動時掛載磁盤。具體做法如下:



那么如何將磁盤掛載到 GKE 的節點上呢?可以直接調用 Cloud SDK,創建基于磁盤鏡像的磁盤。


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


另外,正如我們前面提到的那樣,在優化鏡像下載和加載時間方面,我們還啟用了 GKE Image Streaming 來加速鏡像的拉取速度。它的工作原理是使用網絡掛載將容器數據層掛載到 containerd 中,并在網絡、內存和磁盤上使用多個緩存層對其進行支持。一旦我們準備好 Image Streaming 掛載,您的容器就會在幾秒鐘內從 ImagePulling 狀態轉換為 Running (無論容器大小);這有效地將應用程序啟動與容器映像中所需數據的數據傳輸并行化。因此,您可以看到更快的容器啟動時間和更快速的自動縮放。


我們開啟了 Cluster Autoscaler 功能,讓有更多的請求到來時,GKE 節點自動進行彈性擴展。通過 Cluster Autoscaler 觸發并決定擴展到多少個節點來接收新增的請求。當 CA 觸發了新的一輪擴容,新的 GKE 節點注冊到集群以后,Daemonset 就會開始工作,幫助掛載存儲了 runtime 依賴的磁盤鏡像,而 Stable Diffusion Deployment 則會通過 HostPath 來訪問這個掛載在節點上的磁盤。


我們還使用了 Cluster Autoscaler 的 Optimization Utilization Profile 來縮短擴縮容時間、節省成本并提高機器利用率。


最后的啟動效果如下:



按時序排列

觸發 Cluster Autoscaler 擴容:38s

Node 啟動并調度 Pod:89s

掛載 PVC:4s

啟動 Pull Image:10s

拉取鏡像:1s

啟動 Pod:1s

能夠提供 sd-webui 的服務 (大約): 65s


總共經歷了大約 3 分鐘的時間,就完成了啟動一個新的 Stale Diffusion 容器實例,并在一個新的 GKE 節點上進行正常服務的過程。相比于之前的 12 分鐘,可以看見,明顯的提升啟動速度改善了用戶體驗。


完整代碼: https://github.com/nonokangwei/Stable-Diffusion-on-GCP/tree/main/Stable-Diffusion-UI-Agones/optimizated-init


通過 VolumeSnapshot


除了掛載 Disk 到 GKE 節點上,還有一種嘗試,我們可以使用 StatefulSet 來掛載 PVC。


具體做法如下:先定義一個 storageclass,注意我們使用DiskImageType: images來指定 PVC從 Disk Image 來恢復,而不是 Snapshot。


Snapshot 每 10 分鐘只能恢復一次,一小時以內恢復 6 次 Disk 的限制。

而 Image 可以支持每 30 秒恢復一次,最多 1,000 個 Disk。

apiVersion: snapshot.storage.k8s.io/v1

kind: VolumeSnapshotClass

metadata:

name: image-class

driver: pd.csi.storage.gke.io

deletionPolicy: Delete

parameters:

DiskImageType: images

再定義一個 VoluemSnapShotContent,它指定了 source 為一個 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


接下來,我們再創建一個 VolumeSnapShot,指定它的 source 是剛剛定義的VoluemSnapShotContent。


apiVersion: snapshot.storage.k8s.io/v1

kind: VolumeSnapshot

metadata:

name: test-snapshot

namespace: default

spec:

source:

volumeSnapshotContentName:test-snapshotcontent-from-image


最后,我們創建一個 StatefulSet 來掛載這個 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 可以支持并行的啟動這些 Pod,并且分別掛載相應的磁盤。



PersistentVolumeClaims



完整代碼:

https://github.com/Leisureroad/volumesnapshot-from-diskimage


最終,我們可以看見如下的 Stable Diffusion 的 WebUI。






?點擊屏末||了解更多 Google Cloud 技術趨勢與最新解讀


原文標題:優化 Stable Diffusion 在 GKE 上的啟動體驗

文章出處:【微信公眾號:谷歌開發者】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 谷歌
    +關注

    關注

    27

    文章

    5858

    瀏覽量

    103251

原文標題:優化 Stable Diffusion 在 GKE 上的啟動體驗

文章出處:【微信號:Google_Developers,微信公眾號:谷歌開發者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    設置應用冷啟動優化案例

    應用,詳細介紹如何進行冷啟動的性能優化。 AppSpawn 預加載 可以通過預加載一些so,加快冷啟動的速度。預加載so 配置appspawn_preload.json文件中。 文件
    發表于 04-22 16:31

    韓國科研團隊發布新型AI圖像生成模型KOALA,大幅優化硬件需求

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

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

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

    Stable Diffusion的完整指南:核心基礎知識、制作AI數字人視頻和本地部署要求

    Stable Diffusion是一種擴散模型(diffusion model)的變體,叫做“潛在擴散模型”(latent diffusion model; LDM)。擴散模型是在20
    的頭像 發表于 09-18 10:06 ?1576次閱讀
    <b class='flag-5'>Stable</b> <b class='flag-5'>Diffusion</b>的完整指南:核心基礎知識、制作AI數字人視頻和本地部署要求

    Stable Diffusion的完整指南:核心基礎知識、制作AI數字人視頻和本地部署要求

    Stable Diffusion;stable;diffusion;SD;stablediffussion;sadtalker;PC集群;PC Farm;PC農場;GPU集群;GAN
    的頭像 發表于 09-07 14:12 ?1429次閱讀
    <b class='flag-5'>Stable</b> <b class='flag-5'>Diffusion</b>的完整指南:核心基礎知識、制作AI數字人視頻和本地部署要求

    嘮嗑兒:連Stable Diffusion文生圖都如此麻溜兒,英特爾Evo認證到底有些啥名堂?

    今兒暫時不推薦機型,而是結合最近的一些熱點應用和輿論風向,來和大家嘮個嗑兒,希望能對大家有幫助。先說幾個事兒: ●來一張SD(Stable Diffusion)生成的AI圖▼,用的是英特爾Iris
    的頭像 發表于 08-30 14:17 ?418次閱讀
    嘮嗑兒:連<b class='flag-5'>Stable</b> <b class='flag-5'>Diffusion</b>文生圖都如此麻溜兒,英特爾Evo認證到底有些啥名堂?

    樹莓派能跑Stable Diffusion了?

    Stable Diffusion是一種文本到圖像生成的大型深度學習模型,它可以根據文本的描述生成詳細的圖像,也可以用于其他任務,如圖像修復、圖像擴展、圖像翻譯等。
    的頭像 發表于 07-26 11:46 ?1105次閱讀

    使用OpenVINO在Stable Diffusion V2.1上實現AI硬件加速的方法

    隨著 AIGC 模型越來越強大,并取得了更驚人的結果,任意運行 AIGC 模型, 比如 Stable Diffusion,對于開發人員來說仍然面臨一些挑戰。首先,GPU 的安裝設置需要我們處理復雜
    的頭像 發表于 07-21 11:47 ?1300次閱讀
    使用OpenVINO在<b class='flag-5'>Stable</b> <b class='flag-5'>Diffusion</b> V2.1上實現AI硬件加速的方法

    美格智能高算力AI模組成功運行Stable Diffusion大模型

    研發團隊成功在自研高算力模組上運行文生圖大模型Stable Diffusion,而這僅僅是我們將思索變為實際行動的第一步,AIGC的大時代,才剛剛開始!
    的頭像 發表于 07-21 11:17 ?608次閱讀

    “AI+機器人”或中道崩阻?估值百億的獨角獸被爆丑聞!

    據知情人士透露,Stable Diffusion的前身是一群德國學者創建的一個名為Latent Diffusion的開源圖像生成器,這個圖像生成器是與紐約一家叫Runway的AI公司合作推出,但當時
    的頭像 發表于 06-14 16:13 ?684次閱讀

    iPhone兩秒出圖,目前已知的最快移動端Stable Diffusion模型來了

    近日,Snap 研究院推出最新高性能 Stable Diffusion 模型,通過對網絡結構、訓練流程、損失函數全方位進行優化,在 iPhone 14 Pro 上實現 2 秒出圖(512x512
    的頭像 發表于 06-12 15:25 ?542次閱讀
    iPhone兩秒出圖,目前已知的最快移動端<b class='flag-5'>Stable</b> <b class='flag-5'>Diffusion</b>模型來了

    基于一種移動端高性能 Stable Diffusion 模型

    ? Stable Diffusion (SD)是當前最熱門的文本到圖像(text to image)生成擴散模型。盡管其強大的圖像生成能力令人震撼,一個明顯的不足是需要的計算資源巨大,推理速度很慢
    的頭像 發表于 06-12 10:14 ?426次閱讀
    基于一種移動端高性能 <b class='flag-5'>Stable</b> <b class='flag-5'>Diffusion</b> 模型

    全志Tina Linux 啟動優化

    的性能指標,更快的啟動速度會讓客戶有更好的使用體驗,某些方面還會節省能耗,因為可以直接關機而不需要休眠。 啟動速度優化可提升產品的競爭力。對于某些系統來說,
    發表于 05-24 10:32

    使用OpenVINO?在算力魔方上加速stable diffusion模型

    Stable Diffusion 是 stability.ai 開源的 AI 圖像生成模型,實現輸入文字,生成圖像的功能。Stable Diffusion 將 AI 圖像生成提升到了全
    的頭像 發表于 05-12 09:10 ?943次閱讀
    使用OpenVINO?在算力魔方上加速<b class='flag-5'>stable</b> <b class='flag-5'>diffusion</b>模型

    一文讀懂Stable Diffusion教程,搭載高性能PC集群,實現生成式AI應用

    PC Farm、生成式AI和Stable Diffusion模型都是非常有用的工具和技術,可以幫助用戶快速構建和管理計算機集群,生成高質量的數據和圖像,提高模型的泛化能力和魯棒性。
    的頭像 發表于 05-01 07:47 ?1889次閱讀
    一文讀懂<b class='flag-5'>Stable</b> <b class='flag-5'>Diffusion</b>教程,搭載高性能PC集群,實現生成式AI應用
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>