inclusionAI/IDM · 上手攻略
- 仓库:inclusionAI/IDM
- 链接:https://github.com/inclusionAI/IDM
- 分类:engineering(生成模型 / 少步文本生图 / 蒸馏方法)
- 作者:spark
- 更新:2026-11-03
论文:Intrinsic Distribution Matching,arXiv:2610.39633(cs.CV,2026-10-29 v1 提交,33,466 KB)。项目页 https://inclusionai.github.io/IDM/ (已 302 跳转至 https://www.inclusion-ai.org/IDM/)。 作者单位:Inclusion AI / 西湖大学 / 清华大学 / 浙江大学 / 上海创新研究院 / MBZUAI;一作 Deyuan Liu、Yansen Han、Kaiwen Zheng,通讯 Jintao Zhang、Jianguo Li、Tao Lin。 许可:代码 Apache-2.0;base model 与未来 IDM checkpoint 权重许可另计。 本攻略撰写于 2026-11-03,依据仓库
main分支当时的 README(blob shaed131392ab2d15cd56c7e10781a7adea31e556fd)与requirements.txt(blob sha38ed3a267b56537d23777c64cbafb10953f452b3)。仓库仍处活跃开发期,接口可能继续变动。
一、这是什么
IDM(Intrinsic Distribution Matching,内蕴分布匹配)是 Inclusion AI 提出的一种少步/一步文本生图蒸馏方法,配套官方开源代码。
它要解决的问题很具体:一步、几步的文生图模型没有"反复修正"的机会,一旦首步走偏细节就没了——尤其长文本渲染(海报、菜单、封面上的成段中英文)崩坏得最明显。
传统 DMD(Distribution Matching Distillation)用 score 差(参考分布 score 减生成分布 score)来监督快模型,但经典做法需要:① 一个预训练教师提供参考 score;② 训练一个独立的 fake-score 网络去追踪不断变化的生成分布。
IDM 的两个动作:
- Internal DMD:沿用 APEX 的做法,score 差直接从生成器内部的速度分支(internal velocity branches)得到,省掉独立的 fake-score 网络。
- 特征矩匹配:把反向 KL 场分解成"高斯矩分量 + 非高斯残差",据此给出一个显式可约束的统计量——在生成器自己的 EMA 副本的最后一层激活上,约束特征均值与逐坐标标准差。关键点是:不需要任何外部特征编码器(不需要 DINOv2 之类),用生成器自身的表征当参考系。
推理阶段极轻:只需要学好的条件生成器 + 文本编码器 + VAE,不做特征提取、不做特征队列、不算矩、不跑 fake-score 分支。
⚠️ 重要现状:模型权重尚未发布。README 与项目页均标注 checkpoints "Coming soon"(Z-Image-Turbo 6B 与 Qwen-Image 20B 的全参 / LoRA r=32 / r=64 全部未放)。因此当前仓库只有推理代码,没有训练代码——目录里没有 train 脚本,训练侧(EMA 队列、矩损失实现)需自行实现。README 明确说明下载链接与 checkpoint 专属采样设置会随权重发布一并给出。
二、解决什么问题 / 核心结果
论文给出的数字(均为论文报告值,非本仓库实测),Z-Image-Turbo 6B、2 NFE、full-parameter:
| 方法 | NFE | OneIG | GenEval | DPG-Bench | LongText-CN | LongText-EN |
|---|---|---|---|---|---|---|
| Z-Image-Turbo | 2 | 50.94 | 76.53 | 85.78 | 78.48 | 72.89 |
| DMD2 | 2 | 50.70 | 76.12 | 85.40 | 85.30 | 80.99 |
| TwinFlow | 2 | 51.38 | 72.41 | 85.98 | 78.65 | 71.99 |
| APEX | 2 | 52.60 | 77.23 | 88.64 | 90.38 | 88.76 |
| Z-Image-Turbo++ | 2 | 52.50 | 75.70 | 85.86 | 91.62 | 89.88 |
| IDM | 2 | 53.06 | 77.81 | 86.82 | 94.25 | 90.20 |
| Z-Image-Turbo(高 NFE 参考) | 8 | 52.84 | 75.01 | 84.86 | 92.56 | 91.74 |
即:2 NFE 下 LongText-CN 94.25%、LongText-EN 90.20%,是所比较方法中该预算下最高。相对 Z-Image-Turbo++ 长文本 +2.63 / +0.32 个百分点,相对 APEX +3.87 / +1.44 个百分点。
速度(单卡 A100,BF16,batch=1 计延迟,batch=10 计吞吐):
- IDM (Z-Image-Turbo 6B):1 NFE 0.25 s,2 NFE 0.30 s;吞吐 5.41 / 5.18 img/s。
- IDM (Qwen-Image 20B):1 NFE 0.35 s,2 NFE 0.44 s;吞吐 3.44 / 3.28 img/s。
- FID(越低越好):Z-Image 6B 全参 1 NFE 7.13 / 2 NFE 6.71;Qwen-Image 20B 全参 1 NFE 6.77 / 2 NFE 6.34;LoRA r=64 的 2 NFE 分别为 6.79 / 6.41。
- Qwen-Image 20B 全参 2 NFE 另有 DPG-Bench 87.16%、WISE 0.56。
- Rank-64 LoRA 更新 0.4B 参数,GenEval 基本保住全参水平(0.90 vs 0.91)。
受控消融(同一数据与训练配置,全参 IDM(Z-Image) 2 NFE,百分比):
| 配置 | OneIG | GenEval | DPG-Bench | LongText-CN | LongText-EN |
|---|---|---|---|---|---|
| 无 DMD 无矩损失 | 52.25 | 76.24 | 85.68 | 92.70 | 88.88 |
| 无 DMD 损失 | 52.58 | 76.90 | 86.15 | 93.33 | 89.62 |
| Internal DMD,无矩损失 | 52.87 | 77.46 | 86.54 | 93.87 | 89.79 |
| DMD + 矩损失(DINOv2 特征) | 53.00 | 77.75 | 86.71 | 94.13 | 90.09 |
| IDM:DMD + 矩损失(EMA 特征) | 53.06 | 77.81 | 86.82 | 94.25 | 90.20 |
相对 internal DMD 对照组,矩损失带来 +0.19 / +0.35 / +0.28 / +0.38 / +0.41 个百分点,五项汇总指标全部改善;EMA 特征与 DINOv2 表现接近,说明"生成器自身表征"这条路线成立。
诚实标注(重要):README 与项目页均明确指出,以上对比中各外部方法训练数据与配置各不相同(APEX 甚至用更小的数据集合训练),因此"IDM 最优"只在同一训练设置下的受控消融里严格成立;跨方法比较仅作参考。DPG-Bench 上 APEX(88.64)高于 IDM(86.82),8-NFE 参考的 LongText-EN(91.74)也高于 IDM 的 90.20。
三、快速安装
要求:Python ≥ 3.10,CUDA 机器(显存需容下所选模型,20B backbone 明显比 6B 吃显存多)。默认精度 BF16。
git clone https://github.com/inclusionAI/IDM.git
cd IDM
python -m venv .venv
source .venv/bin/activate
# 若环境里还没有匹配的 PyTorch,先按 CUDA 版本装
# pip install torch --index-url https://download.pytorch.org/whl/cu124 # 版本号按自己的 CUDA 改
python -m pip install -r requirements.txt
requirements.txt 实测内容(已核对 blob):
torch>=2.6,<3
diffusers==0.37.1
transformers>=4.57,<5
accelerate>=1.10,<2
peft>=0.17,<0.19
safetensors>=0.6
Pillow>=10
注意两点:
- Diffusers 被 pin 在
==0.37.1——README 说明辅助时间嵌入(auxiliary-time)wrapper 依赖其模型接口,版本错了会起不来。别随手升级。 - 不需要 FlashAttention、FSDP 和任何训练服务;README 明确说这一点(对应"只发推理代码"的现状)。
开发自检:
python -m pip install -r requirements-dev.txt
python -m pytest -q # tests/ 用小模型做 CPU 检查,不下载模型
ruff check .
四、核心用法
仓库结构(已核对目录清单):inference.py(命令行生图)、unified_sampler.py(一步/两步一阶采样)、diffusers_patch/(推理适配器与 aux-time wrapper)、examples/prompts.txt、assets/(论文图)、tests/、paper/、docs/。
4.1 全参 checkpoint(权重尚未发布,以下为权重发布后的用法)
Z-Image backbone,2 NFE:
python inference.py \
--backbone z-image \
--model /path/to/IDM-Z-Image \
--prompt 'A cafe menu with the heading "MORNING COFFEE" and three lines: "Americano $4", "Latte $5", "Mocha $6".' \
--steps 2 --height 1024 --width 1024 --seed 42 \
--output-dir outputs/z-image
Qwen-Image backbone,1 NFE:
python inference.py \
--backbone qwen-image \
--model /path/to/IDM-Qwen-Image \
--prompt '一张咖啡馆海报,标题"今日咖啡",三行菜单"美式咖啡 18元""拿铁咖啡 22元""摩卡咖啡 25元"。' \
--steps 1 --height 1024 --width 1024 --seed 42 \
--output-dir outputs/qwen-image
4.2 只换 transformer(基座沿用原 pipeline)
python inference.py \
--backbone z-image \
--model /path/to/Z-Image-Turbo \
--transformer /path/to/IDM-transformer \
--prompt 'A book cover titled "The Art of Calm".' \
--steps 2
--transformer 指向的目录必须含 config.json 与 safetensors 权重。--aux-time-embed 有 auto(默认,按 checkpoint 的 _class_name 自动判断)/ on / off 三档;老导出物需手动 on/off 对齐架构。README 强调:transformer 参数缺失或意外会直接报错,而不是静默留随机权重。
4.3 LoRA 权重
python inference.py \
--backbone qwen-image \
--model /path/to/Qwen-Image \
--lora /path/to/IDM-LoRA \
--lora-weight-name pytorch_lora_weights.safetensors \
--prompt 'A poster with the title "Explore Japan".' \
--steps 2 --output-dir outputs/lora
LoRA 必须是 Diffusers pipeline 格式且与基座匹配;默认文件名 pytorch_lora_weights.safetensors,可用 --lora-weight-name 改。加载时即合并,--lora-scale 默认 1.0。README 明确:原始 optimizer state、FSDP 分片、未转换的 PEFT 训练 checkpoint 不是推理输入。
4.4 常用参数速查(均已核对 inference.py 的 argparse)
| 参数 | 说明 |
|---|---|
--model |
必填,Diffusers pipeline 目录或 HF repo ID |
--backbone |
必填,z-image 或 qwen-image |
--prompt / --prompt-file |
二选一必填;文件为 UTF-8,每行一个 prompt(空行忽略) |
--steps |
只能是 1 或 2,默认 2;对应恰好 1/2 次条件 transformer 前向,不用 CFG |
--timesteps |
自定义噪声水平,每个 NFE 一个,严格递减且落在 (0, 1] |
--stochastic-ratio |
步间加噪刷新比例,0~1,默认 0 |
--height / --width |
默认 1024,必须是 16 的正整数倍 |
--seed |
默认 42,范围 [0, 2^63) |
--num-images |
每 prompt 生成张数,逐张递增 seed |
--device |
cuda / cuda:N / cpu |
--dtype |
bfloat16(默认)/ float16 / float32 |
--output-dir |
默认 outputs |
--local-files-only |
禁止下载,只用本地文件或已有 HF 缓存 |
批量生成:
python inference.py \
--backbone z-image --model /path/to/IDM-Z-Image \
--prompt-file examples/prompts.txt --num-images 2 \
--steps 2 --output-dir outputs/batch
输出产物:每张图一个 PNG + 一个 JSON(记录 prompt、seed、backbone、model/transformer/lora 路径、lora_scale、aux_time_embed、nfe、timesteps、stochastic_ratio、height/width/dtype)。已存在的输出不会被覆盖——同名会直接抛 FileExistsError,换 --output-dir 或 --seed。
4.5 采样器内部逻辑(unified_sampler.py 已核对)
- 约定
t=1为噪声、t=0为数据;默认一阶 Euler,噪声水平[1](steps=1)或[1, 0.5](steps=2),末端落到干净端点 0。 - 每个 step 对条件速度网络求值一次,不跑负向 prompt 分支、不跑 fake-score 分支。
stochastic_ratio > 0时在步间混合预测噪声与新采样噪声(sqrt(1-ratio)/sqrt(ratio)),且最后一步(next_t == 0)不加噪。--timesteps传入时长度必须等于--steps,且严格递减,否则 argparse 直接报错。
五、典型适用场景
- 海报/菜单/封面类密集中文长文本生成:这是 IDM 明确主打的方向(LongText-CN 94.25%)。电商主图、促销海报、带价目表的咖啡菜单,都属于"文字必须对"的场景。
- 高并发在线出图:2 NFE、batch=10 时单卡 A100 跑 5.18 img/s(Z-Image 6B)/ 3.28 img/s(Qwen-Image 20B),延迟 0.30 s / 0.44 s,适合做同步出图 API 而非离线批处理。
- 显存受限的 LoRA 微调 + 部署:rank-64 LoRA 只更新 0.4B 参数,GenEval 保住全参水平(0.90 vs 0.91),适合团队先微调自己领域文本风格,再合并部署。
- 一步生成的实时/交互场景:
--steps 1就是 1 次网络前向,0.25 s 出图,可做草稿级预览。 - 研究向:想复现"少步生图 + 分布矩约束"这条路线的人,可以从
diffusers_patch/和unified_sampler.py读推理侧实现;训练侧需自己搭 EMA 特征队列与矩损失。
不适用:想立刻下载权重跑效果(还没发);想在消费级显卡上跑 Qwen-Image 20B;需要 CFG / 多步精修 / 高分辨率出图(--steps 只支持 1 或 2)。
六、坑与注意
- 权重没发:这是最大的坑。README 与项目页的 Checkpoints 表格全是 "Coming soon"(Z-Image-Turbo 6B、Qwen-Image 20B 的 Full / LoRA r=32 / r=64 全部如此)。README 还特别说明下载链接与 checkpoint 专属采样设置会随权重发布一并给出——也就是说现在即使硬凑出一个权重,采样参数也不一定是最终值。
- 仓库没有训练代码:目录里只有
inference.py、unified_sampler.py、diffusers_patch/等推理件,没有 train 脚本、没有 EMA 特征队列实现、没有矩损失。想复现论文训练得自行实现(论文 Eq. 13/14 与项目页的 A/B/C 三点说明是唯一指引)。README 也明说"checkpoint-specific sampling settings and end-to-end quality validation are pending the weight release"。 - 基座权重 ≠ IDM 权重:README 特别警告——"Base-model or APEX weights are not IDM checkpoints; they do not reproduce the IDM results above." 拿 Z-Image-Turbo 原权重跑不会得到论文数字,别误判成代码坏了。
diffusers==0.37.1是硬 pin:diffusers_patch/的 aux-time wrapper 依赖该版本接口,升到 0.38+ 很可能报参数不匹配的错。--steps只接受 1 或 2:choices=(1, 2)写死在 argparse 里,传 4 会直接报错退出,不是降级处理。- 尺寸必须 16 的倍数:
height % 16 or width % 16会触发parser.error;默认值 1024 是合规的,改成 1000 或 1023 会失败。 - 输出不覆盖:同名文件存在直接
FileExistsError抛出,批量重跑时容易"跑到一半炸掉",建议每次换--output-dir或改--seed。 --timesteps的三条约束:长度 ==--steps、每个值落在 (0, 1]、严格递减;违反任一条都是 argparse 报错。--stochastic-ratio必须在 [0, 1]。- seed 上界与自增溢出检查:
seed + len(prompts) * num_images不得越过 2^63,否则报错。批量大 prompt 文件时注意。 - 多卡写法:
--device cuda:1指定另一张卡;--device cpu只适合"小兼容性检查"(README 原文),且需配--dtype float32——CUDA 不可用时程序明确提示走这条路。 - aux-time-embed 版本不匹配:新导出用
auto即可,老导出要手动--aux-time-embed on/off对齐架构;参数不匹配会报错而非静默随机初始化(这一点设计得不错)。 - 速度与质量数字的边界:README 自述"All values below are reported in the paper. They are not measurements from running this repository.";且 LoRA 权重是合并后才计时的。外部方法(APEX/DMD2/TwinFlow)训练数据与配置不同,跨方法对比不构成严格公平比较,APEX 的 DPG-Bench 反而更高。
- 许可证分离:代码 Apache-2.0,但 base model 与未来 IDM checkpoint 的许可另行适用,商用前要单独确认权重许可。
七、与同类对比
| 方法 | 监督来源 | 需要 fake-score 网络? | 需要外部特征编码器? | 推理侧额外开销 | 主要长文本成绩(2 NFE, Z-Image) |
|---|---|---|---|---|---|
| DMD(经典) | 教师 score 差 | 是 | 否 | 有 | — |
| DMD2 | 改进的 DMD | 是(论文体系内) | 否 | 有 | LongText-CN 85.30 / EN 80.99 |
| TwinFlow | 双流一致性 | — | — | 有 | 78.65 / 71.99 |
| APEX | internal velocity 分支 | 否 | 否 | 有 | 90.38 / 88.76 |
| IDM | internal DMD + EMA 特征矩约束 | 否 | 否 | 无(纯生成器 + 文本编码器 + VAE) | 94.25 / 90.20 |
相对定位:
- vs 经典 DMD / DMD2:IDM 省掉 fake-score 网络,长文本明显更好(94.25 vs 85.30 CN)。
- vs TwinFlow:GenEval 上 IDM 77.81 远高于 TwinFlow 72.41。
- vs APEX(最接近的对照,且 IDM 推理实现即改编自 APEX):IDM 在长文本上更强(+3.87 / +1.44),但 DPG-Bench 落后(86.82 vs 88.64),且 APEX 属外部参照、训练设置不同。
- vs 传统多步蒸馏(LCM / SDXL-Turbo / SD-Turbo 等):IDM 路线不依赖 guidance 或对抗式微调,1~2 步即可;LCM 系多在 4~8 步。
- vs 其他 2026 年少步生图工作(如 SDEdit-free 系一步/少步蒸馏):IDM 的差异化在于"用生成器自身 EMA 表征做矩约束",因此不背外部 encoder(如 DINOv2)的计算与许可负担;代价是额外训练复杂度上升。
八、一句话推荐
推荐——如果你关注"一步/两步出图 + 中文密集长文本不掉字",这是目前公开方法里最有说服力的一条路线(2 NFE 下 LongText-CN 94.25%,单卡 A100 0.30 s/张);但现在只适合读代码和搭推理管线,权重未发、训练代码未开,等权重与 checkpoint 采样设置落地后再动手更稳妥。
附:待核 / 不确定项
- ⚠️ 权重发布状态:"Coming soon" 为 2026-11-03 读取 README 与项目页所见;发布计划时间仓库未给出,待后续核。
- ⚠️ 训练代码:仓库当前无训练脚本;训练侧实现细节(EMA 衰减系数、特征队列长度、矩损失的池化位置)需以论文正文 / 项目页 Eq. 13/14 为准,本次未逐条核 PDF 正文。
- ⚠️ 论文数值:本文所有指标均 verbatim 抄自 README / 项目页 / arXiv abstract 与表格,非本仓库实测;论文未标注实验所用具体数据集名称(README 仅称 "the shared internal DMD control"、参考集等),训练数据构成需回查 PDF。
- ⚠️ checkpoint 专属采样设置:README 声明随权重发布提供,本文给出的默认 timesteps
[1]/[1, 0.5]为代码默认(已与unified_sampler.py的[1.0 - i/steps]逻辑核对一致),不保证等于最终推荐设置。 - ⚠️
pip install torch的 CUDA 轮子版本:README 只说"按你的 CUDA 环境装合适的 PyTorch",未给具体命令;文中示例cu124仅为占位,需自行匹配。 - ⚠️ arXiv 编号 2610.39633 / 仓库名大小写:均为读取时的原文,但该 arXiv ID 与项目页内容存在若干"看起来非标准"之处(如 ID 段 39633 偏大、PDF 体积 33,466 KB),本次未做第三方交叉核对,建议以 arXiv 官方页面为准。