使用 Diffusers 和 PEFT 的 Flux 快速 LoRA 推理

Hugging Face 为 Flux.1-Dev 文本到图像模型开发了一套优化方案,使 LoRA 推理速度提升约 2.3 倍。该方法解决了在切换不同 LoRA 适配器时常见的重新编译停滞问题,从而在不牺牲延迟的前提下实现高性能定制。

克服 LoRA 推理瓶颈

优化 LoRA 推理具有挑战性,因为热切换不同的适配器(其秩可能不同且针对不同层)通常会改变模型结构。在标准工作流中,对带有特定 LoRA 的模型使用 torch.compile 可以提升速度,但将该 LoRA 替换为另一个时会触发图的重新编译,导致推理显著变慢。

为了解决此问题,Hugging Face 使用了 “hotswapping” 机制。通过在 Diffusers 中将 hotswap=True,模型结构保持不变,仅交换 LoRA 适配器的权重。只要满足以下条件,即可避免重新编译:

  • 最大秩定义: 必须提前指定 max_rank,以容纳池中最大的适配器。
  • 层一致性: 随后的 LoRA 必须针对与首次加载的 LoRA 相同的层,或其子集。
  • 文本编码器限制: 当前热切换不支持针对文本编码器。

高端 GPU 的优化方案

对于 NVIDIA H100 等高性能硬件,优化后的推理流水线结合了四个关键组件:

  1. Flash Attention 3 (FA3): 提升注意力机制的效率。
  2. torch.compile: 一种即时编译器,可优化执行图。
  3. FP8 Quantization: 通过 TorchAO 提供的 FP8 量化,在速度与内存之间取得良好平衡,尽管是有损的。
  4. Hotswapping: 实现适配器切换而不触发重新编译。

性能基准 (H100)

选项 时间 (秒) 加速比(相对于基线) 备注
基线 7.8910 基线
优化后 3.5464 2.23× 热切换 + 编译 + FP8
无 FP8 4.3520 1.81× 优化后未使用 FP8 量化
无 FA3 4.3020 1.84× 优化后未使用 Flash Attention 3
基线 + 编译 5.0920 1.55× 启用编译但仍受重新编译停滞影响

为消费级 GPU(RTX 4090)进行优化

在 Bfloat16 模式下运行 Flux.1-Dev 需要约 33GB VRAM,超出 RTX 4090 等消费级 GPU 的 24GB 容量。为使模型在该硬件上可用,Hugging Face 采用了特定的内存削减策略:

  • T5 文本编码器量化: 使用 bitsandbytes 的 NF4 量化来降低文本编码器的内存占用。
  • FP8 量化: 应用于 Flux Transformer。
  • 区域编译: 使用 compile_repeated_blocks 来降低编译时间和内存使用。

在 RTX 4090 上,结合 FP8 量化、torch.compile 和 T5 量化(NF4)实现了 2.04 倍 的加速,将推理时间从基线的 23.6060 秒降低至 11.5715 秒。

热切换的技术实现

为防止在适配器切换时触发重新编译,实施方案解决了两个技术难题:

  1. 张量转换: 将 LoRA 缩放因子从 float 转换为 torch 张量。
  2. 权重填充: 将 LoRA 权重填充至所需的最大形状(由 max_rank 定义)。这使系统能够在不重新分配整个属性的情况下替换权重数据。填充使用零填充,以确保数学结果保持不变,尽管过多的填充可能会略微影响计算速度。

对于实现此工作流的用户,加载 LoRA 的顺序至关重要;如果适配器针对的层不相交,应首先创建一个针对所有必需层并集的虚拟 LoRA。

Sources