DMAD 的少步采样调参,可先按「采样器固定 → 步数扫描 → 引导系数单改 → 多提示词复跑」的顺序推进。原因是少步模型本来就在质量边界附近工作,步数和引导系数会互相掩盖问题:同时改两项,出图变差也判断不出是步数不够还是引导过强。先把采样器与随机种子固定,用同一提示词做步数对比,确定这个模型在你的场景下最低能用到几步,再去单独调引导系数,最后换一批不同类型的提示词复跑确认不是偶然。
判断与操作顺序:适用场景是已有训练好的 DMAD 少步模型、只在推理侧调参。动作是先固定采样器、种子、分辨率、负向提示词,单改步数找到质量开始明显下降的档位;再固定步数单改引导系数,观察是否出现过度引导的画质问题;最后用一批分层提示词和固定种子复跑。验证方式是保存配置快照与出图记录,对比同种子同提示词下的差异。边界:若改动的是训练端的少步目标,推理侧调参不能替代重训;单提示词单次出图的结论不可靠。
把采样相关参数列成一张可调清单
第一步是分清哪些参数属于采样、哪些属于训练,别混在一次改动里。采样侧改了只需要重跑推理;训练侧改了必须重训或至少重新导出权重,两边的反馈周期完全不同。
- 采样器:来源位置通常是推理配置里的采样器名称字段,或 WebUI 的采样方法下拉框。作用范围是整条去噪轨迹的求解方式,换了采样器等于换了另一组 baseline,所以本轮把它固定。
- 步数:推理配置里的采样步数字段,或调用参数里的步数项。作用范围是去噪迭代次数,少步模型的可用区间通常比常规模型窄。
- 引导系数:配置里的 guidance / cfg 一类字段。作用范围是提示词约束强度,少步模型对它的敏感度往往比多步模型高。
- 随机种子:调用参数或配置里的 seed 字段。作用范围是初始噪声,是后面所有对比能否复现的前提。
- 尺寸与负向提示词:同样影响出图,但不是本轮要调的变量,一并固定。
- 训练侧参数:学生模型的步数目标、蒸馏损失权重、训练步数、学习率、batch、EMA 等。这些在训练配置里,改动意味着重训,不要和推理参数一起动。
建议先把本轮实验的配置写成一个可复用的片段,字段名按你实际的配置文件或调用参数替换:
# 推理侧实验配置(字段名以你的实际配置为准)
sampler: euler # 本轮固定
steps: 4 # 本轮唯一变量
guidance_scale: 1.0 # 本轮固定
seed: 12345 # 本轮固定
size: 1024x1024 # 本轮固定
negative_prompt: "" # 本轮固定
prompt_id: p01 # 对应提示词集合里的编号
固定其他项,只改步数出图对比
这一轮的目标不是找最好看的图,而是找少步采样的质量下限:从哪一档开始,结构完整性和细节稳定性明显撑不住。对比组保持同一提示词、同一种子、同一引导系数、同一尺寸,唯一变量是步数。
步数档位建议按整数倍取,例如 1、2、4、8、16,不要每档加一。整数倍更容易看出趋势在哪一步断开,也方便和训练时设定的步数目标对齐。如果模型说明里给了推荐步数,可以把它当作中间的参考点,向上向下各取一到两档,不要默认它就是这个场景的最优值。
| 步数 | 结构完整性 | 细节与纹理 | 色彩对比 | 伪影 | 备注 |
|---|---|---|---|---|---|
| 1 | |||||
| 2 | |||||
| 4 | |||||
| 8 | |||||
| 16 |
记录维度要具体到可判断的程度:主体结构是否变形或缺件、细节纹理是否板结成块、色彩与对比是否偏移、是否出现重复纹理或网格状伪影、画面整体是否「糊成一片」。表格里可以填现象描述,不要只写「好 / 不好」。同一行发现的问题,下一轮改引导系数时可以作为对照。
再单独调引导系数观察变化
步数定下来后,再单改引导系数,用来判断画质问题是不是过度引导造成的。做法是把步数、种子、采样器全部锁死,只让引导系数变。
取值可以先从低到高铺几档,例如 1.0、1.5、2.0、3.0,再看更高一档如 5.0 是否已经明显崩掉。具体数值由你按自己模型的响应区间决定,不必照搬。低档观察重点:语义是否还跟得住提示词、构图是否散、主体是否容易缺元素;高档观察重点:是否出现过曝或饱和溢出、纹理是否变得僵硬板结、细节是否被「压平」、画面是否失去层次。少步模型在高引导下更容易出现这类过度引导特征,所以画质问题先怀疑引导系数,比先怀疑采样器更省时间。
如果发现某个引导系数只在个别提示词上出问题,先别急着下结论,留到下一节用提示词集合验证。
用同一批提示词跑一遍验证改动是否稳定
单提示词单种子的结果只能说明这一次出图,不足以支撑「这组参数可用」。复跑时把提示词按类型分层,每类放几条,覆盖不同难度:简单物体、人物、场景、复杂构图或多主体、含文字或手部等易错结构。每个提示词再配两三个固定种子,保证组合固定、顺序固定,方便逐张对照。
复跑时需要能还原现场,所以配置快照和种子列表要一起保存。可以给配置算一个哈希,出图记录里带上哈希和种子,回头能确认某张图是哪一版参数生成的。下面是一个通用骨架,run() 换成你自己的推理调用即可:
import json, hashlib, itertools
config = {
"sampler": "euler",
"steps": 4,
"guidance_scale": 1.5,
"size": "1024x1024",
}
seeds = [12345, 2024, 7]
prompts = [json.loads(l) for l in open("prompts.jsonl", encoding="utf-8")]
cfg_hash = hashlib.md5(json.dumps(config, sort_keys=True).encode()).hexdigest()
records = []
for p, s in itertools.product(prompts, seeds):
image_path = run(prompt=p["text"], seed=s, **config) # 替换为你的推理调用
records.append({
"prompt_id": p["id"],
"prompt_type": p["type"],
"seed": s,
"config_hash": cfg_hash,
"config": config,
"image_path": image_path,
})
json.dump(records, open("run_log.json", "w", encoding="utf-8"), ensure_ascii=False, indent=2)
json.dump(config, open(f"config_{cfg_hash}.json", "w", encoding="utf-8"), ensure_ascii=False, indent=2)
跑完后按提示词类型分组看:如果问题集中在某一类提示词上,说明那类场景需要单独放宽步数或调整引导系数;如果各类型都出现同类伪影,更可能是这组参数整体偏紧。这一轮只做判断,不要在同一批提示词上边看边改参数,否则又回到多变量同时动、看不出效果的状态。