蒸馏后推理步数下降、出图细节变糊,第一反应常常是“教师模型不够强、没选对”。这个判断通常下得太早。教师模型的能力要放到变量对齐之后才可比:同一段提示词、同一组随机种子、同一分辨率、同一采样器与调度器、同一引导系数,只让“模型身份”和“采样步数”两个因素变化,才能看出画质差在哪里。多数排查里,原因分布在三种情况:种子随机性造成的错觉、步数压到画质拐点以下、教师与学生采样设置本来就不一致。
先把“画质下降”当作待验证现象,而不是结论。固定提示词、随机种子、分辨率与采样器/调度器/引导系数,只让模型身份和步数变化:先同步数对比教师与蒸馏学生,再逐档降步数找拐点,最后核对两边采样设置是否一致。若同步数下学生已明显丢结构,才回到教师选型与蒸馏配置上找原因;若同步数下差距不大,问题多半在步数砍得太狠。
固定提示词与随机种子,做一组对照出图
先做一件事:把随机性从对比里剥离。准备一段固定提示词,最好同时包含主体结构、材质纹理和小面积文字或细线,这类内容对细节丢失更敏感。种子不要只用一个,建议固定 3 到 5 个整数种子跑同一组条件,避免单张出图的巧合被当成规律。
对照组是教师模型在原始配置下的出图;实验组是蒸馏学生模型,除模型路径外,提示词、负向提示词、分辨率、种子列表、采样步数、采样器、调度器、引导系数全部保持不变。两组输出分别落盘,文件名带上变量,方便事后排序比对。
# 仅示意字段,按你实际使用的框架替换键名
run_id: dmad_cmp_01
prompt: "同一段提示词,两组完全一致"
negative_prompt: ""
resolution: [1024, 1024]
seed: [1234, 5678, 91011] # 多个种子,减少单张巧合
steps: 8
sampler: euler # 两组必须填同一个
scheduler: normal
guidance: 7.0
models:
teacher: /path/to/teacher
student: /path/to/distilled_student替换项是模型路径、种子列表和你要对比的步数。执行后不要只看配置文件,从运行日志里确认实际生效的参数,配置覆盖或默认值回填是常见的不一致来源。
对比教师模型与蒸馏学生模型同步数下的输出
这一步只比“同一步数”。把教师和学生都设成同一个步数(例如学生常用的低步数档),用同一提示词、同一种子出图,按三个维度并排看,不预设哪边更好。
- 结构:主体数量、比例、朝向、肢体或部件是否缺失,布局是否仍符合提示词描述。
- 纹理:皮肤、布料、金属、木纹这类高频细节是否成片糊掉或被抹平。
- 边缘:轮廓是否发毛,细线和小字是否断裂或粘连。
记录时写成两列描述,而不是笼统打分:教师在这个维度具体表现如何、学生在这个维度具体表现如何。若相同步数下学生在三项上都与教师接近,说明画质差距主要来自步数压缩;若同一步数下学生已经明显丢结构,问题更可能落在蒸馏数据、蒸馏目标,或教师本身与目标出图域不匹配,这时再回头审视教师模型选型才有意义。
把采样步数逐档降低,找画质拐点
确定学生在什么步数开始明显掉,比争论教师是谁更有用。做法是从一个偏保守的步数开始,按固定档位往下走(固定间隔或固定倍数),每档用同一提示词、同一种子出图,记录成表。
| 步数 | 主观评分(1–5) | 单张耗时(秒) | 备注:结构/纹理/边缘哪项先掉 |
|---|---|---|---|
| 待填 | 待填 | 待填 | 待填 |
| 待填 | 待填 | 待填 | 待填 |
| 待填 | 待填 | 待填 | 待填 |
评分标准要在开跑前定好并写下来,例如 5 分表示三项全部达标,3 分表示结构正确但纹理明显丢失,1 分表示结构与布局都错。标准一旦定下就不再修改,否则跨档位不可比。耗时按同一机器、同一分辨率、同一 batch size 记录,换环境后的耗时不能混在同一张表里。拐点的判断方式:找到评分连续两档出现明显下降的位置,前一个档位就是可用的最低步数;低于它继续跑,通常只能得到结构还在、细节被抹平的图。
核对教师与学生使用的采样器是否一致
在得出任何关于教师模型的判断前,先核对两边实际生效的采样设置。蒸馏学生往往在训练阶段就与某个采样器、某个调度器绑定,推理时换成另一套,画质会假性下降。
- 采样器(sampler):两边是否同名同实现,是否运行在同一推理后端。
- 调度器(scheduler / sigma 表):是否同一个,包括“用默认值”和“显式指定”的区别。
- 引导系数(guidance / CFG scale):是否一致;蒸馏模型对 CFG 的敏感度与教师不同,CFG 大幅偏离训练值时结构与纹理都会受影响。
核对方式不要只读配置文件,从日志里打印实际生效的三项值,或用一次最小推理把参数回显出来。
# 通用参数回显骨架,按所用框架的接口替换键名
print({
"model": ckpt_path,
"sampler": pipe.scheduler.__class__.__name__,
"scheduler_cfg": scheduler_name,
"guidance": guidance_scale,
"steps": num_inference_steps,
"seed": seed,
})不一致时的处理:以教师模型的推理配置为基准,把学生对齐到同一组采样器、调度器和引导系数,再重跑同步数对比。若对齐后差距收窄,说明此前观察到的画质下降有相当部分来自设置不一致;若对齐后差距依旧,再回到蒸馏配置和教师选型上排查。还有一种情况需要单独确认:蒸馏训练脚本里的采样器与推理时不同,这时应先确认训练侧的实际配置,再决定推理侧对齐到哪一边,不能想当然地按教师配置改。