Diffusers 文档

Token merging

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

Token merging

Token merging (ToMe) 在基于 Transformer 的网络的前向传递中逐步合并冗余 tokens/patches,这可以加速 StableDiffusionPipeline 的推理延迟。

pip 安装 ToMe

pip install tomesd

您可以将 ToMe 与 tomesd 库和 apply_patch 函数一起使用

  from diffusers import StableDiffusionPipeline
  import torch
  import tomesd

  pipeline = StableDiffusionPipeline.from_pretrained(
        "stable-diffusion-v1-5/stable-diffusion-v1-5", torch_dtype=torch.float16, use_safetensors=True,
  ).to("cuda")
+ tomesd.apply_patch(pipeline, ratio=0.5)

  image = pipeline("a photo of an astronaut riding a horse on mars").images[0]

apply_patch 函数公开了许多参数,以帮助在 pipeline 推理速度和生成的 tokens 的质量之间取得平衡。最重要的参数是 ratio,它控制在前向传递期间合并的 tokens 数量。

正如 论文 中报告的那样,ToMe 可以在大大保持生成图像质量的同时提高推理速度。通过增加 ratio,您可以进一步加速推理,但会以牺牲一些图像质量为代价。

为了测试生成图像的质量,我们从 Parti Prompts 中采样了一些 prompts,并使用以下设置对 StableDiffusionPipeline 进行了推理

我们没有注意到生成样本的质量有任何显著下降,您可以在此 WandB 报告中查看生成的样本。如果您有兴趣重现此实验,请使用此脚本

基准测试

我们还对 StableDiffusionPipeline 进行了基准测试,评估了在启用 xFormers 的情况下,tomesd 对不同图像分辨率的影响。结果来自以下开发环境中的 A100 和 V100 GPU

- `diffusers` version: 0.15.1
- Python version: 3.8.16
- PyTorch version (GPU?): 1.13.1+cu116 (True)
- Huggingface_hub version: 0.13.2
- Transformers version: 4.27.2
- Accelerate version: 0.18.0
- xFormers version: 0.0.16
- tomesd version: 0.1.2

要重现此基准测试,请随意使用此脚本。结果以秒为单位报告,并且在适用的情况下,我们报告了使用 ToMe 和 ToMe + xFormers 时相对于 vanilla pipeline 的加速百分比。

GPU 分辨率 批次大小 Vanilla ToMe ToMe + xFormers
A100 512 10 6.88 5.26 (+23.55%) 4.69 (+31.83%)
768 10 OOM 14.71 11
8 OOM 11.56 8.84
4 OOM 5.98 4.66
2 4.99 3.24 (+35.07%) 2.1 (+37.88%)
1 3.29 2.24 (+31.91%) 2.03 (+38.3%)
1024 10 OOM OOM OOM
8 OOM OOM OOM
4 OOM 12.51 9.09
2 OOM 6.52 4.96
1 6.4 3.61 (+43.59%) 2.81 (+56.09%)
V100 512 10 OOM 10.03 9.29
8 OOM 8.05 7.47
4 5.7 4.3 (+24.56%) 3.98 (+30.18%)
2 3.14 2.43 (+22.61%) 2.27 (+27.71%)
1 1.88 1.57 (+16.49%) 1.57 (+16.49%)
768 10 OOM OOM 23.67
8 OOM OOM 18.81
4 OOM 11.81 9.7
2 OOM 6.27 5.2
1 5.43 3.38 (+37.75%) 2.82 (+48.07%)
1024 10 OOM OOM OOM
8 OOM OOM OOM
4 OOM OOM 19.35
2 OOM 13 10.78
1 OOM 6.66 5.54

如上表所示,对于较大的图像分辨率,tomesd 的加速效果更加明显。有趣的是,请注意,使用 tomesd,可以在更高的分辨率(如 1024x1024)下运行 pipeline。您或许可以使用 torch.compile 进一步加速推理。

< > 在 GitHub 上更新