[2024 年 7 月 29 日] ColossalAI 支持 DistriFusion!
【2024年4月4日】 DistriFusion入选CVPR 2024亮点海报!
[2024年2月29日] DistriFusion 被 CVPR 2024 接受!我们的代码是公开的!
我们引入了 DistriFusion,这是一种免训练算法,可利用多个 GPU 来加速扩散模型推理,而不会牺牲图像质量。 Naïve Patch(概述 (b))由于缺乏补丁交互而存在碎片问题。所提供的示例是使用 SDXL 使用 50 步欧拉采样器以 1280×1920 分辨率生成的,并在 A100 GPU 上测量延迟。
DistriFusion:高分辨率扩散模型的分布式并行推理
Muyang Li*、Tianle Cai*、Jiaxin Cao、Qinsheng Chang、Han Cai、Junjie Bai、Yangqing Jia、Ming-Yu Liu、Kai Li 和 Song Han
麻省理工学院、普林斯顿大学、Lepton AI 和 NVIDIA
在 CVPR 2024 中。
(a)在单个设备上运行的原始扩散模型。 (b)由于补丁之间缺乏交互,将图像天真地分成跨 2 个 GPU 的 2 个补丁,因此边界处有明显的接缝。 (c)我们的 DistriFusion 在第一步采用同步通信进行补丁交互。之后,我们通过异步通信重用上一步中的激活。通过这种方式,通信开销可以隐藏到计算管道中。
SDXL 的定性结果。 FID 是根据真实图像计算的。我们的 DistriFusion 可以根据使用的设备数量减少延迟,同时保持视觉保真度。
参考:
安装 PyTorch 后,您应该能够使用 PyPI 安装distrifuser
pip install distrifuser
或通过 GitHub:
pip install git+https://github.com/mit-han-lab/distrifuser.git
或本地开发
git clone [email protected]:mit-han-lab/distrifuser.git
cd distrifuser
pip install -e .
在scripts/sdxl_example.py
中,我们提供了使用 DistriFusion 运行 SDXL 的最小脚本。
import torch
from distrifuser . pipelines import DistriSDXLPipeline
from distrifuser . utils import DistriConfig
distri_config = DistriConfig ( height = 1024 , width = 1024 , warmup_steps = 4 )
pipeline = DistriSDXLPipeline . from_pretrained (
distri_config = distri_config ,
pretrained_model_name_or_path = "stabilityai/stable-diffusion-xl-base-1.0" ,
variant = "fp16" ,
use_safetensors = True ,
)
pipeline . set_progress_bar_config ( disable = distri_config . rank != 0 )
image = pipeline (
prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k" ,
generator = torch . Generator ( device = "cuda" ). manual_seed ( 233 ),
). images [ 0 ]
if distri_config . rank == 0 :
image . save ( "astronaut.png" )
具体来说,我们的distrifuser
与扩散器共享相同的 API,并且可以以类似的方式使用。您只需要定义一个DistriConfig
并使用我们包装的DistriSDXLPipeline
来加载预训练的 SDXL 模型。然后,我们可以生成像扩散器中的StableDiffusionXLPipeline
一样的图像。运行命令是
torchrun --nproc_per_node= $N_GPUS scripts/sdxl_example.py
其中$N_GPUS
是您要使用的 GPU 数量。
我们还在scripts/sd_example.py
中提供了一个用于使用 DistriFusion 运行 SD1.4/2 的最小脚本。用法是一样的。
我们的基准测试结果使用 PyTorch 2.2 和扩散器 0.24.0。首先,您可能需要安装一些额外的依赖项:
pip install git+https://github.com/zhijian-liu/torchprofile datasets torchmetrics dominate clean-fid
您可以使用scripts/generate_coco.py
生成带有COCO 标题的图像。命令是
torchrun --nproc_per_node=$N_GPUS scripts/generate_coco.py --no_split_batch
其中$N_GPUS
是您要使用的 GPU 数量。默认情况下,生成的结果将存储在results/coco
中。您还可以使用--output_root
对其进行自定义。您可能需要调整的一些其他参数:
--num_inference_steps
:推理步骤数。我们默认使用 50。--guidance_scale
:无分类器的指导尺度。我们默认使用 5。--scheduler
:扩散采样器。我们默认使用 DDIM 采样器。您还可以使用euler
作为 Euler 采样器,使用dpm-solver
作为 DPM 求解器。--warmup_steps
:额外预热步骤的数量(默认为 4)。--sync_mode
:不同的 GroupNorm 同步模式。默认情况下,它使用我们更正后的异步 GroupNorm。--parallelism
:您使用的并行范例。默认情况下,它是补丁并行。您可以使用tensor
来实现张量并行性,使用naive_patch
来实现朴素补丁。生成所有图像后,您可以使用我们的脚本scripts/compute_metrics.py
来计算PSNR、LPIPS和FID。用法是
python scripts/compute_metrics.py --input_root0 $IMAGE_ROOT0 --input_root1 $IMAGE_ROOT1
其中$IMAGE_ROOT0
和$IMAGE_ROOT1
是您尝试比较的图像文件夹的路径。如果IMAGE_ROOT0
是真实文件夹,请添加--is_gt
标志以调整大小。我们还提供了一个脚本scripts/dump_coco.py
来转储真实图像。
您可以使用scripts/run_sdxl.py
来对不同方法的延迟进行基准测试。命令是
torchrun --nproc_per_node= $N_GPUS scripts/run_sdxl.py --mode benchmark --output_type latent
其中$N_GPUS
是您要使用的 GPU 数量。与scripts/generate_coco.py
类似,您也可以更改一些参数:
--num_inference_steps
:推理步骤数。我们默认使用 50。--image_size
:生成的图像大小。默认情况下,它是1024×1024。--no_split_batch
:禁用批量分割以实现无分类器指导。--warmup_steps
:额外预热步骤的数量(默认为 4)。--sync_mode
:不同的 GroupNorm 同步模式。默认情况下,它使用我们更正后的异步 GroupNorm。--parallelism
:您使用的并行范例。默认情况下,它是补丁并行。您可以使用tensor
来实现张量并行性,使用naive_patch
来实现朴素补丁。--warmup_times
/ --test_times
:预热/测试运行的次数。默认情况下,它们分别为 5 和 20。 如果您使用此代码进行研究,请引用我们的论文。
@inproceedings { li2023distrifusion ,
title = { DistriFusion: Distributed Parallel Inference for High-Resolution Diffusion Models } ,
author = { Li, Muyang and Cai, Tianle and Cao, Jiaxin and Zhang, Qinsheng and Cai, Han and Bai, Junjie and Jia, Yangqing and Liu, Ming-Yu and Li, Kai and Han, Song } ,
booktitle = { Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR) } ,
year = { 2024 }
}
我们的代码是基于huggingface/diffusers和lmxyy/sige开发的。我们感谢 torchprofile 进行 MAC 测量,感谢 clean-fid 进行 FID 计算,感谢 Lightning-AI/torchmetrics 进行 PSNR 和 LPIPS。
我们感谢朱俊彦和朱立庚的有益讨论和宝贵反馈。该项目得到了 MIT-IBM Watson AI 实验室、亚马逊、麻省理工学院科学中心和国家科学基金会的支持。