☰
Stable Diffusion LoRA炼丹全攻略:从素材准备到参数调优
2026/10/21 2:57:55 网站建设 项目流程

1. 炼丹这个词,到底是什么意思

我最早听到“炼丹”这个词,是从玩 Stable Diffusion 模型训练的朋友嘴里蹦出来的。

一开始我以为是什么玄学黑话,后来才明白——所谓炼丹,就是把一堆图片素材喂给训练脚本,让模型学会某个特定的人、画风、物件或者概念,最后产出一个可用的低尺寸模型文件。整个过程像古代道士守着丹炉一样,调火候、看时辰、等出炉,胚子好坏全看素材和参数,成品不行就炸炉重来,所以大家习惯把这套流程叫“炼丹”。在 SD(Stable Diffusion)这个领域里,最常练的“丹”主要有三种:Dreambooth 微调出来的单概念模型、LoRA 低秩适配模型、以及 Hypernetwork 或 Textual Inversion 这类嵌入向量模型。其中 LoRA 是目前最主流、最通用、最适合新手入坑的形态,文件体积小、训练时间短、可控性强,加不加权、混不混风格都能灵活调整。

那这篇总结到底解决什么问题?就是给你一条从零开始的完整炼丹路线:从准备素材、打标、设置参数,到训练出丹、测试效果、查错避坑。适合刚接触 SD 生态的新手,也适合已经练过但经常炸丹、脸崩、过拟合的老手回头查缺补漏。我自己练过的模型数量不算多,但踩过的坑足够写一本小册子了,下面这些内容基本是我反复试错后留下的干货。

注:下面提到的工具和脚本以目前社区常用的开源方案为准,具体版本号建议以你下载时的官方仓库为准。

2. 开炉之前,把家当准备齐

2.1 硬件门槛:显存决定了你能练多大的丹

炼丹第一大坑就是显存。很多人拿配置不错的游戏本跑图,以为练模型也一样轻松,结果一开训练脚本直接显存爆满,报错刷屏。

先说结论:LoRA 训练的最低门槛是 6GB 显存,8GB 以上会比较舒服,12GB 以上可以尝试更大的分辨率或更多角色。如果你只有 4GB 显存,不是不能练,而是只能用很低的分辨率、很小的 batch size、很短的训练步数,效果和效率都不太理想。

以我实测过的几档配置为例:

显存可训练方案实际体验
4GBLoRA 512px,batch size 1,梯度累积拉满能跑,但极其慢,容易 OOM
6GBLoRA 512px,batch size 1-2入门及格线,单轮约 1 小时
8GBLoRA 768px 或低分辨率 DreamBooth比较稳,兼顾画质与速度
12GB+LoRA 1024px,或角色 + 风格双 LoRA操作空间大,明显从容
24GB几乎全场景通吃随便折腾

显存不够时的常见补救办法:一是降低分辨率,把训练的图片统一缩到 512×512,SD 1.5 系列的底模本身就是在 512 分辨率下训练的,练 512px 完全合理;二是把 batch size 调到 1,靠梯度累积来模拟更大的 batch;三是用内存换显存的优化器,比如 8bit AdamW,显存占用能下降不少。还有一个小技巧,训练脚本里可以把 VAE 切到 CPU 侧或者使用低显存模式,也能省出一部分空间。

2.2 软件环境:版本统一比什么都重要

炼丹对软件环境极其挑剔。我见过太多人训练时崩了,不是参数问题,而是环境问题。

推荐方案如下:

  • Python 版本:3.10 以上,3.10 或 3.11 均可
  • PyTorch:2.x 系列,注意对应 CUDA 版本
  • CUDA Toolkit:11.8 或 12.x,需要跟 PyTorch 的编译版本匹配
  • 训练脚本:LoRA 训练优先用 kohya_ss,社区维护活跃,功能全;WebUI 里也会集成一些简单训练功能,但参数控制不够细
  • 底模:SD 1.5 系列的模型文件,推荐用剪枝过的 pruned 版本,占用小、加载快

环境配置最烦的是各种依赖冲突,我的建议是直接用整合包或者 Conda 单独建一个环境,不要跟日常跑图的 WebUI 环境混在一起。如果你已经装了 WebUI,里面有一个独立的 Python 虚拟环境,理论上可以复用,但依赖版本容易互相踩,不如另起炉灶清爽。

装完环境后先跑一个最小测试,用官方示例数据练几十步,能顺利产出模型文件,说明环境 OK,再开始你的正式“开炉”。这一步能帮你把环境问题和训练问题隔离开,排查起来快很多。

2.3 素材收集:宁精勿滥,这是丹的原料

素材质量直接决定模型上限,后期调参只能补救,不能逆天改命。

关于素材数量,我的经验是:

  • 单个角色 LoRA:20~50 张高质量图片
  • 单风格 LoRA:50~100 张风格鲜明的图片
  • 单概念/物件 LoRA:30~80 张不同角度的图片

素材不是越多越好。特别是角色类,如果你塞了 200 张图,里面 100 张构图、角度、表情重复度极高,模型会严重过拟合,最后训练出来的角色像被定住了,动作僵硬、表情单一。

挑选素材时注意几点:分辨率尽量一致,不要混入带水印、多人大合影、脸部被遮挡过多的图片;同一个角色尽量保证特征统一,如果图片之间脸型差异很大,模型会学得很纠结。对于风格类模型,素材要“风格统一”,比如你想要学某位画师的厚涂风格,就别把赛璐璐风格的图混进去,否则模型会两头摇摆,产出的画面风格飘忽不定。

2.4 打标:决定模型“听不听得懂”提示词

LoRA 训练的核心机制是“图文对应”,你的每张训练图都要配一组提示词标签,模型在学习图像特征的同时,把标签和图像特征绑定起来。所以打标质量直接影响模型的文本控制能力。

打标通常用 WD14 Tagger 这类自动打标工具,先自动生成一批标签,再手动清洗。这里有几个非常关键的实操要点:

第一,通用标签要删掉。比如 1girl、solo、looking_at_viewer 这种表示构图和通用属性的标签,训练时可以不删,但如果你的角色特征被这些高频标签稀释,建议把和角色身份无关的通用标签清理掉一部分。

第二,触发词必须统一。比如你设定触发词是“character_name”,那么所有训练图的标签里都必须包含这个触发词,且写法必须完全一致,大小写、下划线都不能变。模型会把触发词和角色特征绑在一起,如果触发词七写八写,等于把一个角色拆成好几个特征散装包,训练效果会明显打折。

第三,标签不宜过细也不宜过粗。有人把每张图的所有细节全部标出来,比如发型、发色、眼睛颜色、衣服、背景、动作,全部写进标签,结果模型学了一堆无用关联;也有人只写触发词,其他信息一概不标,结果模型对画面元素的理解极弱,出图时很多细节控制不了。我的习惯是:保留和角色核心特征相关的标签,比如发型、瞳色、标志性服饰,删掉对画面影响不大的琐碎标签,背景、动作、表情可以适当保留,因为这些东西能帮你后期控制构图。

素材和标签准备好之后,训练前的准备工作就差不多了。这个阶段大概会占掉整个炼丹流程 50% 的时间,但也是最值得花时间的部分——数据的质量,决定了你这炉丹的成色。

3. 炼丹核心流程:从素材到模型

3.1 数据预处理:裁切、缩放与命名规范

写训练脚本之前,先得把图片处理成脚本能吃的格式。

第一步是统一尺寸。不要直接把原图扔给脚本,很多训练脚本会做 center crop,也就是从图片中心裁一块正方形出来再缩放。如果你的素材是竖构图或者横构图,中心裁切容易把重要的头部特征切掉。建议自己先把图裁剪到目标分辨率附近的构图,再做缩放,保证人物主体在画面中心偏上一点的位置。

第二步是目录结构。kohya_ss 的训练数据目录一般是这样的:

dataset/ ├── 5_角色名 │ ├── 001.jpg │ ├── 002.png │ ├── ...

目录名前面的数字表示该文件夹中的图片需要重复训练的次数。比如“5_角色名”表示这个文件夹里的每张图,在每一个 epoch 中会被重复读取 5 次。重复次数是控制训练强度的一个重要手段:素材少,就把重复次数调大;素材多,重复次数可以调小,总步数最终由脚本自动计算。

第三步是命名规范。文件名建议用纯数字或者简单的英文字母,不要用中文、空格和特殊符号,否则容易在某些依赖路径解析的脚本组件上报错。图片格式 JPEG、PNG 都可以,但 PNG 的细节保真度更高,如果素材里有大量细节纹理,建议统一转成 PNG。

3.2 核心参数逐项拆解:读懂训练脚本在做什么

以 kohya_ss 训练 LoRA 的常用参数为例,逐个拆解一下:

accelerate launch --num_cpu_threads_per_process 4 train_network.py \ --pretrained_model_name_or_path="./model/sd_v1.5_pruned.safetensors" \ --train_data_dir="./dataset" \ --output_dir="./output" \ --output_name="my_first_lora" \ --resolution=512 \ --train_batch_size=1 \ --learning_rate=1e-4 \ --lr_scheduler="cosine" \ --max_train_steps=2000 \ --network_module=networks.lora \ --network_dim=32 \ --network_alpha=16 \ --mixed_precision="fp16" \ --save_every_n_epochs=1 \ --save_model_as=safetensors

逐个解释重点:

  • --resolution:训练分辨率,SD 1.5 底模建议 512。如果你素材里很多是 1024 的图,直接缩到 512 会丢失细节,但强行在 1024 分辨率下训练会大幅增加显存和时间。折中方案是先在 512 下练,跑通流程后再考虑 768。
  • --learning_rate:学习率,控制模型每次更新参数的幅度。LoRA 常用的区间是 1e-4 到 5e-5。学习率太高,模型学得快但容易过拟合,出图脸崩、细节糊;学习率太低,训练半天还没学到东西。
  • --lr_scheduler:学习率调度器,常见的有 constant、cosine、linear。我用 cosine 比较多,它会在训练前半段保持较高学习率快速逼近最优区域,后半段逐渐降下来精细收敛。
  • --max_train_steps:最大训练步数。步数太少欠拟合,触发词效果不明显;步数太多过拟合,出图全是训练图的影子。具体步数可以这样粗算:训练集 30 张图,重复 5 次,batch size 1,跑 10 个 epoch,总步数就是 30×5×10=1500 步,但实际步数通常还要看验证集的 loss 变化来决定。更稳的方法是“宁少勿多”,先练一个偏短步数,出图看看效果,不够再继续训练或加步数重练。
  • --network_dim和--network_alpha:LoRA 的维度和 alpha 值,这两个参数决定 LoRA 模型的表达能力。dim 越大,能学的细节越多,但文件体积也越大,过拟合风险越高;alpha 可以理解为控制 LoRA 权重的缩放比例,一般取 dim 的一半或等于 dim,效果比较好。角色 LoRA 常用 dim=32 或 64,风格类可以到 128,但除非你素材量非常大,否则不建议一上来就拉满 dim。

这些参数不是拍脑袋定的,背后有一套逻辑:学习率控制“每次迈多大步子”,训练步数控制“一共走多少步”,dim 控制“能装下多少东西”,数据集重复次数控制“每一步对同样素材强化几遍”。你只要把这几个维度想清楚了,调参就有方向了。

3.3 训练过程实录:从启动到出炉

环境、数据集、参数都就绪后,就可以启动训练了。

启动后要盯几样东西:

第一,显存占用。如果启动后直接报 CUDA out of memory,把 batch size 降为 1,或者把 mixed_precision 改成 fp16,再不行就把分辨率降到 512 或 448。

第二,loss(损失值)的变化。loss 不是越低越好,而是要看是否在合理区间内波动。LoRA 训练中 loss 一般在 0.1 到 0.3 之间波动,如果一路狂降到 0.03 以下,十有八九是过拟合了;如果始终在 0.5 以上降不下来,可能是数据标签和图片内容不匹配,或者学习率设置有问题。

第三,保存的中间模型。一般每个 epoch 保存一个 safetensors 文件,不要等到全部训练完再测。建议每跑完第 3、5、8 个 epoch 都抽一次模型文件去 WebUI 里出图测试,观察触发词效果的变化曲线,找出最顺眼的那个检查点。这一步很多人会跳过,等到全部训练完才去测,结果发现中间某个 epoch 的效果其实更好,又要重练,浪费时间。

训练结束后,你会得到一系列模型文件。按我经验,效果最好的往往不是最后一个 epoch,而是倒数第二个或中间某一个,这是因为训练后期的过拟合会让模型失去泛化能力。所以保存中间检查点不是给硬盘添堵,而是给自己留后路。

4. 让丹更纯:参数细节与优化技巧

4.1 过拟合与欠拟合的平衡术

炼丹中最常遇到的两个问题:过拟合和欠拟合。它们是一对相反的病症,但很多人分不清,或者知道概念但不知道怎么调。

过拟合的表现:模型出图时,无论你怎么写提示词,画面的构图、表情、姿势始终和训练集中的某几张图很相似,甚至直接“复刻”训练图。说明模型把训练图的细节背下来了,丧失了泛化能力。

欠拟合的表现:加了触发词之后,画面的角色特征不明显,换一个描述词就完全认不出角色,说明模型还没学到核心特征。

常见的调参策略:

  • 过拟合就往“更正则化”的方向调:降低学习率、减少训练步数、减小 network_dim、增加数据多样性、提高标签的细致程度。
  • 欠拟合就往“更强表达”的方向调:增大学习率、增加步数、增加重复次数、增大 network_dim、精简标签突出核心特征。

我常用的一种平衡方式是:先用默认参数跑一炉,选取中间 checkpoints 对比,如果第 5 个 epoch 效果最好而第 10 个 epoch 开始过拟合,那么下一炉就把最大步数砍半,并把学习率降低一点,避免后期冲过头。

4.2 数据集设计的隐形技巧:重复次数与正则化图片

很多人练 LoRA 时忽视了一个细节:数据集的重复次数不仅影响训练步数,还影响模型对风格的偏好。

假设你只练一个角色,全部 30 张图都重复 5 次,那么模型在训练过程中会反复强化这些图片的风格,包括背景、光线、色调、构图。这会让最终的 LoRA 在出图时带有很强的“训练集风格”,如果你希望 LoRA 能适配多种风格,这种强一致反而不是好事。

解决方法是分组设置重复次数。比如把角色特征图片分成两组:核心特征图重复 5 次,风格多样性图片重复 2 次,让模型对核心特征学得更牢,对风格学得更松。

另外一个容易被忽视的细节是正则化图片。在 Dreambooth 训练中更常见,但 LoRA 里也有人用。所谓正则化图片,就是同一类别的通用图片,比如训练一个特定角色时,同时喂一些不包含该角色、但画风相似的通用人物图片,训练标签对应设置为“人”等通用描述。正则化图片能帮模型区分“这个角色的特征”和“一般人的特征”,显著抑制过拟合。LoRA 训练中也可以这么做,但对素材要求比较高,所以我一般只在遇到严重过拟合时才会启用。

4.3 LoRA 与底模的配合:权重、分层与混合使用

模型出炉之后,不是直接扔到 WebUI 里就万事大吉了,如果想让出图效果更稳,还需要理解 LoRA 在 WebUI 里的使用逻辑。

关键是权重。在 WebUI 的 LoRA 面板里,可以看到一个滑块,默认权重是 1。权重太大,画面容易出现塑料感、过曝、特征过度夸张;权重太小,角色特征不突出。我的经验是:角色类 LoRA 通常 0.7~1.0 之间效果较好,风格类 LoRA 通常 0.6~0.9 之间比较合适。不要贪心,不是把权重拉到 1.5 就一定会更好,很多情况下权重越高,画面越崩。

另一个使用技巧是分层控制。kohya_ss 训练出来的 LoRA 包含多个层级模块,有些层管构图、有些层管细节纹理、有些层管颜色。高级用户可以在 WebUI 里用额外的扩展工具单独调节每个层的权重,比如把控制结构的层级调低一点、把控制细节的层级调高一点,从而实现对出图效果更精细的控制。

多 LoRA 混合使用也值得单独说。如果你练了一个角色 LoRA 和一个某位插画师的风格 LoRA,理论上可以在同一张图上同时启用。但这两个 LoRA 之间可能互相打架,尤其是当风格 LoRA 很强时,会把角色 LoRA 的脸型特征也带偏。解决措施是把角色 LoRA 权重适当提高、风格 LoRA 权重适当降低,先按 0.9 和 0.6 试一张,再逐步微调。

4.4 批量实验:一次多炉,参数矩阵跑起来

单独调参试错效率很低,我后来养成了一个习惯:每次改动参数时,不是只跑一炉,而是跑一个参数矩阵。

举例来说,我确定了学习率、步数、dim 这三个最关键的变量后,会这样安排:

  • 第一炉:learning_rate=1e-4,max_train_steps=1500,dim=32
  • 第二炉:learning_rate=5e-5,max_train_steps=1500,dim=32
  • 第三炉:learning_rate=1e-4,max_train_steps=3000,dim=64

三炉并行跑(前提是你的显存和显存资源顶得住),出炉后统一对比,哪个方向好,下一轮再围绕那个方向缩小区间。

用表格列一下判断标准:

现象可能原因建议调整
人脸不够像,特征模糊欠拟合增大步数到 1.3~1.5 倍,或提高学习率
出图总是同一表情/同一角度过拟合减少步数,降低重复次数,增加素材多样性
加了触发词但效果不明显触发词太杂/标签混乱统一触发词,清理无关标签,增加核心特征标签
背景和风格总是和训练集一致数据集风格太单一增加训练集风格多样性,或设置分组重复次数
出图出现色彩断层/画质劣化权重过高在 WebUI 中降低 LoRA 权重到 0.6~0.8
训练到一半提示 OOM显存不足降低 batch size、分辨率或开启低显存模式

5. 常见问题与排查技巧实录

5.1 训练环境报错:Conda 环境和依赖冲突

先聊一个最常见也最让人崩溃的问题:好不容易把训练脚本的依赖装好,run 起来直接报错,比如缺失某个模块、torch 版本不匹配、CUDA 不可用。

这类问题九成出在环境配置上。平时跑 WebUI 可能很顺畅,但训练脚本对 PyTorch 的 CUDA 版本极敏感。排查思路按以下顺序走:

  • 先确认 PyTorch 能调用 GPU:在 Python 里执行import torch; print(torch.cuda.is_available()),如果返回 False,说明 PyTorch 装了 CPU 版本或 CUDA 版本不对。
  • 再看 CUDA 版本:执行nvidia-smi,确认驱动支持的 CUDA 版本,再核对 PyTorch 的编译版本是否匹配。
  • 最后用官方仓库的环境配置文件重建环境,不要自己一个个手动装依赖,整合包里的 requirements.txt 往往是最稳的。

如果只是个小依赖缺失,也可以用pip install 包名直接补上,但要注意不要随意升级已经装好的 torch,不然可能引发连锁反应。

5.2 训练图片总是崩坏:VAE 和底模的选择问题

出图时脸崩、手崩,这是 SD 生态里最经典的问题。很多人第一时间怪 LoRA,其实问题也可能出在底模和 VAE 上。

SD 1.5 底模有原版模型和各个社区微调版本,不同底模对 LoRA 的兼容性差异不小。如果某个底模让你的 LoRA 出图效果奇差,换一个底模可能就好了。我自己常用的建议是:练 LoRA 时用原版 SD 1.5 的 pruned 模型作为底模,测试时可以用同一底模,也可以换别的底模看看兼容性,但如果要稳定评估 LoRA 本身的训练效果,最好固定一个底模来测试,控制变量。

VAE 影响的主要是画面色彩和细节纹理。某些底模自带 VAE,某些需要手动加载。如果出图色彩发灰、细节有噪点,优先检查一下 VAE 是否正确加载。训练脚本中也可以指定 VAE 路径,如果训练时没有 VAE 参与,模型对色彩纹理的学习会有偏差。

5.3 模型文件损坏或加载失败:路径与格式雷区

训练完成后,把 safetensors 文件放进 WebUI 的 models/Lora 目录,按理说就能直接用了。但偶尔会遇到模型列表不显示、加载报错等情况。

排查顺序:

  • 确认扩展名是 .safetensors,不是 .ckpt 也不是 .pt。LoRA 用 safetensors 格式最稳,体积小、加载快、更安全。
  • 确认文件名没有中文和特殊符号,否则 WebUI 里的模型列表可能显示乱码或无法识别。
  • 确认 LoRA 是存放在正确的目录下。不同 WebUI 版本对目录路径有差异,以你自己的启动日志为准。
  • 如果你在训练时保存的是中间检查点格式,需要确认脚本输出的是最终合并权重还是原始权重,有些脚本默认保存的是优化器状态和权重混合文件,直接拿去 WebUI 用不了。

有一次我在训练时把--save_model_as设成了 ckpt 格式,结果模型文件加载后 LoRA 面板显示一堆乱码,排查了很久才发现是格式问题,换成 safetensors 保存之后一切正常。这类低级错误其实很常见,写训练命令前把保存格式确认一遍,能省下很多无谓的时间。

5.4 训练速度慢:优化器、精度与线程的取舍

很多人在论坛上问:为什么我训练 1500 步要跑两小时?别人半小时就搞定了。

速度差异主要来自几个方面:GPU 性能自不必说,另外还有优化器选择、混合精度、CPU 线程数。

优化器方面,LoRA 训练常用 AdamW 或 8bit AdamW。8bit 优化器显存占用低,但速度不一定更快,要看具体实现。如果你显存充足,直接标准 AdamW 可能还更快一些。

混合精度方面,fp16 是常规选择,配合加速框架能让显存占用更低、速度更快。如果你的 GPU 支持 bf16,也可以尝试,但不同 GPU 上表现差异很大,需要实测。

CPU 线程数方面,数据加载和预处理依赖 CPU,如果 CPU 线程数设置太少,GPU 会在每个 step 之间等待数据,白白浪费时间。我一般把--num_cpu_threads_per_process设为 4 或 8,太高反而可能因为数据加载顺序调度开销增大而变慢。

如果训练速度仍然很慢,还有一个隐形瓶颈:数据集目录在机械硬盘上。图片读取慢会拖累训练,把数据集放到固态硬盘上能显著改善。

5.5 查错工具:日志分析三件套

训练脚本输出的日志里,藏着很多排查线索,但新手往往不习惯看日志。我总结了一个“查错三件套”,基本能覆盖 90% 的异常情况。

第一,启动阶段日志。关注模型加载路径是否正确、设备是否识别为 GPU、数据集的图片数量和分类是否正确加载。

第二,训练循环日志。关注 loss 值、学习率、step 速度。如果某个 step 开始出现 loss 突然暴涨,可能是数据加载出了异常,比如某张图片损坏导致读取错误。

第三,保存阶段日志。确认每个 epoch 结束后模型文件是否正常保存,文件名是否按预期生成。如果保存文件大小异常小,大概率是保存路径写错、或者模型文件被其他进程占用。

这三块内容结合起来,你基本能定位到是数据问题、参数问题还是环境问题。

写在最后的一点体会

我最初炼丹时也犯过很多低级错误:素材没整理直接开练、标签懒得清洗、参数照着别人的配置抄但没理解含义,结果就是反复炸炉。后来慢慢养成一个习惯:每次炼丹前先写一个简短的实验记录,写明素材数量、标签策略、参数配置、预期效果,再开始训练。出炉后拿记录对照实际效果,哪些参数有效、哪些调整无效,一目了然。这个方法让我在后面几炉的成功率提高了很多。

另外一个小建议:不要一上来就追求复杂玩法,先把最简单的角色 LoRA 练通一遍,理解训练、测试、调整的完整闭环,再去碰风格混合、多 LoRA 融合、Dreambooth 这类进阶技术。基础流程走通了,后面再遇到问题,你心里也会有个大致的排查方向。

炼丹不是玄学,它是一门需要细心和耐心的手艺活。素材、标签、参数、测试,每个环节都有规律可循,工具给你搭好了台子,但成丹好坏最终还是看操作者的功夫。希望这篇总结能帮你少走些弯路,练出自己满意的模型。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询