Project Icon

DMD2

改进分布匹配蒸馏的快速图像合成技术

DMD2是一种改进的分布匹配蒸馏技术,用于快速图像合成。通过消除回归损失、集成GAN损失和支持多步采样,该技术显著提升了图像生成的质量和效率。在ImageNet-64x64和COCO 2014数据集上,DMD2的FID评分超越原始模型,同时将推理成本降低500倍。此外,DMD2还能生成百万像素级图像,在少步方法中展现出卓越的视觉效果。

改进的分布匹配蒸馏用于快速图像合成 [Huggingface 仓库][ComfyUI][Colab]

少步文本到图像生成。

image/jpeg

改进的分布匹配蒸馏用于快速图像合成,
Tianwei Yin, Michaël Gharbi, Taesung Park, Richard Zhang, Eli Shechtman, Frédo Durand, William T. Freeman
arXiv 技术报告 (arXiv 2405.14867)

联系方式

如果您对论文有任何问题,请随时与我们联系!

Tianwei Yin tianweiy@mit.edu

摘要

近期的方法在将扩散模型蒸馏成高效的单步生成器方面显示出了前景。其中,分布匹配蒸馏(DMD)生成的单步生成器在分布上与其教师模型匹配,而无需与教师模型的采样轨迹强制一一对应。然而,为了确保训练稳定,DMD需要一个额外的回归损失,该损失使用教师模型通过确定性采样器多步生成的大量噪声-图像对来计算。这对大规模文本到图像合成来说成本高昂,并限制了学生模型的质量,将其过于紧密地与教师模型的原始采样路径绑定。我们引入了DMD2,一套技术来消除这一限制并改进DMD训练。首先,我们消除了回归损失和昂贵数据集构建的需求。我们表明由此产生的不稳定性是由于假评论家无法准确估计生成样本的分布,并提出了两个时间尺度更新规则作为补救措施。其次,我们将GAN损失整合到蒸馏过程中,区分生成的样本和真实图像。这使我们能够在真实数据上训练学生模型,缓解了来自教师模型的不完美真实分数估计,并提高了质量。最后,我们修改了训练程序以实现多步采样。我们识别并解决了这种情况下的训练-推理输入不匹配问题,通过在训练时模拟推理时的生成器样本。综合起来,我们的改进在单步图像生成方面创造了新的基准,在ImageNet-64x64上的FID分数为1.28,在零样本COCO 2014上为8.35,尽管推理成本降低了500倍,但仍超过了原始教师模型。此外,我们通过蒸馏SDXL展示了我们的方法可以生成百万像素级图像,在少步方法中展现出卓越的视觉质量。

环境设置

# 在conda环境中
conda create -n dmd2 python=3.8 -y 
conda activate dmd2 

pip install --upgrade anyio
pip install -r requirements.txt
python setup.py  develop

推理示例

ImageNet

python -m demo.imagenet_example  --checkpoint_path IMAGENET_CKPT_PATH 

文本到图像

# 注意:在演示页面上,点击"使用Tiny VAE进行更快解码"以启用使用来自[madebyollin](https://huggingface.co/madebyollin/taesdxl)的Tiny VAE,实现更快的速度和更低的内存消耗

# 4步(质量远高于1步)
python -m demo.text_to_image_sdxl --checkpoint_path SDXL_CKPT_PATH --precision float16

# 1步 
python -m demo.text_to_image_sdxl --num_step 1 --checkpoint_path SDXL_CKPT_PATH --precision float16 --conditioning_timestep 399

我们也可以使用标准的diffuser管道:

4步UNet生成

import torch
from diffusers import DiffusionPipeline, UNet2DConditionModel, LCMScheduler
from huggingface_hub import hf_hub_download
from safetensors.torch import load_file
base_model_id = "stabilityai/stable-diffusion-xl-base-1.0"
repo_name = "tianweiy/DMD2"
ckpt_name = "dmd2_sdxl_4step_unet_fp16.bin"
# 加载模型
unet = UNet2DConditionModel.from_config(base_model_id, subfolder="unet").to("cuda", torch.float16)
unet.load_state_dict(torch.load(hf_hub_download(repo_name, ckpt_name), map_location="cuda"))
pipe = DiffusionPipeline.from_pretrained(base_model_id, unet=unet, torch_dtype=torch.float16, variant="fp16").to("cuda")
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)
prompt="一张猫的照片"

# LCMScheduler的默认时间步与我们用于训练的不同
image=pipe(prompt=prompt, num_inference_steps=4, guidance_scale=0, timesteps=[999, 749, 499, 249]).images[0]

4步LoRA生成

import torch
from diffusers import DiffusionPipeline, UNet2DConditionModel, LCMScheduler
from huggingface_hub import hf_hub_download
from safetensors.torch import load_file
base_model_id = "stabilityai/stable-diffusion-xl-base-1.0"
repo_name = "tianweiy/DMD2"
ckpt_name = "dmd2_sdxl_4step_lora_fp16.safetensors"
# 加载模型
pipe = DiffusionPipeline.from_pretrained(base_model_id, torch_dtype=torch.float16, variant="fp16").to("cuda")
pipe.load_lora_weights(hf_hub_download(repo_name, ckpt_name))
pipe.fuse_lora(lora_scale=1.0)  # 对于社区模型,我们可能想要将比例设置得更小

pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)
prompt="一张猫的照片"

# LCMScheduler的默认时间步与我们用于训练的不同
image=pipe(prompt=prompt, num_inference_steps=4, guidance_scale=0, timesteps=[999, 749, 499, 249]).images[0]

1步UNet生成

import torch
from diffusers import DiffusionPipeline, UNet2DConditionModel, LCMScheduler
from huggingface_hub import hf_hub_download
from safetensors.torch import load_file
base_model_id = "stabilityai/stable-diffusion-xl-base-1.0"
repo_name = "tianweiy/DMD2"
ckpt_name = "dmd2_sdxl_1step_unet_fp16.bin"
# 加载模型
unet = UNet2DConditionModel.from_config(base_model_id, subfolder="unet").to("cuda", torch.float16)
unet.load_state_dict(torch.load(hf_hub_download(repo_name, ckpt_name), map_location="cuda"))
pipe = DiffusionPipeline.from_pretrained(base_model_id, unet=unet, torch_dtype=torch.float16, variant="fp16").to("cuda")
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)
prompt="一张猫的照片"
image=pipe(prompt=prompt, num_inference_steps=1, guidance_scale=0, timesteps=[399]).images[0]

4步T2I适配器

from diffusers import StableDiffusionXLAdapterPipeline, T2IAdapter, AutoencoderKL, UNet2DConditionModel, LCMScheduler
from diffusers.utils import load_image, make_image_grid
from controlnet_aux.canny import CannyDetector
from huggingface_hub import hf_hub_download
import torch

# 加载适配器
adapter = T2IAdapter.from_pretrained("TencentARC/t2i-adapter-canny-sdxl-1.0", torch_dtype=torch.float16, varient="fp16").to("cuda")

vae=AutoencoderKL.from_pretrained("madebyollin/sdxl-vae-fp16-fix", torch_dtype=torch.float16)

base_model_id = "stabilityai/stable-diffusion-xl-base-1.0"
repo_name = "tianweiy/DMD2"
ckpt_name = "dmd2_sdxl_4step_unet_fp16.bin"
# 加载模型
unet = UNet2DConditionModel.from_config(base_model_id, subfolder="unet").to("cuda", torch.float16)
unet.load_state_dict(torch.load(hf_hub_download(repo_name, ckpt_name), map_location="cuda"))

pipe = StableDiffusionXLAdapterPipeline.from_pretrained(
    base_model_id, unet=unet, vae=vae, adapter=adapter, torch_dtype=torch.float16, variant="fp16", 
).to("cuda")
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)
pipe.enable_xformers_memory_efficient_attention()

canny_detector = CannyDetector()

url = "https://huggingface.co/Adapter/t2iadapter/resolve/main/figs_SDXLV1.0/org_canny.jpg"
image = load_image(url)

# 以低分辨率检测Canny边缘图以避免高频细节
image = canny_detector(image, detect_resolution=384, image_resolution=1024)#.resize((1024, 1024))

prompt = "真实的神秘仙子,魔法,4K图片,高质量"

gen_images = pipe(
  prompt=prompt,
  image=image,
  num_inference_steps=4,
  guidance_scale=0, 
  adapter_conditioning_scale=0.8, 
  adapter_conditioning_factor=0.5,
  timesteps=[999, 749, 499, 249]
).images[0]
gen_images.save('out_canny.png')

预训练模型可以在ImageNetSDXL中找到。

训练和评估

ImageNet-64x64

详细信息请参考ImageNet-64x64

SDXL

详细信息请参考SDXL

SDv1.5

详细信息请参考SDv1.5

许可证

改进的分布匹配蒸馏(Improved Distribution Matching Distillation)根据知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议发布。

已知问题

  • 目前SDXL训练的FSDP非常慢;非常感谢任何帮助!
  • 目前LORA训练实际上比完全微调更慢,并且占用相同的内存;非常感谢任何帮助!

引用

如果您发现DMD2对您的研究有用或相关,请引用我们的论文:

@article{yin2024improved,
    title={改进的分布匹配蒸馏用于快速图像生成},
    author={Yin, Tianwei and Gharbi, Micha{\"e}l and Park, Taesung and Zhang, Richard and Shechtman, Eli and Durand, Fredo and Freeman, William T},
    journal={arXiv 2405.14867},
    year={2024}
}

@inproceedings{yin2024onestep,
    title={基于分布匹配蒸馏的单步扩散},
    author={Yin, Tianwei and Gharbi, Micha{\"e}l and Zhang, Richard and Shechtman, Eli and Durand, Fr{\'e}do and Freeman, William T and Park, Taesung},
    booktitle={CVPR},
    year={2024}
}

第三方代码

EDM用于dnnlibtorch_utilsedm文件夹。

致谢

这项工作是在Tianwei Yin作为麻省理工学院全日制学生期间完成的。它是基于我们对原始DMD论文的重新实现而开发的。这项工作得到了国家科学基金会在合作协议PHY-2019786(NSF人工智能和基础交互研究所,http://iaifi.org/)下的支持,以及NSF Grant 2105819、NSF CISE award 1955864,以及来自Google、GIST、亚马逊和广达电脑的资金支持。

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号