DMD2

GitHub
1.3k 70 中等 1 次阅读 3天前NOASSERTION图像
AI 解读 由 AI 自动生成,仅供参考

DMD2 是一款专为加速图像生成而设计的开源 AI 模型,荣获 NeurIPS 2024 口头报告奖。它核心致力于解决传统扩散模型推理速度慢、计算成本高的问题,能够将原本需要数十步甚至上百步的生成过程压缩至 1 到 4 步,在大幅降低推理耗时(高达 500 倍)的同时,依然保持甚至超越原模型的图像质量。

针对前代技术依赖昂贵数据集构建及训练不稳定的痛点,DMD2 引入了多项创新改进:首先,它摒弃了耗时的回归损失计算,提出“双时间尺度更新规则”以确保训练稳定;其次,巧妙融合 GAN 损失函数,让模型能直接利用真实数据进行蒸馏,有效修正了教师模型的估计偏差;最后,通过模拟推理时的采样过程,解决了多步生成中的训练与推理输入不匹配难题。这使得 DMD2 在 ImageNet 和 COCO 等基准测试中刷新了单步生成的质量记录,并成功支持 SDXL 架构生成百万像素级的高清图像。

DMD2 非常适合希望部署高效文生图应用的研究人员、开发者,以及需要快速迭代创意内容的设计师。无论是希望在本地低算力环境下运行大模型,还是寻求极致生成速度的专业用户,都能从中获益。目前项目已提供 Hugging Face 模型库、ComfyUI 节点及 Colab 演示,便于各类用户快速上手体验。

使用场景

某电商平台的营销团队需要在“双 11"大促期间,根据实时热点快速生成成千上万张高清商品推广图,并集成到自动化的广告素材系统中。

没有 DMD2 时

  • 生成速度严重滞后:传统扩散模型(如原生 SDXL)生成一张高清图需数十步迭代,耗时数秒,无法支撑高并发下的实时素材需求。
  • 硬件成本高昂:为了缩短等待时间,必须部署大量昂贵的 GPU 集群进行并行计算,导致运营成本急剧上升。
  • 加速方案画质受损:现有的少步数加速方法往往依赖复杂的轨迹蒸馏或牺牲图像细节,导致生成的商品纹理模糊、光影不自然。
  • 训练数据构建困难:若要自定义加速模型,需预先用教师模型生成海量噪声 - 图像对作为回归损失的数据集,过程繁琐且存储成本巨大。

使用 DMD2 后

  • 推理速度提升 500 倍:DMD2 将生成过程压缩至 1-4 步,单图生成时间从秒级降至毫秒级,轻松应对实时流量洪峰。
  • 大幅降低算力门槛:极少的采样步数显著减少了 GPU 占用,使得在消费级显卡甚至边缘设备上部署高质量生成成为可能。
  • 一步生成媲美原图:通过引入 GAN 损失和真实数据训练,DMD2 在仅用 1 步的情况下,其 FID 分数甚至超越了原始教师模型,商品细节锐利逼真。
  • 简化训练流程:DMD2 消除了对昂贵回归损失数据集的依赖,无需预先生成海量中间数据,让团队能更快速地微调专属模型。

DMD2 通过革命性的分布匹配蒸馏技术,在将图像生成速度提升两个数量级的同时,反而进一步提升了画质,真正实现了“既要速度又要质量”的工业级落地。

运行环境要求

操作系统
  • Linux
GPU

必需 NVIDIA GPU (代码中明确使用 .to('cuda') 和 float16 精度),显存建议 16GB+ (运行 SDXL 模型及训练时),CUDA 版本未说明 (需匹配 PyTorch 版本)

内存

未说明 (建议 32GB+ 以支持 SDXL 模型加载和训练)

依赖
notes1. 必须使用 Conda 创建 Python 3.8 环境。2. 推理示例默认使用 float16 精度,需显卡支持。3. 支持 1 步和 4 步快速生成,可配合 Tiny VAE 降低显存消耗。4. 训练部分已知问题:当前 SDXL 的 FSDP 训练速度极慢,LoRA 训练比全量微调更慢且显存占用相同。5. 需要安装 xformers 以启用内存高效注意力机制。
python3.8
torch
diffusers
transformers
accelerate
xformers
safetensors
huggingface_hub
controlnet_aux
anyio
DMD2 hero image

快速开始

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

少步数文本到图像生成。

image/jpeg

改进的分布匹配蒸馏用于快速图像生成
田伟音、米夏埃尔·加尔比、泰松·朴、理查德·张、伊莱·谢赫特曼、弗雷多·杜兰、威廉·T·弗里曼
NeurIPS 2024 (arXiv 2405.14867)

联系方式

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

田伟音 tianweiy@mit.edu

摘要

最近的一些方法通过将扩散模型蒸馏为高效的单步生成器展现了潜力。其中,分布匹配蒸馏(DMD)能够生成在分布上与其教师模型一致的单步生成器,而无需强制与教师模型的采样轨迹一一对应。然而,为了确保训练的稳定性,DMD需要额外使用由教师模型借助确定性采样器经过多步生成的一大批噪声-图像对来计算回归损失。这对于大规模的文本到图像合成来说成本高昂,并且限制了学生模型的质量,使其过于依赖教师模型的原始采样路径。我们提出了 DMD2,这是一套可以克服这一局限并改进 DMD 训练的技术。首先,我们消除了回归损失以及构建昂贵数据集的需求。我们证明了由此产生的不稳定性是由于虚假判别器未能准确估计生成样本的分布所致,并提出了一种双时间尺度更新规则作为解决方案。其次,我们将在蒸馏过程中引入 GAN 损失,用以区分生成样本和真实图像。这使得我们能够在真实数据上训练学生模型,从而缓解教师模型对真实分数估计不准确的问题,并提升生成质量。最后,我们修改了训练流程以支持多步采样。我们识别并解决了在这种情况下训练与推理输入不匹配的问题,即在训练时模拟推理阶段的生成器样本。综合来看,我们的改进在单步图像生成领域树立了新的标杆,在 ImageNet-64x64 数据集上的 FID 得分为 1.28,在零样本 COCO 2014 数据集上的 FID 得分为 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"

# 加载模型。
with torch.device("meta"):
    unet = UNet2DConditionModel.from_config(base_model_id, subfolder="unet").to(torch.float16)
state_dict_path = hf_hub_download(repo_name, ckpt_name)
unet.load_state_dict(torch.load(state_dict_path), assign=True)
unet.to("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="a photo of a cat"

# 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="a photo of a cat"

# 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 有下载,从安全传感器中加载文件,基础型号是“稳定AI稳定的扩散XL基底1.0”,仓库名称是“天伟义DMD2”,检查名是“dmd2_sdxl_1step_unet_fp16.bin”。# 加载模型。
unet = UNet2DConditionModel from config base model id,subfolder “unet” to “cuda”,torch float16。Unet load state dict from hf hub download repo name,ckpt name,map location “cuda”。Pipe = Diffusion Pipeline from pre-trained base model id,unet = unet,torch dtype = torch float16,variant “fp16”。To “cuda”。Pipe scheduler = LCMScheduler from config pipe scheduler’s config。Prompt = “a photo of a cat”。Image = pipe prompt = prompt,num inference steps = 1,guidance scale = 0,timesteps = [399]。Images[0]。

4 步 T2I Adapter

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 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

许可证

改进型分布匹配蒸馏技术根据 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 发布。

已知问题

  • 目前用于 SDXL 训练的 FSDP 效率非常低;非常欢迎帮助!
  • 目前的 LORA 训练实际上比全量微调还要慢,并且占用的内存相同;同样非常欢迎帮助!

引用

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

@inproceedings{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},
    booktitle={NeurIPS},
    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 文件夹中。

致谢

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

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|5天前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|6天前
开发框架图像Agent

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.3k|★★☆☆☆|昨天
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|昨天
插件Agent图像

LLMs-from-scratch

LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备

90.1k|★★★☆☆|5天前
语言模型图像Agent

Deep-Live-Cam

Deep-Live-Cam 是一款专注于实时换脸与视频生成的开源工具,用户仅需一张静态照片,即可通过“一键操作”实现摄像头画面的即时变脸或制作深度伪造视频。它有效解决了传统换脸技术流程繁琐、对硬件配置要求极高以及难以实时预览的痛点,让高质量的数字内容创作变得触手可及。 这款工具不仅适合开发者和技术研究人员探索算法边界,更因其极简的操作逻辑(仅需三步:选脸、选摄像头、启动),广泛适用于普通用户、内容创作者、设计师及直播主播。无论是为了动画角色定制、服装展示模特替换,还是制作趣味短视频和直播互动,Deep-Live-Cam 都能提供流畅的支持。 其核心技术亮点在于强大的实时处理能力,支持口型遮罩(Mouth Mask)以保留使用者原始的嘴部动作,确保表情自然精准;同时具备“人脸映射”功能,可同时对画面中的多个主体应用不同面孔。此外,项目内置了严格的内容安全过滤机制,自动拦截涉及裸露、暴力等不当素材,并倡导用户在获得授权及明确标注的前提下合规使用,体现了技术发展与伦理责任的平衡。

88.9k|★★★☆☆|5天前
开发框架图像Agent