- 模型推理服务
- 人工智能
- 后端
- 大模型
- MLOps
- LLMOps
【免费下载链接】BentoML
The easiest way to serve AI apps and models - Build Model Inference APIs, Job queues, LLM apps, Multi-model pipelines, and more!
SDXL Turbo(Stable Diffusion XL Turbo)是从 SDXL 1.0 蒸馏而来的加速版扩散模型,能够在单步采样下生成高质量图像,具备接近实时的文本到图像(text-to-image)输出能力。本文基于 BentoML 官方示例文档 sdxl-turbo.rst,完整讲解如何用 BentoML 封装 SDXL Turbo 的推理服务、配置 GPU 与运行时环境、定义txt2imgAPI,并分别在本地与 BentoCloud 上运行、调用和弹性扩容。读完本文,你将掌握一套可直接复制的「单步扩散模型服务化」方案,并理解@bentoml.service、HuggingFaceModel、bentoml.images.Image、@bentoml.api等核心 API 的底层实现原理。
SDXL Turbo 与本示例的总体思路
SDXL Turbo 是 SDXL 1.0 的蒸馏版本,核心特点是只需一次推理步骤(single step)即可生成图像,同时保持了较高的实时文本到图像输出质量与采样保真度。这意味着它的推理 API 天然适合实时交互场景——示例中只需要num_inference_steps=1即可得到满意结果。
在 BentoML 中,SDXL Turbo 的整个服务化过程可以拆成三个层次:
- 模型引用层:用
HuggingFaceModel声明模型 ID,让 BentoML 在打包(Bento)时自动解析并固定模型版本; - 服务定义层:用
@bentoml.service声明服务类,并配置超时、GPU 资源、运行时镜像等; - 推理端点层:用
@bentoml.api将类方法暴露为 HTTP 端点。
示例文档给出的推理请求非常简洁,最终产出的 API 接受自定义的生成参数:
{ "guidance_scale": 0, "num_inference_steps": 1, "prompt": "A cinematic shot of a baby racoon wearing an intricate italian priest robe." }三个参数的含义分别是:
prompt:文本提示词,决定生成图像的内容;num_inference_steps:推理步数。SDXL Turbo 是单步蒸馏模型,设为1通常就足够;guidance_scale:指导尺度(CFG)。SDXL Turbo 在训练时未使用 classifier-free guidance,因此必须设为0来停用它,否则会影响生成质量。
该提示词的生成结果如下:
代码拆解:一步步看 service.py
示例项目的核心代码集中在service.py中,文档将其拆为四个关键实现点。下面结合仓库源码逐一展开。
1. 定义模型 ID:可随时切换扩散模型
首先定义一个模型 ID 常量。由于HuggingFaceModel接收任意 Hugging Face 仓库 ID,这里换成其他 diffusers 模型即可:
MODEL_ID = "stabilityai/sdxl-turbo"2. 用@bentoml.service声明服务与资源配置
@bentoml.service装饰器将普通类注册为 BentoML Service,并允许通过关键字参数传入服务级配置(traffic、resources等)。示例中为 SDXL Turbo 配置了超时与 GPU 资源:
@bentoml.service( traffic={"timeout": 300}, resources={ "gpu": 1, "gpu_type": "nvidia-l4", }, ) class SDXLTurbo: model_path = bentoml.models.HuggingFaceModel(MODEL_ID) ...这些配置项在仓库源码中有着明确的类型定义(src/_bentoml_sdk/service/config.py):
TrafficSchema包含timeout、max_concurrency(超过该值并发请求将被拒绝)、concurrency(单副本处理并发的能力)、external_queue(仅 BentoCloud,使用外部队列接管请求);ResourceSchema包含cpu、memory、gpu与gpu_type。其中gpu_type是一个受约束的字面量集合,源码中完整枚举了nvidia-l4、nvidia-tesla-t4、nvidia-tesla-a100、nvidia-h100-80gb、nvidia-a10g、amd-mi300x等实例类型;gpu_type本质上是一种“建议性标注”,部署到 BentoCloud 时会被用作实例类型选择的推荐依据。
注意:SDXL Turbo 需要至少一块 NVIDIA L4 GPU 才能在 BentoCloud 上获得最佳性能;本地运行则需要至少 12G 显存的 NVIDIA GPU。
3. 用HuggingFaceModel高效引用 Hugging Face 模型
在服务类内部,将模型定义为类变量:
model_path = bentoml.models.HuggingFaceModel(MODEL_ID)HuggingFaceModel的实现位于 src/_bentoml_sdk/models/huggingface.py,其核心机制值得展开说明:
- 构造函数接受
model_id、revision(默认"main")、endpoint(默认https://huggingface.co,可通过环境变量HF_ENDPOINT覆盖,用于私有/镜像仓库)、include/exclude(按文件名过滤下载内容); resolve()内部调用huggingface_hub.snapshot_download将模型快照下载到本地(缓存目录可通过BENTOML_HF_CACHE_DIR指定);commit_hash会实时向 Hugging Face API 查询仓库当前 commit SHA,并随模型元数据一并固化进 Bento,保证「打包时的模型版本」与「部署时的模型版本」完全一致;to_info()将模型引用序列化为BentoModelInfo(registry 标记为huggingface),使 BentoML 在构建镜像时能精确记录模型来源与版本。
这正是文档所说「加速 BentoCloud 上的模型部署、减少镜像构建时间与冷启动时间」的底层原因:模型不再打进镜像,而是以引用(reference)形式随 Bento 分发,运行时按需解析。
关于从 Hugging Face 加载模型的完整方式,可参考 model-loading-and-management.rst 中的_load-models章节:默认情况下HuggingFaceModel返回的是已下载模型的本地路径字符串,可以直接传给diffusers、transformers等库使用。
4. 定义运行时环境:bentoml.images.Image
@bentoml.service装饰器还允许通过image参数定义 Bento 的运行时环境。Bento 是 BentoML 的统一分发格式,打包了全部源码、Python 依赖、模型引用与环境配置,确保在不同环境中一致部署。示例:
my_image = bentoml.images.Image(python_version="3.11") \ .requirements_file("requirements.txt") @bentoml.service( image=my_image, # Apply the specifications ... ) class SDXLTurbo: ...bentoml.images.Image类定义在 src/_bentoml_sdk/images.py,除python_version与requirements_file()外,还提供一组可链式调用的方法:
system_packages(*packages):通过发行版包管理器安装系统依赖;python_packages(*packages):直接以字符串形式追加 Python 依赖;pyproject_toml(path):解析pyproject.toml的project.dependencies并自动加入;run(command)/post_commands:注入构建期命令;base_image/distro:自定义基础镜像与发行版(默认debian)。
SDXL Turbo 场景下,requirements.txt至少应包含diffusers、torch、transformers等推理依赖(推荐 Python 3.11)。
5. 用@bentoml.api定义文本到图像端点
@bentoml.api装饰器将类方法暴露为推理端点。示例中的txt2img方法接收提示词、推理步数与指导尺度三个输入,并通过 diffusers 的AutoPipelineForText2Image流水线生成图像:
class SDXLTurbo: model_path = bentoml.models.HuggingFaceModel(MODEL_ID) def __init__(self) -> None: from diffusers import AutoPipelineForText2Image import torch # Load the model self.pipe = AutoPipelineForText2Image.from_pretrained( self.model_path, torch_dtype=torch.float16, variant="fp16", ) # Move the pipeline to GPU self.pipe.to(device="cuda") @bentoml.api def txt2img( self, prompt: str = sample_prompt, num_inference_steps: Annotated[int, Ge(1), Le(10)] = 1, guidance_scale: float = 0.0, ) -> Image: image = self.pipe( prompt=prompt, num_inference_steps=num_inference_steps, guidance_scale=guidance_scale, ).images[0] return image几个值得注意的实现细节:
- 模型加载放在
__init__中:服务实例启动时一次性把 fp16 权重的 pipeline 加载到 CUDA 设备,推理请求只复用self.pipe,避免每次请求重复加载; - 参数校验:
num_inference_steps使用Annotated[int, Ge(1), Le(10)]声明了 1~10 的取值约束,BentoML 会基于类型注解自动生成 OpenAPI 请求模型并做运行时校验(Ge/Le来自annotated_types,服务配置同样大量使用该模式,见 src/_bentoml_sdk/service/config.py); - 端点路由的自动推导:
@bentoml.api的实现位于 src/_bentoml_sdk/decorators.py,它把方法包装为APIMethod。由 src/_bentoml_sdk/method.py 可知,若不显式指定route,默认路由就是/<方法名>,因此txt2img自动映射为POST /txt2img;返回类型PIL.Image会被 BentoML 序列化为合适的响应格式。
本地运行与测试
BentoML 允许在本地直接运行和验证服务,适合用本地算力快速调试:
git clone https://github.com/bentoml/BentoDiffusion.git cd BentoDiffusion/sdxl-turbo # Recommend Python 3.11 pip install -r requirements.txt bentoml serve几点注意事项:
- 硬件要求:SDXL Turbo 推理至少需要一块12G 显存的 NVIDIA GPU;
- 默认端口:启动后访问或请求
http://localhost:3000; - 健康检查与调试:BentoML 服务默认暴露
/livez、/readyz探活端点,结合 configurations.rst 中的endpoints配置可自定义路径前缀。
部署到 BentoCloud:一条命令获得生产级服务
BentoCloud 为 BentoML 提供云端的快速扩缩容基础设施。示例项目专为 BentoCloud 快速部署设计:一条命令即可获得生产级应用,自带快速自动扩缩容、云端安全部署与全面的可观测性。
安装与登录
pip install bentoml bentoml cloud login登录的具体流程(含 API Token 管理)参见 manage-api-tokens.rst。
克隆并部署
git clone https://github.com/bentoml/BentoDiffusion.git cd BentoDiffusion/sdxl-turbo bentoml deploy部署完成后,服务即可在 BentoCloud 控制台以 Playground 形式交互测试,界面效果如下:
三种调用端点的方式
方式一:BentoCloud Playground
在控制台 Playground 标签页中直接填写 Prompt、Guidance Scale、Num Inference Steps 并发送请求,右侧即可预览生成的图像。
方式二:Python 客户端
创建 BentoML 客户端调用端点(将 URL 替换为你自己的 Deployment URL,获取方式见 call-deployment-endpoints.rst):
import bentoml from pathlib import Path # Define the path to save the generated image output_path = Path("generated_image.png") with bentoml.SyncHTTPClient("https://sdxl-turbo-nmsx-e3c1c7db.mt-guc1.bentoml.ai") as client: result = client.txt2img( guidance_scale=0, num_inference_steps=1, prompt="A cinematic shot of a baby racoon wearing an intricate italian priest robe.", ) # The result should be a PIL.Image object result.save(output_path) print(f"Image saved at {output_path}")方式三:CURL
curl -s -X POST \ 'https://sdxl-turbo-nmsx-e3c1c7db.mt-guc1.bentoml.ai/txt2img' \ -H 'Content-Type: application/json' \ -d '{ "guidance_scale": 0, "num_inference_steps": 1, "prompt": "A cinematic shot of a baby racoon wearing an intricate italian priest robe." }' \ -o output.jpg参数使用要点:SDXL Turbo 只需单步推理,
num_inference_steps设为1通常即可生成高质量图像;同时必须将guidance_scale设为0以停用 CFG,因为该模型在训练时未使用 guidance。
配置副本自动扩缩容
为了让 Deployment 在指定副本范围内自动伸缩,可在部署时添加扩缩容参数:
bentoml deploy --scaling-min 0 --scaling-max 3 # Set your desired count如果服务已部署,则用deployment update更新允许的副本数:
bentoml deployment update <deployment-name> --scaling-min 0 --scaling-max 3 # Set your desired count并发与自动扩缩容的完整配置方式见 autoscaling.rst。将--scaling-min设为0意味着空闲时副本可以缩到零,按需拉起,进一步控制成本。
自定义基础设施部署:容器化分发
如果需要部署到自有基础设施,可使用 BentoML 将服务打包为OCI 兼容镜像,从而部署到任意容器运行时或 Kubernetes 集群。完整步骤见 packaging-for-deployment.rst。其底层与上文bentoml.images.Image定义的运行时环境(Python 版本、依赖清单、基础镜像)直接相关——镜像构建阶段会依据这些规格自动生成 Dockerfile 并固化模型引用。
小结:从示例到生产的关键要点
| 维度 | 关键配置 / API | 仓库中的实现依据 |
|---|---|---|
| 模型引用 | HuggingFaceModel(model_id) | src/_bentoml_sdk/models/huggingface.py |
| 服务与资源 | @bentoml.service(traffic=..., resources=...) | src/_bentoml_sdk/service/factory.py、src/_bentoml_sdk/service/config.py |
| 运行时镜像 | bentoml.images.Image(...).requirements_file(...) | src/_bentoml_sdk/images.py |
| 推理端点 | @bentoml.api+ 方法默认路由/方法名 | src/_bentoml_sdk/decorators.py、src/_bentoml_sdk/method.py |
| 本地调试 | bentoml serve+localhost:3000 | 示例文档 sdxl-turbo.rst |
| 云端部署 | bentoml deploy、bentoml deployment update --scaling-min/max | 示例文档 sdxl-turbo.rst |
整体来看,SDXL Turbo 示例展示了 BentoML 服务化现代扩散模型的完整范式:单步蒸馏模型 + 类变量模型引用 + 声明式服务配置 + 类型化 API 端点,本地与云端完全一致的运行方式让「先本地验证、再一键上云」成为标准工作流。对其他 diffusers 系模型(如 ControlNet、SDXL 系列),只需替换MODEL_ID与 pipeline 加载逻辑即可复用本方案。
- 模型推理服务
- 人工智能
- 后端
- 大模型
- MLOps
- LLMOps
【免费下载链接】BentoML
The easiest way to serve AI apps and models - Build Model Inference APIs, Job queues, LLM apps, Multi-model pipelines, and more!
相关推荐
Lailloken-UI:重塑你的流放之路游戏体验
Lailloken UI:重塑你的流放之路游戏体验 你是否曾在复杂的流放之路游戏中感到迷失方向?当你面对海量的地图数据、装备属性和任务信息时,是否渴望一个智能助
SDXL-Turbo:新一代实时文本到图像生成模型
SDXL Turbo:新一代实时文本到图像生成模型 安装与使用教程 前言 SDXL Turbo是一款由Stability AI公司开发的实时文本到图像生成模型,
PP-LCNet 图像分类实战指南:基于 PaddleHub 使用 pplcnet_x2_5_imagenet 完成推理与服务部署
PP LCNet 图像分类实战指南:基于 PaddleHub 使用 pplcnet_x2_5_imagenet 完成推理与服务部署 本篇技术指南以 Paddle
人工智能大模型微调模型推理服务
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考