DMD2

DMD2

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

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

DMD2AI绘图图像生成模型蒸馏文本生成图像Github开源项目

改进的分布匹配蒸馏用于快速图像合成 [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、亚马逊和广达电脑的资金支持。

编辑推荐精选

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

Hunyuan3D-2

Hunyuan3D-2

高分辨率纹理 3D 资产生成

Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。

3FS

3FS

一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。

3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。

下拉加载更多