
优化HuggingFace Diffusers推理性能的轻量级框架
stable-fast是一个优化HuggingFace Diffusers推理性能的轻量级框架,支持NVIDIA GPU。相比TensorRT和AITemplate需要几十分钟的编译时间,stable-fast仅需几秒钟即可完成模型编译。主要特色包括动态形状、低精度计算和多种算子融合。它还兼容ControlNet和LoRA,并支持最新的StableVideoDiffusionPipeline,是加速PyTorch推理的有效工具。
注意
对 stable-fast 的积极开发已暂停。我目前正在基于新的 torch._dynamo 项目,目标是如 stable-cascade、SD3 和 Sora 等新的模型。
它将会更快、更灵活,并且支持更多的硬件后端,而不是 CUDA。
欢迎联系。
stable-fast 在__所有__类型的扩散器模型上实现了 SOTA 推理性能,即使是最新的 StableVideoDiffusionPipeline。
而且与需要几十分钟编译模型的 TensorRT 或 AITemplate 不同,stable-fast 只需几秒钟即可编译模型。
stable-fast 还支持开箱即用的 动态形状、LoRA 和 ControlNet。
| 模型 | torch | torch.compile | AIT | oneflow | TensorRT | stable-fast |
|---|---|---|---|---|---|---|
| SD 1.5 (ms) | 1897 | 1510 | 1158 | 1003 | 991 | 995 |
| SVD-XT (s) | 83 | 70 | 47 |
注意: 在基准测试期间,TensorRT 使用 static batch size 和 CUDA Graph enabled 测试,而 stable-fast 运行时使用动态形状。
stable-fast 是一个超轻量的推理优化框架,针对 HuggingFace Diffusers 在 NVIDIA GPUs 上进行优化。
stable-fast 通过利用一些关键技术和功能提供超快速的推理优化:
stable-fast 实现了一系列全功能和完全兼容的 CUDNN 卷积融合算子,可用于所有类型的 Conv + Bias + Add + Act 计算模式组合。stable-fast 实现了一系列融合 GEMM 操作符,用 fp16 精度计算,比 PyTorch 的默认设置要快(读取和写入使用 fp16,计算使用 fp32)。stable-fast 可以将 GEGLU(x, W, V, b, c) = GELU(xW + b) ⊗ (xV + c) 融合成一个 CUDA 内核。stable-fast 使用 OpenAI 的 Triton 实现了高度优化的融合 NHWC GroupNorm + Silu 操作符,消除了内存格式变换操作的需求。stable-fast 改进了 torch.jit.trace 接口,使其更适用于跟踪复杂模型。几乎所有 StableDiffusionPipeline/StableVideoDiffusionPipeline 的部分都可以被跟踪并转换为 TorchScript。它比 torch.compile 更稳定,并且比 torch.compile 拥有显著更低的 CPU 开销,并支持 ControlNet 和 LoRA。stable-fast 可以将 UNet、VAE 和 TextEncoder 捕获为 CUDA 图格式,从而减少 batch size 较小时的 CPU 开销。该实现还支持动态形状。stable-fast 使用 xformers 并使其与 TorchScript 兼容。我的下一个目标是保持 stable-fast 作为 diffusers 的最快推理优化框架之一,同时
为 transformers 提供速度提升和 VRAM 减少。
实际上,我已经使用 stable-fast 优化了大语言模型 (LLMs) 并实现了显著的速度提升。
但我仍需要一些工作来使其更加稳定和易用,并提供一个稳定的用户接口。
stable-fast 专门针对 HuggingFace Diffusers 进行了优化。它在许多库中实现了高性能表现。并且它提供非常快的编译速度,只需几秒钟。它在编译时间上显著比 torch.compile、TensorRT 和 AITemplate 更快。stable-fast 作为 PyTorch 的插件框架工作。它利用现有的 PyTorch 功能和基础设施,兼容其他加速技术,以及流行的微调技术和部署解决方案。stable-fast 与各种类型的 HuggingFace Diffusers 和 PyTorch 版本兼容。它还兼容 ControlNet 和 LoRA。甚至开箱即用地支持最新的 StableVideoDiffusionPipeline!注意: stable-fast 目前仅在 Linux 和 Windows WSL2 上测试。
首先需要安装具有 CUDA 支持的 PyTorch(建议版本从 1.12 到 2.1)。
我只在 torch>=2.1.0、xformers>=0.0.22 和 triton>=2.1.0 上测试了 stable-fast,运行在 CUDA 12.1 和 Python 3.10 上。
其他版本可能也可以构建和运行成功,但不保证。
从 Releases Page 下载与系统对应的轮子文件,并使用 pip3 install <wheel file> 安装。
目前有 Linux 和 Windows 版的轮子文件。
# 将 cu121 替换为你的 CUDA 版本,并将 <wheel file> 替换为轮子文件的路径。 # 确保轮子文件与你的 PyTorch 版本兼容。 pip3 install --index-url https://download.pytorch.org/whl/cu121 \ 'torch>=2.1.0' 'xformers>=0.0.22' 'triton>=2.1.0' 'diffusers>=0.19.3' \ '<wheel file>'
# 确保已安装 CUDNN/CUBLAS。 # https://developer.nvidia.com/cudnn # https://developer.nvidia.com/cublas # 首先安装具有 CUDA 的 PyTorch 及其他包。 # Windows 用户:可能无法使用 Triton,你可以跳过它。 # 注意:'wheel' 是必须项,否则在构建时会遇到 `No module named 'torch'` 错误。 pip3 install wheel 'torch>=2.1.0' 'xformers>=0.0.22' 'triton>=2.1.0' 'diffusers>=0.19.3' # (可选)让构建更快。 pip3 install ninja # 如果在不同的 GPU 类型上运行和构建,请设置 TORCH_CUDA_ARCH_LIST。 # 你也可以从 PyPI 安装最新的稳定版本。 # pip3 install -v -U stable-fast pip3 install -v -U git+https://github.com/chengzeyi/stable-fast.git@main#egg=stable-fast # (这可能需要几十分钟)
注意: 在 sfast.compilers 之外的任何使用不保证向后兼容。
注意: 为了获得最佳性能,xformers 和 OpenAI 的 triton>=2.1.0 需要安装和启用。
你可能需要从源码构建 xformers 以使其与 PyTorch 兼容。
stable-fast 可以直接优化 StableDiffusionPipeline 和 StableDiffusionPipelineXL。
import time import torch from diffusers import (StableDiffusionPipeline, EulerAncestralDiscreteScheduler) from sfast.compilers.diffusion_pipeline_compiler import (compile, CompilationConfig) def load_model(): model = StableDiffusionPipeline.from_pretrained( 'runwayml/stable-diffusion-v1-5', torch_dtype=torch.float16) model.scheduler = EulerAncestralDiscreteScheduler.from_config( model.scheduler.config) model.safety_checker = None model.to(torch.device('cuda')) return model model = load_model() config = CompilationConfig.Default() # xformers 和 Triton 建议启用以获得最佳性能。 try: import xformers config.enable_xformers = True except ImportError: print('xformers 未安装,跳过') try: import triton config.enable_triton = True except ImportError: print('Triton 未安装,跳过') # CUDA 图建议用于小 batch size 和小分辨率以减少 CPU 开销。 # 但它可能会增加 GPU 内存使用量。 # 对于 StableVideoDiffusionPipeline,这不是必须的。 config.enable_cuda_graph = True model = compile(model, config) kwarg_inputs = dict( prompt= '(杰作:1.2), 最优质量, 杰作, 最佳详细面部, 一个漂亮的女孩', height=512, width=512, num_inference_steps=30, num_images_per_prompt=1, ) # 注意: 预热它。 # 最初的调用将触发编译,可能非常慢。 # 之后,它应该非常快。 for _ in range(3): output_image = model(**kwarg_inputs).images[0] # 看看它! # 注意: 由于 CUDA 的异步特性,进度条可能不正确工作。 begin = time.time() output_image = model(**kwarg_inputs).images[0] print(f'推理时间: {time.time() - begin:.3f}s') # 在终端中查看它! from sfast.utils.term_image import print_image print_image(output_image, max_width=80)
更多详情参见 examples/optimize_stable_diffusion_pipeline.py。
你可以查看这个 Colab,了解它在 T4 GPU 上的工作方式:
stable-fast 可以优化最新的 latent consistency model pipeline 并实现显著的速度提升。
更多详情参见 examples/optimize_lcm_pipeline.py,了解如何使用 LCM LoRA 优化普通的 SD 模型。 更多详情参见 examples/optimize_lcm_pipeline.py,了解如何优化独立的 LCM 模型。
stable-fast 可以优化最新的 StableVideoDiffusionPipeline 并实现 2x 速度提升
更多详情参见 examples/optimize_stable_video_diffusion_pipeline.py
动态切换 LoRA 是支持的,但需要一些额外的工作。
这是可能的,因为编译的图和 CUDA 图 与原始的 UNet 模型共享相同的底层数据(指针)。所以你需要做的
就是在原始 UNet 模型的参数上进行就地更新。