我在阅读 OPD 实现时注意到,align_sigmas 选取了学生当前区间内的教师节点,但 scheduler 会将最后一步直接更新到 sigma=0。 以Qwen-Image-2.1-Turbo的8步蒸馏到3步为例子,学生当前区间为 1 → 0.845148,教师实际执行的却是 1 → 0.978453 → 0.954180 → 0.926626 → 0.895080 → 0,然后用起始 sigma 归一化得到速度目标。 下面的表格写了两种方法,为什么diffsynth采用第一种方法,而不是“严格区间匹配”这种做法?第一种方法效果更好嘛? | 方案 | 教师积分路径 | 最后一次教师前向的位置 | |---|---|---| | diffsynth当前实现 | 1 → .978453 → .954180 → .926626 → .895080 → 0 | .895080 | | 严格区间匹配 | 1 → .978453 → .954180 → .926626 → .895080 → .845148 | .895080 |
Activity
wanglaofei commentedon Oct 27, 2026
我试了第二种方法进行蒸馏,感觉效果还挺好的。第一种默认的方法没有尝试。
Artiprocher commentedon Oct 27, 2026
@651961 实际上两者实现在数学意义上完全等价,在教师模型推理结束后,我们需要把这多步推理合成一步。
将学生模型开始推理的起始点记为 sigma=u,教师模型推理的最后一个点记为 sigma=v,学生模型下一次推理的起始点记为 sigma=w
注意到 w 仅影响在哪里对齐,前者是后者设定为 w=0 的特例,清除了速度目标中的所有噪声部分。但后者在计算过程中需要除以区间 sigma 的差值,这个数值更小,容易出现较大的舍入误差,因此我们采用了前者。我们会考虑进行额外的实验,验证两者的训练效果,未来可能将其设定为一个超参数。
651961 commentedon Oct 27, 2026
感谢回答。
不过,“数学上完全等价”应该是需要额外条件吧,他应该是不适用步数蒸馏的。
你给出的两个公式满足:
因此,当
0 < w < u时,两者相等的条件是T_w = e_v。比如一种情况,教师和学生的sigmas网格完全一致,你这个公式就成立。
但是步数蒸馏,教师和学生的sigmas网格不可能一致。
以qwen image 2.1 Turbo 8步蒸馏→3步蒸馏为例,如果学生是
1 → 0.845148区间,两者都做五次教师前向。考虑一个反例:起始状态
x_1 = 0,前四次教师预测速度均为1,最后在.895080的预测速度为2。前四步完全相同,得到:
DiffSynth 最后更新到 0:
严格区间匹配最后更新到
.845148:一个是1.895080,另一个是1.322450,两个速度目标不同。
qiu-pinggaizi commentedon Oct 30, 2026
蒸馏使用的数据,是什么规模呢
qiu-pinggaizi commentedon Oct 30, 2026
请教一个其他问题,我想在Qwen-Image-2.1-Turbo 基础上微调一个风格lora,直接sft lora 会破坏turbo本身的加速能力;能参考Z-Image-Turbo-DistillPatch进行Qwen-Image-2.1-Turbo的差分训练吗 @Artiprocher @wanglaofei
651961 commentedon Oct 30, 2026
SFT配步数蒸馏的做法是在base模型上训练,也就是在Qwen-Image-2.1上面训练,得到Qwen-Image-2.1-SFT。然后做权重合并,把turbo合并进来。
@qiu-pinggaizi
qiu-pinggaizi commentedon Oct 30, 2026
651961 commentedon Oct 30, 2026
额,最简单的权重合并就行吧,更好的方法也感知不到什么提升。我刚才让codex写了个脚本,你改一下路径什么的应该就能用。
@qiu-pinggaizi
dongdk commentedon Nov 2, 2026
看danceopd的做法,
看起来不太一样。是出于什么考虑?