使用 ONNX Runtime 與 Olive 加速 SD Turbo 與 SDXL Turbo 推論
TL;DR
Hugging Face 與 Microsoft 已使用 ONNX Runtime 與 Olive 優化工具對 SD Turbo 與 SDXL Turbo 推論進行優化,使 SDXL Turbo 的吞吐量提升最高可達 229%,SD Turbo 提升 120%,相較於 PyTorch。這些優化使得僅需一步即可進行高效能影像生成,並將模型的可用性擴展至 C#、Java 等非 Python 語言。
效能基準:ONNX Runtime 與 PyTorch 比較
ONNX Runtime 在所有測試的批次大小與步數上,於 NVIDIA GPU 上的 SD Turbo 與 SDXL Turbo 模型均顯著優於 PyTorch。
主要吞吐量提升
- SDXL Turbo: 吞吐量提升最高達 229%,相較於 PyTorch。
- SD Turbo: 吞吐量提升最高達 120%,相較於 PyTorch。
- 執行提供者: CUDA 與 TensorRT 兩種執行提供者在靜態與動態形狀下皆相較於 PyTorch 有顯著提升。
硬體與設定結果
基準測試使用 A100-SXM4-80GB 與 RTX-4090 GPU,搭配 LCM Scheduler 與 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 提供 .NET 程式庫以進行 Stable Diffusion 推論。
- Java: Oracle 已發布一個 Stable Diffusion 範例 (
sd4j),在 ONNX Runtime 上執行推論。
Web UI 整合
針對 Automatic1111 的 SD WebUI 的 ONNX Runtime 擴充套件,允許使用 CUDA 執行提供者與 Olive 優化模型,在 NVIDIA GPU 上優化執行 Stable Diffusion UNet 模型。
未來路線圖
Hugging Face 與 Microsoft 計畫將這些優化擴展至更多功能與模型,包括:
- 功能支援: 整合 IP Adapter 與 ControlNet。
- 模型支援: 擴展至 Stable Video Diffusion。
- UI 改進: 進一步優化現有 Stable Diffusion Web UI 擴充套件中的 SD Turbo 與 SDXL Turbo 效能,並支援社群開發的 Windows UI。