同一句提示词两次出图差别很大,先把怀疑对象从提示词挪开。扩散类出图流程里,种子决定的是构图、人物姿态、背景布局这类「大结构」的抽样起点,采样步数更多影响收敛程度和细节密度,通常不会让画面整体换一个样子。所以判断顺序建议是:先在配置里把种子写死,确认能否复现;再单独动步数;最后才动采样器、调度器这类设置项。下面全部是单变量对照,不改提示词,不需要联网,只用同一台机器同一次会话内的配置和日志就能做完。
判断差异来自随机种子还是参数设置,先看配置里有没有显式 seed。省略 seed 或写成 -1 一类取值,通常意味着每轮重新抽样,两次出图必然不同;把种子写死后连跑三次,产物一致说明差异来自种子,不一致则要回头检查采样器、调度器、批量张数、cfg 是否也在变。锁种子后单独改步数,观察的是细节密度与笔触,而不是构图换脸。种子、步数、采样器、调度器建议固定进基线表,只放开提示词和输出数量,这样每次出图都有可回查的起点。
在配置里显式写出随机种子,连跑三次看出图是否一致
第一步只解决一个问题:这台机器上的 MOSS-Image 服务默认是不是每轮随机取种子。做法是把种子字段显式写成固定整数,其他字段全部保持原样,然后同一条提示词连续跑三次。字段名以你实际使用的配置文件为准,下面给的是常见写法的骨架,替换成自己的键名即可。
# 字段名以实际配置文件为准,此处为通用骨架
generation:
prompt: "同一句提示词"
seed: 12345 # 显式写死;若为 -1 或被省略,通常每轮重新抽样
steps: 30
sampler: euler_a
scheduler: karras
cfg_scale: 7
width: 1024
height: 1024
batch_size: 1 # 大于 1 时同批内种子往往递增,容易被误判成随机三次跑完把结果记成一张表,不要只凭印象说「好像差不多」。差异位置写具体一点,比如人脸、手部、背景元素数量,这样后面判断步数影响时才有对照物。
| 轮次 | seed | steps | sampler | 产物文件 | 与上一轮是否一致 | 差异位置 |
|---|---|---|---|---|---|---|
| 第 1 次 | 12345 | 30 | euler_a | run1.png | — | — |
| 第 2 次 | 12345 | 30 | euler_a | run2.png | 填写一致 / 不一致 | 填写具体部位 |
| 第 3 次 | 12345 | 30 | euler_a | run3.png | 填写一致 / 不一致 | 填写具体部位 |
三次完全一致,说明这条链路在固定种子下是可复现的,之后的差异都可以归到参数上。三次仍不一致,先别急着怀疑模型,去确认三件事:服务端有没有把 seed 覆盖掉、批量张数是否大于 1、任务队列是否复用了上一次的随机状态。这几点在没有显式日志时很容易被忽略,建议在出图日志里把实际生效的 seed 打印出来核对,而不是只看配置文件写了什么。
锁死种子只改采样步数,观察画面细节的变化
种子固定之后,步数就成了唯一的变量。把步数取三档,例如 20、30、40,其余字段一个都不动,每条各跑一次,同时记录耗时。耗时可以从日志时间戳里取,也可以在提交前后各打一个时间,命令行下用 time 包一层同样可行。
| steps | seed | 产物文件 | 耗时(按日志填写) | 构图是否变化 | 细节与笔触变化 |
|---|---|---|---|---|---|
| 20 | 12345 | steps20.png | 记录实际值 | 记录观察 | 记录观察 |
| 30 | 12345 | steps30.png | 记录实际值 | 记录观察 | 记录观察 |
| 40 | 12345 | steps40.png | 记录实际值 | 记录观察 | 记录观察 |
判断标准很朴素:如果主体位置、人数、背景大件在几档步数之间基本稳定,只是边缘和纹理有差别,那步数不是「两次出图差很多」的主因,把它当作画质和耗时的权衡项就够了。如果步数一改构图就大幅变化,通常说明采样没有收敛,或者步数档位跨度过大,需要结合具体模型确认可用的步数区间,而不是照搬别的模型的常用值。
种子和步数都不动,只改采样相关设置项,记录风格漂移
到这一步才轮到采样器和调度器。这两个设置项影响的往往是整体质感,而不是构图本身,所以必须在前两步已经锁死的前提下测,否则分不清是风格变了还是随机性在起作用。建议一次只改一项,取值清单写清楚,产物与取值一一对应。
- sampler:在配置里常见的取值有 euler、euler_a、dpmpp_2m、ddim 一类,逐个替换,其余不动。
- scheduler:常见取值有 normal、karras、exponential 一类,与 sampler 搭配使用,同样逐个替换。
- cfg_scale:属于条件强度,不是随机性来源,但会明显改变对提示词的贴合程度,可以放在最后一轮单独试,不要和采样器一起改。
| 设置项 | 取值 | seed | steps | 产物文件 | 风格变化描述 |
|---|---|---|---|---|---|
| sampler | euler_a | 12345 | 30 | s_euler_a.png | 记录观察 |
| sampler | dpmpp_2m | 12345 | 30 | s_dpmpp.png | 记录观察 |
| scheduler | karras | 12345 | 30 | sc_karras.png | 记录观察 |
如果换采样器后画面风格变化明显,就说明这类设置项是「同一提示词不同观感」的合法来源,之后再遇到两次出图不一致,先查这几个字段有没有被人改过或没传进去,比反复改提示词有效得多。
把对照结果整理成一份参数基线,供后续出图直接引用
三轮对照做完,把当时真正生效的值抄成一张基线表,写在项目里的配置注释或 README 顶部都行,下次出图前先对一眼,不要靠记忆。
| 参数 | 基线值 | 是否固定 | 说明 |
|---|---|---|---|
| seed | 写死一个整数 | 必须固定 | 要复现就必须固定,需要多样性时再放开 |
| steps | 对照后选定的一档 | 必须固定 | 跨档改动会带来细节与耗时变化 |
| sampler | 对照后选定 | 必须固定 | 影响风格,换之前先做单变量对照 |
| scheduler | 对照后选定 | 必须固定 | 与 sampler 绑定记录,不要只记一个 |
| cfg_scale | 对照后选定 | 建议固定 | 调整会改变提示词贴合度 |
| prompt | — | 可以放开 | 这是本来就要改的变量 |
| 输出数量 | — | 可以放开 | 注意批量大于 1 时种子通常递增 |
一句话概括这份基线的用法:种子、步数、采样器、调度器必须固定,提示词和输出数量可以放开。每次改动只动其中一项,并把产物文件名带上参数值和种子,后续回查时就不用再猜「当时是哪个设置」。