生产级Stable Diffusion AI服务部署指南【BentoML】

在本文中,我们将完成 BentoML 和 Diffusers 库之间的集成过程。 通过使用 Stable Diffusion 2.0 作为案例研究,你可以了解如何构建和部署生产就绪的 Stable Diffusion 服务。

在这里插入图片描述

推荐:用 NSDT编辑器 快速搭建可编程3D场景

Stable Diffusion 2.0 包含多项新功能,例如更高分辨率(例如 768x768 输出)、称为depth2img 的深度引导稳定扩散模型、内置 4 倍放大模型等等。 更重要的是,你将亲身了解如何利用这两个库的强大功能在生产环境中构建和部署健壮、可扩展且高效的扩散模型。

以下教程的详细代码和说明可以在 BentoML 的 Diffusers 示例项目下找到。

1、为什么选择Diffusers库

HuggingFace 的 Diffusers 库是一个强大的工具,用于访问和利用 Python 中的相关扩散模型。 该库注重易用性,配备了多个扩散管道,只需几行代码即可执行,让用户快速高效地上手。 模型的不同实现和版本可以轻松交换,因为 Diffusers 库试图统一常见扩散模型的接口。 我们甚至可以使用具有类似工作流程的音频生成模型(使用Diffusers)。 最后,Diffusers 社区提供随时可用的自定义管道,这将扩展标准稳定扩散管道的功能。

2、为什么选择 BentoML

将 Diffusers 与 BentoML 集成,使其成为现实部署中更有价值的工具。 借助 BentoML,用户可以轻松打包和提供扩散模型以供生产使用,确保可靠且高效的部署。 BentoML 配备了开箱即用的运营管理工具,例如监控和跟踪,并提供轻松部署到任何云平台的自由。

3、准备依赖

我们建议在配备 Nvidia GPU 且安装了 CUDA Toolkit 的计算机上运行 Stable Diffusion 服务。 我们首先制作一个虚拟环境并安装必要的依赖项。

python3 -m venv venv
source venv/bin/activate
pip install bentoml diffusers transformers accelerate

要访问某些模型,你可能需要使用 Hugging Face 帐户登录。 可以登录你的帐户并获取用户访问令牌。 然后安装huggingface-hub并运行登录命令。

pip install -U huggingface_hub
huggingface-cli login

4、导入扩散模型

使用模型标识符将扩散模型导入 BentoML 模型存储非常简单。

import bentomlbentoml.diffusers.import_model("sd2","stabilityai/stable-diffusion-2",
)

上面的代码片段将从 HuggingFace Hub 下载 Stable Diffusion 2 模型(如果之前已经下载过该模型,则使用缓存的下载文件)并将其导入名为 sd2 的 BentoML 模型存储中。

如果磁盘上已经有经过微调的模型,你还可以提供路径而不是模型标识符。

import bentomlbentoml.diffusers.import_model("sd2","./local_stable_diffusion_2/",
)

可以导入Diffusers支持的任何扩散模型。 例如,以下代码将导入 Linaqruf/anything-v3.0 而不是 stableai/stable-diffusion-2。

import bentomlbentoml.diffusers.import_model("anything-v3","Linaqruf/anything-v3.0",
)

3、将扩散模型转变为 RESTful 服务

使用 Stable Diffusion 2.0 的 text2img 服务可以像下面这样实现,假设 sd2 是导入的 Stable Diffusion 2.0 模型的模型名称。

import torch
from diffusers import StableDiffusionPipelineimport bentoml
from bentoml.io import Image, JSON, Multipartbento_model = bentoml.diffusers.get("sd2:latest")
stable_diffusion_runner = bento_model.to_runner()svc = bentoml.Service("stable_diffusion_v2", runners=[stable_diffusion_runner])@svc.api(input=JSON(), output=Image())
def txt2img(input_data):images, _ = stable_diffusion_runner.run(**input_data)return images[0]

将代码保存为 service.py,然后我们就可以启动 BentoML 服务端点。

bentoml serve service:svc --production
具有接受 JSON 字典的 /txt2img 端点的 HTTP 服务器应位于端口 3000。在 Web 浏览器中转至 http://127.0.0.1:3000 以访问 Swagger UI:

在这里插入图片描述

或者,你可以使用curl 测试文本到图像的生成,并将返回的图像写入output.jpg:

curl -X POST http://127.0.0.1:3000/txt2img -H 'Content-Type: application/json' -d "{\"prompt\":\"a black cat\"}" --output output.jpg

你可以在 JSON 字典内添加更多文本参数来生成图像。 以下输入将生成 768x768 的图像:

curl -X POST http://127.0.0.1:3000/txt2img \-H 'Content-Type: application/json' \-d "{\"prompt\":\"a black cat\", \"height\":768, \"width\":768}" \--output output.jpg

如果先前已导入模型,则使用另一个扩散模型很简单,只需更改模型名称即可。 例如,可以通过将模型名称更改为 everything-v3 来创建 Anything v3.0 服务,而不是 sd2。

bento_model = bentoml.diffusers.get("anything-v3:latest")
anything_v3_runner = bento_model.to_runner()svc = bentoml.Service("anything_v3", runners=[anything_v3_runner])@svc.api(input=JSON(), output=Image())
def txt2img(input_data):images, _ = anything_v3_runner.run(**input_data)return images[0]

你可以尝试Bentoml用于稳定扩散 2.0 服务的相同的curl命令,生成的结果将具有非常不同的风格。

Bentoml.diffusers 还支持扩散器的自定义管道。 如果你想要一种可以使用一个管道同时处理 txt2img 和 img2img 的服务(这可以节省 GPU 的 VRAM),那么这尤其方便。 官方 Diffusers 管道不支持此功能,但社区提供了一个名为“Stable Diffusion Mega”的即用管道,其中包含此功能。 要使用此管道,我们需要稍微不同地导入扩散模型。

import bentomlbentoml.diffusers.import_model("sd2","stabilityai/stable-diffusion-2",signatures={"__call__": {"batchable": False},"text2img": {"batchable": False},"img2img": {"batchable": False},"inpaint": {"batchable": False},}
)

这段代码将告诉 BentoML 除了 __call__ 之外,扩散模型还有其他方法(例如 text2img)。 重新导入模型后,我们可以拥有一个可以运行文本到图像生成和图像到图像生成的服务。

import torch
from diffusers import DiffusionPipelineimport bentoml
from bentoml.io import Image, JSON, Multipartbento_model = bentoml.diffusers.get("sd2:latest")
stable_diffusion_runner = bento_model.with_options(pipeline_class=DiffusionPipeline,custom_pipeline="stable_diffusion_mega",
).to_runner()svc = bentoml.Service("stable_diffusion_v2", runners=[stable_diffusion_runner])@svc.api(input=JSON(), output=Image())
def txt2img(input_data):images, _ = stable_diffusion_runner.text2img.run(**input_data)return images[0]img2img_input_spec = Multipart(img=Image(), data=JSON())
@svc.api(input=img2img_input_spec, output=Image())
def img2img(img, data):data["image"] = imgimages, _ = stable_diffusion_runner.img2img.run(**data)

4、通过 Xformers 加速生成

xformers 是一个基于 PyTorch 的库,它托管灵活且优化良好的 Transformers 构建块。 通过 Diffusers,bentoml.diffusers 与 xformers 集成,以在可能的情况下加速扩散模型。 Bentoml.diffusers 服务将在启动时检测是否安装了 xformers,并使用它来自动加速生成过程。

pip install xformers triton

重新运行前面步骤中的 Bentomlserve service:svc --Production,单个图像的生成时间应该比以前更快。 在我们的测试中,只需安装 xformers 即可将在单个 RTX 3060 上运行的生成效率从 7.6 it/s 加速到 9.0 it/s。该优化在 A100 等更强大的 GPU 上效果会更好。

5、结束语

Diffusers 库及其与 BentoML 的集成相结合,为在生产中部署扩散模型提供了强大且实用的解决方案,无论你是经验丰富还是刚刚起步。


原文链接:BentoML部署稳定扩散 — BimAnt

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

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

相关文章

睿趣科技:未来抖音开网店还有前景吗

随着科技的快速发展,电商平台已经成为了人们生活中不可或缺的一部分。在中国,抖音作为一个短视频平台,近年来迅速崛起,吸引了大量的用户和商家。那么,在未来,抖音是否还能为商家提供一个有效的电商平台呢?…

logicFlow 流程图编辑工具使用及开源地址

一、工具介绍 LogicFlow 是一款流程图编辑框架,提供了一系列流程图交互、编辑所必需的功能和灵活的节点自定义、插件等拓展机制。LogicFlow 支持前端研发自定义开发各种逻辑编排场景,如流程图、ER 图、BPMN 流程等。在工作审批配置、机器人逻辑编排、无…

VScode Invoke-Expression: 无法将参数绑定到参数“Command”,因为该参数为空字符串

打开vscode时发生错误:Invoke-Expression : 无法将参数绑定到参数“Command”,因为该参数为空字符串。 解决办法:在anaconda prompt base中输入: conda upgrade -n base -c defaults --override-channels conda

MySQL常用脚本

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《ELement》。🎯🎯 &#x1…

Red Giant Trapcode Suite 红巨星粒子插件

Red Giant Trapcode Suite是一款用于在After Effects中模拟和建模3D粒子和效果的软件,由Red Giant Software公司开发。 该软件包包含11种不同的工具,可以帮助用户模拟火、水、烟、雪等粒子效果,以及创建有机视觉效果和3D元素。它还支持在AE与…

Jetson Orin NX 开发指南(9): MAVROS 的安装与配置

一、前言 由于 Jetson 系列开发板常作为自主无人机的机载电脑,而无人机硬件平台如 PX4 和 ArduPilot 等通过 MAVLink 进行发布无人机状态和位姿等信息,要实现机载电脑与 MAVLink 的通信,必须借助 Mavros 功能包,因此,…

PG14归档失败解决办法archiver failed on wal_lsn

问题描述 昨晚RepmgrPG14主备主库因wal日志撑爆磁盘,删除主库过期wal文件重做备库后上午进行主备状态巡查,主库向备库发送wal文件正常,但是查主库状态时发现显示有1条归档失败的记录。 postgres: archiver failed on 000000010000006F000000…

Tomcat的安装和配置

一.Tomcat下载:去Tomcat官网地址 在左侧Download中选择你需要下载的版本,这里我选择Tomcat9 根据电脑系统是32位还是64位选择,这里我选择64-bit Windows zip,点击即可下载 下载后直接解压,这里我解压在E盘的computer…

行业追踪,2023-10-12

自动复盘 2023-10-12 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

以单颗CMOS摄像头重构三维场景,维悟光子发布单目红外3D成像模组

维悟光子近期发布全新单目红外3D成像模组,现可提供下游用户进行测试导入。通过结合微纳光学元件编码和人工智能算法解码,维悟光子单目红外3D成像模组采用单颗摄像头,通过单帧拍摄,可同时获取像素级配准的3D点云和红外图像信息,可被应用于机器人、生物识别等广阔领域。 市场…

【RKNN】YOLO V5中pytorch2onnx,pytorch和onnx模型输出不一致,精度降低

在yolo v5训练的模型,转onnx,再转rknn后,测试发现: rknn模型,量化与非量化,相较于pytorch模型,测试精度都有降低onnx模型,相较于pytorch模型,测试精度也有降低&#xff…

缓存设计的创新之旅:架构的灵魂之一

缓存在架构设计中占有重要地位。缓存在提升性能中也扮演重要的角色。常见的有对资源的缓存,比如数据库连接池、http连接池,还有对数据的缓存等。缓存的设计可复杂也可简单,但是需要考虑的点却很多。 缓存对象 设计缓存的时候一定要考虑的是&…

大语言模型之十七-QA-LoRA

由于基座模型通常需要海量的数据和算力内存,这一巨大的成本往往只有巨头公司会投入,所以一些优秀的大语言模型要么是大公司开源的,要么是背后有大公司身影公司开源的,如何从优秀的开源基座模型针对特定场景fine-tune模型具有广大的…

香港专用服务器拥有良好的国际网络连接

香港服务器在多个领域有着广泛的应用。无论是电子商务、金融交易、游戏娱乐还是社交媒体等,香港服务器都能够提供高效稳定的服务。对于跨境电商来说,搭建香港服务器可以更好地满足亚洲用户的购物需求;对于金融机构来说,香港服务器…

当涉及到API接口数据分析时,主要可以从以下几个方面展开

当涉及到API接口数据分析时,主要可以从以下几个方面展开: 请求分析:可以统计每个API接口的请求次数、请求成功率、失败率等基础指标。这些指标可以帮助你了解API接口的使用情况,比如哪个API接口被调用的次数最多,哪个…

c++-list

文章目录 前言一、list介绍及使用1、list介绍2、list使用2.1 list构造函数的使用2.2 list iterator的使用2.3 list capacity的使用2.4 list modifiers的使用2.5 list使用算法库中的find模板生成find方法2.6 list中的sort方法 二、list模拟实现1、查看list源码的大致实现思路2、…

身份证实名核验接口,身份证实名认证,身份证二要素实名认证,身份证实名校验,身份证一致性实名认证

一、接口介绍 验证身份证与姓名是否匹配,查询身份证信息。如校验通过,接口返回生日、性别、地址等信息。广泛应用于信贷、安防、银行、保险等行业及各种身份核查场景。 注意:当请求参数符合“【固定同一个参数,其余参数不同】,”…

基于VScode 使用plantUML 插件设计状态机

本文主要记录本人初次在VScode上使用PlantUML设计 本文只讲述操作的实际方法,假设java已安装成功 。 1. 在VScode下安装如下插件 2. 验证环境是否正常 新建一个文件夹并在目录下面新建文件test.plantuml 其内容如下所示: startuml hello world skinparam Style …

基于小波变换的分形信号r指数求解算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ................................................................... %通过功率谱密度曲线…

WebSocket连接异常 Error parsing HTTP request header Connection reset by peer

问题描述 在使用spring的方式集成websocket时,在配置WebSocketConfigurer后 Configuration EnableWebSocket public class WebSocketConfiguration implements WebSocketConfigurer {ResourceServletWebSocketServerHandler servletWebSocketServerHandler;Overri…