将 Google Kubernetes Engine (GKE) 上稳定扩散的启动时间缩短 4 倍

Cloud Ace 是 Google Cloud 全球战略合作伙伴,在亚太地区、欧洲、南北美洲和非洲拥有二十多个办公室。Cloud Ace 在谷歌专业领域认证及专业知识目前排名全球第一位,并连续多次获得 Google Cloud 各类奖项。作为谷歌云托管服务商,我们提供谷歌云谷歌地图谷歌办公套件谷歌云认证培训等服务。

Cloud Ace - 谷歌云 | 谷歌云全球战略合作伙伴 | 云服务器据点最多经销商​cloud-ace.cn/​编辑

随着人工智能生成内容(AIGC)的日益流行,基于文本到图像的人工智能模型(例如稳定扩散)的开源项目已经出现。稳定扩散是一种扩散模型,可根据给定的文本输入生成逼真的图像。在此 GitHub 存储库中,我们提供了三种不同的解决方案,分别用于在 Google Cloud Vertex AI、Google Kubernetes Engine (GKE) 和基于 Agones 的平台上快速部署 Stable Diffusion,以通过弹性基础设施确保稳定的服务交付。本文将重点介绍 GKE 上的稳定扩散模型,并将启动时间缩短多达 4 倍。

问题陈述

Stable Diffusion 的容器镜像较大,大约达到 10-20GB,这会减慢容器启动时的镜像拉取过程,从而影响启动时间。在需要快速伸缩的场景下,启动新的容器副本可能需要10分钟以上,严重影响用户体验。

在容器启动过程中,我们可以按时间顺序看到以下事件:

  1. 触发Cluster Autoscaler进行伸缩+节点启动和Pod调度:225秒
  2. 图片拉取启动:4秒
  3. 图片拉取:5分23秒
  4. Pod 启动:1 秒
  5. SD-WebUI服务:超过2分钟

分析这个时间序列可以看出,运行在容器中的 Stable Diffusion WebUI 启动缓慢主要是由于整个运行时的依赖较重,导致容器镜像体积过大,拉取镜像和初始化pod的时间变长。

因此,我们从以下三个方面考虑优化启动时间:

  1. 优化Dockerfile:选择合适的基础镜像,尽量减少运行时依赖的安装,以减小镜像大小。
  2. 将基础环境与运行时依赖分离:通过PD磁盘镜像加速运行时环境的创建。
  3. 利用 GKE Image Streaming:利用 GKE Image Streaming 优化图像加载时间,并利用 Cluster Autoscaler 来增强弹性缩放和调整大小的速度。

本文重点介绍一种通过将基础环境与运行时依赖项分离并利用高性能磁盘映像来优化 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运行时之外,还安装了大量的库、依赖项和扩展。

优化前,容器镜像大小为16.3GB。

在优化Dockerfile方面,经过对Dockerfile的分析,我们发现nvidia运行时占用了大约2GB,而PyTorch库是一个非常大的包,占用了5GB左右。此外,稳定扩散及其扩展也占据了一些空间。

因此,遵循最小可行环境的原则,我们可以从环境中删除不必要的依赖项。

我们可以使用 NVIDIA 运行时作为基础镜像,将 PyTorch 库、Stable Diffusion 库和扩展从原始镜像中分离出来,分别存储在文件系统中。下面是原始的 Dockerfile 片段,

# Base image
FROM nvidia/cuda:11.8.0-runtime-ubuntu22.04RUN 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://github.com/toshiaki1729/stable-diffusion-webui-dataset-tag-editor.git extensions/stable-diffusion-webui-dataset-tag-editor

移出 Pytorch 库和稳定扩散后,我们只在基础映像中保留了 NVIDIA 运行时,这是新的 Dockerfile。

使用PD磁盘镜像来存储库PD 磁盘映像是 Google Cloud 中实例部署的基石。这些虚拟映像通常称为模板或引导磁盘,包含基线操作系统以及实例首次启动时将拥有的所有应用程序软件和配置。这里的想法是将所有运行时库和扩展存储在磁盘映像中,在本例中磁盘映像的大小为 6.77GB。使用磁盘镜像的优点是最多可以支持1000个磁盘同时恢复,适合大规模扩缩容的场景。

gcloud compute disks create sd-lib-disk-$NOW --type=pd-balanced --size=30GB --zone=$ZONE --image=$IMAGE_NAMEgcloud compute instances attach-disk ${MY_NODE_NAME} --disk=projects/$PROJECT_ID/zones/$ZONE/disks/sd-lib-disk-$NOW --zone=$ZONE

我们使用 DaemonSet 在 GKE 节点启动时挂载磁盘。

具体步骤如下:

如前几节所述,为了加快初始启动以获得更好的性能,我们尝试将永久性磁盘挂载到 GKE 节点以放置运行时库以实现稳定扩散。

利用 GKE Image Streaming 和集群自动缩放器

此外,如前所述,我们还启用了 GKE Image Streaming 来加速图像拉取和加载过程。GKE Image Streaming 的工作原理是使用网络挂载将容器的数据层附加到 containerd,并通过网络、内存和磁盘上的多个缓存层来支持它。一旦我们准备好 Image Streaming 挂载,无论容器大小如何,您的容器都会在几秒钟内从 ImagePulling 状态转换为 Running 状态。这有效地将应用程序启动与容器映像中所需数据的数据传输并行化。因此,您可以体验更快的容器启动时间和更快的自动扩展。

我们启用了 Cluster Autoscaler (CS) 功能,该功能允许 GKE 节点在请求增加时自动扩展。Cluster Autoscaler 触发并确定处理额外请求所需的节点数量。当 Cluster Autoscaler 启动新的扩展浪潮并且新的 GKE 节点在集群中注册时,DaemonSet 开始工作以协助挂载包含运行时依赖项的磁盘映像。然后,稳定扩散部署通过 HostPath 访问该磁盘。此外,我们还利用了Cluster Autoscaler 的优化利用率配置文件,这是 GKE CA 上的一个配置文件,它优先考虑优化利用率而不是保留集群中的备用资源,以减少扩展时间、节省成本并提高机器利用率。

最终结果

最终启动结果如下:

按年代顺序:

  1. 触发集群自动缩放器进行缩放:38秒
  2. 节点启动和Pod调度:89秒
  3. 安装PVC:4秒
  4. 图片拉取启动:10秒
  5. 图片拉取:1秒
  6. Pod 启动:1 秒
  7. 能够提供sd-webui服务(大约):65秒

总体而言,启动新的 Stable Diffusion 容器实例并开始在新的 GKE 节点上提供服务大约需要 3 分钟。与之前的12分钟相比,显然启动速度的显著提升,提升了用户体验。

在这里查看完整代码:

https://github.com/nonokangwei/Stable-Diffusion-on-GCP/tree/main/Stable-Diffusion-UI-Agones/optimized-init

注意事项:虽然上述技术分割了依赖关系,使容器大小更小,并且您可以从 PD 磁盘映像加载库,但仍有一些缺点需要考虑。将所有内容打包在一个容器映像中具有其优点,您可以拥有单个不可变且版本化的工件。将基本环境与运行时依赖项分离意味着您需要维护和更新多个工件。您可以通过构建工具来管理 PD 磁盘映像的更新来缓解这种情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/79129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构建健壮的Spring MVC应用:JSON响应与异常处理

目录 1. 引言 2. JSON 1. 轻量级和可读性 2. 易于编写和解析 3. 自描述性 4. 支持多种数据类型 5. 平台无关性 6. 易于集成 7. 社区支持和标准化 3. 高效处理异常 综合案例 异常处理方式一 异常处理方式二 异常处理方式三 1. 引言 探讨Spring MVC中关键的JSON数据…

【autodl/linux配环境心得:conda/本地配cuda,cudnn及pytorch心得】

linux配环境心得:conda/本地配cuda,cudnn及pytorch心得 我们服务器遇到的大多数找不到包的问题一,服务器安装cuda和cudnn使用conda在线安装cuda和cudnn使用conda进行本地安装检查conda安装的cuda和cudnn本地直接安装cuda和cudnn方法一&#x…

java高级:注解

目录 认识注解&自定义注解元注解解析注解注解的应用场景 认识注解&自定义注解 注解和反射一样,都是用来做框架的,我们这里学习注解的目的其实是为了以后学习框架或者做框架做铺垫的。 先来认识一下什么是注解?Java注解是代码中的特…

嵌入式学习笔记(31)异常向量表的编程处理

6.5.1像内存一样去访问异常向量表 (1)S5PV210的异常向量表可以改变(在CP15协处理器中),以适应操作系统的需求。但是目前系统刚启动,此时DRAM尚未初始化,程序哦都市在iSRAM中运行。210在iSRAM中…

C++下基于粒子群算法解决TSP问题

粒子群优化算法求解TSP旅行商问题C(2020.11.12)_jing_zhong的博客-CSDN博客 混合粒子群算法(PSO):C实现TSP问题 - 知乎 (zhihu.com) 一、原理 又是一个猜答案的算法,和遗传算法比较像,也是设…

入门人工智能 ——自然语言处理介绍,并使用 Python 进行文本情感分析(5)

入门人工智能 ——自然语言处理介绍,并使用 Python 进行文本情感分析(5)) 入门人工智能 ——自然语言处理介绍,并使用 Python 进行文本情感分析介绍自然语言处理的挑战NLP的基本任务NLP的基本技术NLP的应用领域 使用 P…

FPGA的基础架构,什么是CLB?

本原创文章由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处 CLB是指可编程逻辑功能块(Configurable Logic Blocks),顾名思义就是可编程的数字逻辑电路。CLB是FPGA内的三个基本逻辑单元。C…

与社交媒体结合:视频直播美颜sdk在社交平台上的应用

为了让直播内容更吸引人,视频直播美颜sdk(Software Development Kit)正逐渐崭露头角,为社交媒体用户提供了卓越的美颜效果和互动体验。 一、什么是视频直播美颜sdk? 在深入讨论如何将视频直播美颜sdk整合到社交媒体平…

CSS元素浮动

概述 浮动简介 在最初,浮动是用来实现文字环绕图片效果的,现在浮动是主流的页面布局方式之一。 元素浮动后的特点 脱离文档流。不管浮动前是什么元素,浮动后,默认宽与高都是被内容撑开的(尽可能小)&am…

时序分解 | MATLAB实现基于小波分解信号分解分量可视化

时序分解 | MATLAB实现基于小波分解信号分解分量可视化 目录 时序分解 | MATLAB实现基于小波分解信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于小波分解的分量可视化,MATLAB编程程序,用于将信号分解成不同尺度和频率的子信…

实用技巧:Linux上实现OpenGauss数据库远程连接,方便的跨网络数据操作

文章目录 前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 🍁 小结 🍁 前言 openGauss是一款开源关系型数据库管理系统,采用木兰宽松许…

Spring-MVC使用JSR303及拦截器,增强网络隐私安全

目录 一、JSR303 ( 1 ) 是什么 ( 2 ) 作用 ( 3 ) 常用注解 ( 4 ) 入门使用 二、拦截器 2.1 是什么 2.2 拦截器与过滤器的区别 2.3 应用场景 2.4 基础使用 2.5 用户登录权限控制 给我们带来的收获 一、JSR303 ( 1 ) 是什么 JSR 303是Java规范请求&#xff…

进程间通信——共享内存

目录 共享内存的原理 共享内存通信的实现步骤 通信实例 共享内存的原理 原理:可以说,共享内存是一种最为高效的进程间通信方式。因为进程可以直接读写内存,不需要任何数据的复制。为了在多个进程间交换信息,内核专门留出一块内…

C语言 —— 初步入门知识(第一个C语言程序、数据类型、变量常量、字符与注释)

本篇文章介绍C语言的基础知识,使读者对C语言能够有一个大概的认识. 不会细写每一个知识点, 但是能够入门C语言, 进行初步的C语言代码阅读. 首先, 什么是语言? 对于人和人之间进行交流的语言, 我们知道, 可以通过汉语, 英语, 日语等语言进行交流. 那么对于人和计算…

计算机网络:三次握手与四次挥手

摘取作者:拓跋阿秀 三次握手 三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后…

SpringMVC系列(四)之SpringMVC实现文件上传和下载

目录 前言 一. SpringMVC文件上传 1. 配置多功能视图解析器 2. 前端代码中,将表单标记为多功能表单 3. 后端利用MultipartFile 接口,接收前端传递到后台的文件 4. 文件上传示例 1. 相关依赖: 2. 逆向生成对应的类 3. 后端代码&#xf…

(10)(10.9) 术语表(一)

文章目录 前言 1 2.4Ghz 2 AGL 3 AHRS 4 APM 5 AMA 6 Arduino 7 APM (AutoPilot Mega) 8 ATC 9 Copter 10 Plane 11 Rover 12 BEC 13 Bootloader 14 COA 15 DCM 16 Eagle file 17 ESC 18 Firmware 19 FPV 20 FTDI 前言 !Note 术语表未编入索…

微信小程序学习笔记1.0

第1章 微信小程序基础 1.1 微信小程序介绍 1.1.1 什么是微信小程序 微信小程序的特点: ① 微信小程序是不需要下载和安装的; ② 它可以完成App应用软件的交互功能; ③ 用户扫一扫或者搜一下就可以使用小程序; ④ 微信小程序…

Python模板注入(SSTI)

概念 发生在使用模板引擎解析用户提供的输入时。模板注入漏洞可能导致攻击者能够执行恶意代码或访问未授权的数据。 模板引擎可以让(网站)程序实现界面与数据分离,业务代码与逻辑代码分离。即也拓宽了攻击面,注入到模板中的代码可…

数据库逻辑透明-架构真题(二十九)

(2020年)假设某计算机字长为32位,该计算机文件管理系统磁盘空间管理采用位示图(bitmap)记录磁盘的使用情况。若磁盘的容量为300GB,物理块大小为4MB,那么位示图的大小为()…