Diffusers 文档

Token 合并

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

Token 合并

Token 合并 (ToMe) 在基于 Transformer 的网络的正向传播中逐步合并冗余的 token/补丁,这可以加速 StableDiffusionPipeline 的推理延迟。

pip 安装 ToMe

pip install tomesd

你可以使用 tomesd 库的 ToMe,通过 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 函数公开了一些 参数,以帮助在管道推理速度和生成 token 的质量之间取得平衡。最重要的参数是 ratio,它控制在正向传播过程中合并的 token 数量。

论文 所述,ToMe 可以极大地保留生成图像的质量,同时提高推理速度。通过增加 ratio,你可以进一步加速推理,但这会牺牲一些图像质量。

为了测试生成图像的质量,我们从 Parti 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 时相对于原始管道的加速百分比。

GPU 分辨率 批次大小 原版 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 等更高分辨率下运行管道。你还可以通过 torch.compile 进一步加速推理。

< > 在 GitHub 上更新