不少朋友第一次把 Stable Diffusion v2-1-base 的权重拉下来、跑通第一张图之后,都会经历一个相似的阶段:出图是能出,但想复现某个效果时怎么调都不对,换个采样器画面就崩,改个 CFG 又变成一团糊。问题往往不在模型本身,而在于对参数之间那套联动关系没有建立起直觉。这篇东西就是把我这段时间折腾 v2-1-base 时踩过的坑、记下的参数组合、以及每个参数背后到底在控制什么,完整地摊开讲一遍。
Stable Diffusion v2-1-base 是 SD 2.x 系列里的基础文生图模型,768×768 原生分辨率,和后来的 refiner 版本不同,它自己就是一个完整的、从噪声到图像的端到端模型。它适合谁?适合已经玩过一阵 SD 1.5、想搞清楚参数体系而不是只会抄提示词的人;也适合需要把出图流程固化下来、做批量生成或者做二次开发的人。下面所有内容都围绕这个模型的参数展开,采样器、步数、CFG、种子、分辨率、负面提示词,一个都不跳过。
1. 参数体系的整体设计与选型逻辑
1.1 为什么 v2-1-base 的参数手感和 1.5 不一样
先把一个容易被忽略的前提说清楚:v2-1-base 用的是 OpenCLIP 的文本编码器,而 1.5 用的是 CLIP ViT-L/14 的一个变体。这个差异直接决定了提示词在参数体系里的权重分配方式。文本编码器换了,意味着同样的提示词、同样的 CFG 值,模型对"提示词该被多认真地执行"这件事的敏感度是不同的。我在实测里最直观的感受是:v2-1-base 在 CFG 7 到 9 这个区间比 1.5 更"听话",但一旦超过 11,画面劣化的速度也更快,容易出现那种过度饱和、边缘发硬的塑料感。
这背后的逻辑不复杂。CFG(Classifier-Free Guidance)本质是在做两件事:一边是无条件预测,一边是条件预测,然后把两者往条件方向推。文本编码器对提示词的表达越"强",同样的 guidance scale 推出来的偏移量就越大。OpenCLIP 在训练数据规模和文本理解上的特性,让 v2-1-base 对提示词的响应更集中,所以它的甜点区比 1.5 更窄,需要更精细地调。
理解了这一点,后面所有参数的取舍就有了依据:v2-1-base 不是一个"宽容"的模型,它更像一个执行指令很精确但不太会自我修正的下属,你得把指令给准,参数给稳。
1.2 参数分层的思路:哪些是"结构参数",哪些是"风格参数"
我在整理参数的时候习惯把它们分成两层,这个分法对实际调参帮助很大。
结构参数指的是决定画面"骨架"的那些:分辨率、采样器、步数、种子。这几个参数一旦定下来,构图、主体位置、整体布局基本就锁死了。你改 CFG 或者改提示词,改的是细节和质感,但大框架不会跑。
风格参数指的是决定画面"皮肤"的那些:CFG、负面提示词、采样器的高阶选项(比如 Karras 调度)。这些参数动一动,画面的锐度、对比、色彩倾向、细节密度会明显变化,但主体还是那个主体。
这个分层的好处是排查问题时不会乱。出图构图不对,先查结构参数;出图质感不对,再查风格参数。我见过太多人构图崩了去调 CFG,调半天没用,因为 CFG 根本管不到构图。
1.3 原生 768 分辨率这个设定为什么重要
v2-1-base 是在 768×768 上训练的,这一点必须刻在脑子里。SD 1.5 是 512,v2-1-base 是 768。这意味着如果你按 512×512 去跑 v2-1-base,模型会"没见过"这个尺寸的分布,出图容易出现构图重复、主体被裁切、细节糊成一团的问题。
我实测过同一组提示词在 512 和 768 下的差异:512 下人物经常出现两个头或者身体比例失调,768 下就正常。这不是玄学,是训练分布的问题。所以我的建议很直接:v2-1-base 的基准分辨率就是 768×768,竖图用 768×1024 或 768×1152,横图用 1024×768 或 1152×768,尽量让短边贴近 768。
注意:分辨率不是随便填的,它必须是 64 的倍数,因为 VAE 的下采样倍率是 8,UNet 内部还有进一步的降采样。填个 700×700 这种数,模型会自己给你对齐,但可能对不齐到你想要的效果。
2. 核心参数逐个拆解与实操要点
2.1 采样器:不是越新越好,是要匹配你的用途
采样器这块是最容易让人选择困难的。v2-1-base 支持的那一堆采样器里,我按实际用途分了三类,直接给结论。
| 采样器 | 步数需求 | 出图特点 | 适用场景 |
|---|---|---|---|
| Euler a | 20-30 | 有随机性,细节活泼,收敛快 | 快速出草稿、找灵感 |
| Euler | 25-40 | 稳定、可复现,细节偏干净 | 需要固定结果的批量生成 |
| DPM++ 2M | 20-30 | 细节密度高,质感细腻 | 人像、产品图 |
| DPM++ 2M Karras | 20-30 | 比 2M 对比更强,锐度高 | 需要画面"抓眼"的场景 |
| DPM++ SDE Karras | 25-40 | 随机性强,画面有呼吸感 | 艺术化、氛围图 |
| DDIM | 30-50 | 老牌稳定,但步数吃得多 | 兼容性要求高的老流程 |
Euler a 里的 "a" 是 ancestral 的意思,它每一步都会注入新的噪声,所以同一个种子跑两次结果可能不一样,这也是它"活泼"的来源。如果你要复现,别用它,用 Euler 或者 DPM++ 2M。
DPM++ 系列是我在 v2-1-base 上的主力选择。2M 是二阶多步方法,20 步就能收敛得不错,Karras 调度是在时间步上做了非均匀采样,把计算资源更多分配给关键的时间段,所以同样的步数下 Karras 版本细节更足。实测下来,DPM++ 2M Karras 配 25 步,是我在 768 分辨率下性价比最高的组合。
2.2 步数:找到"收敛点"而不是盲目堆高
步数的本质是去噪迭代的次数。太少,噪声没去干净,画面糊;太多,模型在已经收敛的画面上继续"过度加工",反而会引入伪影、让画面变"死"。
v2-1-base 的收敛点比 1.5 来得早一些。我的实测数据是:Euler 系列在 25 步左右基本收敛,DPM++ 2M 在 20 步就够,再往上加收益极小。超过 50 步之后,很多采样器会出现细节"过锐"、皮肤质感变塑料的情况。
这里有个实操技巧:判断是否收敛,不要只看整体,放大看眼睛、发丝、织物纹理这些高频区域。如果 20 步和 30 步在这些区域几乎没差别,那 20 步就是你的收敛点,没必要浪费算力。
提示:步数和采样器是绑定的。你换了采样器,收敛点就变了,别拿 Euler 的步数直接套到 DPM++ SDE 上,后者需要更多步才能稳定。
2.3 CFG Scale:v2-1-base 最需要克制的一个参数
前面提过,v2-1-base 的 CFG 甜点区比 1.5 窄。我把实测的区间整理成下面这张表,方便对照。
| CFG 区间 | 画面表现 | 建议 |
|---|---|---|
| 1-4 | 提示词约束弱,画面自由但容易跑题 | 只用于极简提示词或抽象创作 |
| 5-7 | 平衡区,提示词执行到位,画面自然 | 日常首选,尤其 6-7 |
| 8-10 | 提示词执行强,色彩饱和、对比上升 | 需要强风格化时用 |
| 11-14 | 开始出现过度饱和、边缘硬化 | 谨慎,配合负面提示词使用 |
| 15+ | 画面崩坏,塑料感、色块化 | 基本不用 |
我个人的默认值是 7。这个值在 v2-1-base 上能兼顾提示词服从度和画面自然度。如果你发现画面"不够听话",先别急着加 CFG,先检查提示词是不是写得太笼统——CFG 是放大器,提示词本身模糊,放大出来还是模糊。
CFG 还有一个隐性影响:它和步数有交互。高 CFG 下,每一步的偏移量更大,收敛更快但也更容易过冲。所以如果你把 CFG 拉到 10 以上,步数反而要适当降低,避免过度加工。
2.4 种子与随机性:复现的前提
种子决定了初始噪声,也就决定了构图的大方向。同一个种子、同一组参数、同一个采样器(非 ancestral),出来的图应该是一致的。这是你做参数对比实验的基础。
但这里有个坑:跨设备、跨版本的复现不一定完全一致。不同的 GPU、不同的 PyTorch 版本、甚至不同的 xformers 开关,都可能让浮点运算产生微小差异,累积下来画面会有细微不同。所以做严谨对比时,尽量在同一环境下跑。
Euler a、DPM++ SDE 这类 ancestral 采样器,即使固定种子,结果也会有随机性,因为它们每步都注入噪声。要复现就用非 ancestral 的。
2.5 负面提示词:v2-1-base 的"减法是加法"
负面提示词在 v2-1-base 上的作用比很多人想的要大。因为 CFG 的机制本身就是"往条件方向推、远离无条件方向",负面提示词实际上是在重塑那个"无条件"的锚点。
我的经验是,v2-1-base 的负面提示词不需要写得很长,写多了反而互相干扰。几个高频有效的方向:画质类(lowres, blurry, jpeg artifacts)、结构类(bad anatomy, extra fingers, deformed)、风格类(cartoon, 3d render,当你想要写实时)。写负面提示词的原则是"精准打击",针对你实际遇到的问题加,而不是抄一大串通用词。
3. 完整实操流程与参数组合实录
3.1 环境与基础配置
我用的是一套比较标准的配置,显存 12G 以上跑 768 分辨率比较从容。核心依赖是 diffusers 库,版本建议用较新的稳定版,因为 v2-1-base 的调度器实现在早期版本里有些小问题。
import torch from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler pipe = StableDiffusionPipeline.from_pretrained( "stabilityai/stable-diffusion-2-1-base", torch_dtype=torch.float16, safety_checker=None ).to("cuda") # 换成 DPM++ 2M Karras pipe.scheduler = DPMSolverMultistepScheduler.from_config( pipe.scheduler.config, algorithm_type="dpmsolver++", use_karras_sigmas=True )这里torch_dtype=torch.float16是必须的,fp32 在 768 分辨率下显存吃不消。safety_checker=None是为了避免它误判导致黑图,实际部署时按需保留。调度器换成 DPM++ 2M Karras 是我前面说的主力选择。
3.2 一组可直接复用的参数模板
下面这组参数是我在 v2-1-base 上跑人像和场景图都比较稳的模板,可以直接抄。
prompt = "a portrait of an elderly craftsman in a workshop, warm window light, detailed skin texture, shallow depth of field" negative_prompt = "lowres, blurry, jpeg artifacts, bad anatomy, extra fingers, deformed, cartoon, 3d render" image = pipe( prompt=prompt, negative_prompt=negative_prompt, num_inference_steps=25, guidance_scale=7.0, width=768, height=1024, generator=torch.Generator("cuda").manual_seed(12345) ).images[0]这组参数的关键点:25 步配 DPM++ 2M Karras 是收敛点,CFG 7 是平衡点,768×1024 是竖图且短边贴 768,种子固定便于复现。负面提示词只写了实际会遇到的问题,没有堆砌。
3.3 参数对比实验的记录方法
做参数调优,最忌讳"凭感觉"。我的做法是固定其他所有参数,只动一个变量,然后横向对比。比如测 CFG,就固定种子、步数、采样器,只把 CFG 从 5 跑到 12,每次间隔 1,生成一组图拼在一起看。
这里有个细节:对比时一定要用同一个种子。不同种子之间的差异会掩盖参数本身的差异,让你得出错误结论。我早期就犯过这个错,以为 CFG 8 比 7 好,后来发现是种子不同导致的偶然结果。
记录的时候,我习惯把参数和对应的图放在一起,标注清楚。时间长了你会形成自己的"参数直觉",看到某个画面问题就知道该动哪个参数。
3.4 分辨率与构图的联动调整
前面说了短边贴 768,但具体到不同构图,还有讲究。竖构图人像,768×1024 是安全区,再往上到 768×1152 会让人物显得更修长,但要注意头部不要被裁。横构图风景,1024×768 比较稳,1152×768 适合宽幅场景。
有个实操经验:当你需要更大分辨率时,不要直接让模型生成超大图,而是先生成 768 基准图,再用图生图或者放大模型做超分。直接生成 1536×1536 这种,v2-1-base 会因为超出训练分布而出现构图重复(比如画面里出现两个一样的主体)。这是训练分布决定的,不是参数能救的。
4. 常见问题排查与避坑实录
4.1 出图糊、细节不足,怎么查
这是最高频的问题。排查顺序我总结成一条链:先看步数够不够(低于 20 步基本都会糊),再看采样器是不是选了个需要高步数的(DDIM 就要 30+),然后看 CFG 是不是太低(低于 5 提示词约束不足),最后看分辨率是不是没贴 768。
如果这些都排除了还糊,那大概率是提示词本身缺乏细节描述。v2-1-base 不会凭空给你补细节,你得在提示词里明确写"detailed skin texture"、"intricate patterns"这类词。
4.2 画面过饱和、塑料感重
这个基本就是 CFG 太高了。v2-1-base 在 CFG 11 以上很容易出现这个问题。往下调到 7-8,配合负面提示词里加 "oversaturated, plastic" 通常能解决。
还有一种可能是采样器用了 Karras 调度但步数不够,Karras 在低步数下容易过冲。这种情况要么加步数,要么换回普通调度。
4.3 同一组参数换设备结果不一样
前面提过,浮点运算的微小差异会累积。如果差异很大,那要检查是不是采样器选成了 ancestral 类(Euler a、SDE),这类本身就有随机性。如果差异只是细微的,那是正常的,不用纠结。
4.4 常见问题速查表
| 现象 | 最可能原因 | 处理方式 |
|---|---|---|
| 画面糊、细节少 | 步数不足 / CFG 过低 / 分辨率不对 | 步数提到 25,CFG 到 7,短边贴 768 |
| 过饱和、塑料感 | CFG 过高 | 降到 7-8,负面加 oversaturated |
| 构图重复、多主体 | 分辨率超出训练分布 | 回到 768 基准,用超分放大 |
| 结果无法复现 | 用了 ancestral 采样器 | 换 Euler 或 DPM++ 2M |
| 提示词不生效 | CFG 过低 / 提示词太笼统 | CFG 到 7,提示词写具体 |
| 画面发灰、对比低 | 采样器调度问题 | 换 Karras 调度或提高步数 |
4.5 几个我踩过的坑
第一个坑是迷信高步数。早期我觉得步数越高越好,跑到 80 步,结果画面反而变"死",细节过锐。后来明白收敛点之后就不这么干了。
第二个坑是负面提示词堆太多。抄了一大串通用负面词,结果它们之间互相干扰,画面反而变差。负面提示词要精准,不要贪多。
第三个坑是忽略分辨率必须是 64 的倍数。填了个非 64 倍数的尺寸,模型自己对齐后构图偏了,排查了半天才发现是这个原因。
第四个坑是在 ancestral 采样器上做参数对比。结果每次都不一样,对比毫无意义。做对比实验一定要用确定性采样器。
这套参数体系我用了挺长时间,最大的体会是:v2-1-base 不是一个靠"大力出奇迹"的模型,它更像一个需要你理解它脾气再对症下药的合作者。CFG 克制一点、步数卡在收敛点、分辨率守住 768 基准,这三条守住,大部分问题都不会出现。剩下的就是提示词和种子的功夫了,那部分没有捷径,只能多跑多看。