☰
使用 BentoML 单步部署 SDXL Turbo:文本到图像推理服务的完整实战
2026/9/25 2:14:02 网站建设 项目流程
  • 模型推理服务
  • 人工智能
  • 后端
  • 大模型
  • 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!

项目地址:https://gitcode.com/gh_mirrors/be/BentoML
点击查看免费下载

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 的整个服务化过程可以拆成三个层次:

  1. 模型引用层:用HuggingFaceModel声明模型 ID,让 BentoML 在打包(Bento)时自动解析并固定模型版本;
  2. 服务定义层:用@bentoml.service声明服务类,并配置超时、GPU 资源、运行时镜像等;
  3. 推理端点层:用@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!

项目地址:https://gitcode.com/gh_mirrors/be/BentoML
点击查看免费下载
上一篇:Subtitle Edit 镜头切换检测(Shot Changes)完全指南:FFmpeg 场景检测、导入格式与波形可视化
下一篇:Deepagents发现价值:发现价值的AI代理

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询