使用 ONNX Runtime 和 Olive 加速 SD Turbo 与 SDXL Turbo 推理
TL;DR
Hugging Face 和 Microsoft 使用 ONNX Runtime 和 Olive 优化工具对 SD Turbo 和 SDXL Turbo 推理进行了优化,使得相较于 PyTorch,SDXL Turbo 的吞吐量提升最高可达 229%,SD Turbo 可提升 120%。这些优化实现了一步即可进行高性能图像生成,并将模型的可访问性扩展到 C#、Java 等非 Python 语言。
性能基准:ONNX Runtime vs. PyTorch
ONNX Runtime 在所有测试的批量大小和步数下,针对 NVIDIA GPU 上的 SD Turbo 与 SDXL Turbo 模型,显著优于 PyTorch。
关键吞吐量提升
- SDXL Turbo: 吞吐量提升最高可达相较于 PyTorch 的 229%。
- SD Turbo: 吞吐量提升最高可达相较于 PyTorch 的 120%。
- 执行提供程序: CUDA 和 TensorRT 两种执行提供程序在静态和动态形状下均相较于 PyTorch 有显著提升。
硬件与配置结果
基准测试使用 A100-SXM4-80GB 和 RTX-4090 GPU,配合 LCM 调度器和 fp16 模型进行。
- 静态 vs. 动态形状: 当批量和图像尺寸在图计算图定义时已知,静态形状通常提供更快的性能。动态形状更灵活,允许用户在执行期间更改批量和图像尺寸,而无需重新构建引擎。
- GPU 细节: 在 A100 GPU 上,使用 CUDA 执行提供程序的 ONNX Runtime 通常是动态形状的更佳选择。 在 RTX-4090 GPU 上,TensorRT 执行提供程序在动态形状下通常表现略好。
技术优化与工具
性能提升来源于 Olive 模型优化工具以及 ONNX Runtime 中的特定 GPU 级别增强。
Olive 优化工具
模型使用 Olive 生成,Olive 是一个硬件感知的模型优化工具。要获得最佳性能,必须通过命令行启用 fp16 VAE。
GPU 特定增强
除标准 Stable Diffusion 优化外,还实现了以下具体技术改进:
- CUDA Graph: 对静态形状输入启用,以降低开销。
- Flash Attention V2: 已集成以加速注意力机制。
- 文本编码器优化: 移除文本编码器中的额外输出,仅保留
clip_skip参数指定的隐藏状态输出。 - SkipGroupNorm 融合: 将组归一化与前置的 Add 节点融合。
- LoRA 支持: 为潜在一致性模型(LCM)的 LoRA 权重添加了支持。
跨平台可访问性与集成
通过使用 ONNX Runtime,SD Turbo 与 SDXL Turbo 不再局限于 Python 环境,可集成到更广泛的软件栈中。
语言支持
- C#: 像 OnnxStack 这样的社区项目提供用于 Stable Diffusion 推理的 .NET 库。
- Java: Oracle 已发布一个 Stable Diffusion 示例(
sd4j),在 ONNX Runtime 上运行推理。
Web UI 集成
针对 Automatic1111 的 SD WebUI 的 ONNX Runtime 扩展,使得在 NVIDIA GPU 上使用 CUDA 执行提供程序和 Olive 优化模型,能够对 Stable Diffusion UNet 模型进行优化执行。
未来路线图
Hugging Face 和 Microsoft 计划将这些优化扩展到更多特性和模型,包括:
- 特性支持: 集成 IP Adapter 和 ControlNet。
- 模型支持: 扩展至 Stable Video Diffusion。
- UI 改进: 在现有 Stable Diffusion Web UI 扩展中进一步优化 SD Turbo 与 SDXL Turbo 的性能,并支持社区开发的 Windows UI。