生产级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.mzph.cn/news/102026.shtml

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

相关文章

uniapp微信小程序自定义封装分段器。

uniapp微信小程序自定义封装分段器。 话不多说先上效果 这里我用的是cil框架 vue3 下面贴代码 组价代码&#xff1a; <template><view class"page"><viewv-for"(item, index) in navList":key"index"click"changeNav(ind…

docker之Harbor私有仓库

目录 一、什么是Harbor 二、Harbor的特性 三、Harbor的构成 1、六个组件 2、七个容器 四、私有镜像仓库的上传与下载 五、部署docker-compose服务 把项目中的镜像数据进行打包持久数据&#xff0c;如镜像&#xff0c;数据库等在宿主机的/data/目录下&#xff0c; 一、什么…

idea将jar包deploy到本地仓库

1、pom.xml文件引入配置&#xff0c;如下参考&#xff1a; <distributionManagement><snapshotRepository><id>maven-snapshots</id><url>http://nexus1.coralglobal.cn/repository/maven-snapshots/</url></snapshotRepository><…

Maven 构建配置文件

目录 构建配置文件的类型 配置文件激活 配置文件激活实例 1、配置文件激活 2、通过Maven设置激活配置文件 3、通过环境变量激活配置文件 4、通过操作系统激活配置文件 5、通过文件的存在或者缺失激活配置文件 构建配置文件是一系列的配置项的值&#xff0c;可以用来设置…

Talk | ACL‘23 杰出论文,MultiIntruct:通过多模态指令集微调提升VLM的零样本学习

本期为TechBeat人工智能社区第536期线上Talk&#xff01; 北京时间10月11日(周三)20:00&#xff0c;弗吉尼亚理工大学博士生—徐智阳、沈莹的Talk已准时在TechBeat人工智能社区开播&#xff01; 他们与大家分享的主题是: “通过多模态指令集微调提升VLM的零样本学习”&#xff…

做一个物联网的后台程序与数据库设计

数据库部分 先设计一个简单的数据库。表结构如下: sql语句如下: SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;-- ---------------------------- -- Table structure for realtimedata -- ---------------------------- DROP TABLE IF EXISTS `realtimedata`

Godot快速精通-从看懂英文文档开始-翻译插件

视频教程地址&#xff1a;https://www.bilibili.com/video/BV1t8411q7hw/ 大家好&#xff0c;我今天要和大家分享的是如何快速精通Godot&#xff0c;众所周知&#xff0c;一般一个开源项目都会有一个文档&#xff0c;对于有一定基础或者是理解能力强的同学&#xff0c;看文档比…

跨境电商独立站,无货源,轻松卖全球~

在互联网全球化的现在&#xff0c;跨境电商已经成为越来越多企业和个人的选择。但运营过程中总会遇到各种各样的问题&#xff0c;比如库存压力大、语言沟通困难、物流费用高且慢等等。特别是在当下印尼电商禁止令出台&#xff0c;很多在各大电商平台的卖家更是苦不堪言。 因为市…

机器学习基础之《回归与聚类算法(1)—线性回归》

一、线性回归的原理 1、线性回归应用场景 如何判定一个问题是回归问题的&#xff0c;目标值是连续型的数据的时候 房价预测 销售额度预测 贷款额度预测、利用线性回归以及系数分析因子 2、线性回归定义 线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(…

翻译docker官方文档(残缺版)

Build with docker(使用 Docker 技术构建应用程序或系统镜像) Overview (概述) 介绍&#xff08;instruction&#xff09; 层次结构&#xff08;Layers&#xff09; The order of Dockerfile instructions matters. A Docker build consists of a series of ordered build ins…

数据挖掘实战(3):如何对比特币走势进行预测?

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

深度学习基础知识 最近邻插值法、双线性插值法、双三次插值算法

深度学习基础知识 最近邻插值法、双线性插值法、双三次插值算法 1、最近邻插值法 1、最近邻插值法 *最邻近插值&#xff1a;将每个目标像素找到距离它最近的原图像素点&#xff0c;然后将该像素的值直接赋值给目标像素 优点&#xff1a;实现简单&#xff0c;计算速度快缺点&…

【C++】【自用】STL六大组件:算法

文章目录 &#x1f53a;sortstable_sort&#x1f53a;reverse&#x1f53a;swap&#x1f53a;find&#x1f53a;max/min&#x1f53a;next_permutation/prev_permutation 全排列binary_searchlower_bound/upper_bound 求下界和上界set_union/set_intersection/set_difference 求…

JNI中调用Java函数

文章目录 一、JNI 注册二、JNI 调用 Java 函数1、实例2、总结3、参考 三、JNI 数据传递四、JNA五、图像传递 一、JNI 注册 JNI 分成静态注册和动态注册 静态注册 cpp 实现 JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv *env, jobject…

【深蓝学院】手写VIO第7章--VINS初始化和VIO系统--笔记

0. 内容 1. VIO回顾 整个视觉前端pipeline回顾&#xff1a; 两帧图像&#xff0c;可提取特征点&#xff0c;特征匹配&#xff08;描述子暴力匹配或者光流&#xff09;已知特征点匹配关系&#xff0c;利用几何约束计算relative pose([R|t])&#xff0c;translation只有方向&…

Linux Centos7 下使用yum安装的nginx平滑升级

1. 查看当前nginx版本 1nginx -v2. 查看centos版本 1cat /etc/redhat-release3. 创建一个新的文件nginx.repo&#xff0c;其中第三行的7是因为我的centos版本是7点多的&#xff0c;你看自己是多少就改多少 1vim /etc/yum.repos.d/nginx.repo23[nginx]4namenginx repo 5baseu…

2023年中国超导磁体市场规模、需求量及行业竞争现状分析[图]

超导磁体一般是指用超导导线绕制的能产生强磁场的超导线圈&#xff0c;还包括其运行所必要的低温恒温容器。通常电磁铁是利用在导体中通过电流产生磁场&#xff0c;由于超导材料在超导状态下具有零电阻特性&#xff0c;因此可以以极小的面积通过巨大的电流。超导磁体具有场强高…

如何自制一本电子书,安利一个平台

有没有想过把纸质版的书刊制作成图文相结合的电子书&#xff0c;实现随时随地的阅读。其实很多人在实际制作时常常陷入困扰&#xff1a;创意不够&#xff0c;无法找到理想的素材&#xff0c;制作繁琐等等。感觉好难啊&#xff01; 不过&#xff0c;幸运的是&#xff0c;我发现…

补环境框架

GitHub - bnmgh1/node-sandbox: 魔改Node补环境框架 GitHub - fanchangrui/catvm: js逆向环境框架基础&#xff08;持续补充&#xff09;&#xff08;沙盒框架&#xff09;

201、RabbitMQ 之 Exchange 典型应用模型 之 工作队列(Work Queue)

目录 ★ 工作队列介绍代码演示测试注意点1&#xff1a;注意点2&#xff1a; ★ 工作队列介绍 工作队列&#xff1a; 就是让多个消费者竞争消费同一个消息队列的消息&#xff0c;相当于多个消费者共享消息队列。 ▲ RabbitMQ可以让多个消费者竞争消费同一个消息队列 ▲ 消息队…