🧠 第七章 绘画模型训练:创意生成与视觉设计
📄 一句话概括

写一份 train.toml,12 项检查里 6 项不对:硬错 2 项(分辨率 520 不能被 64 整除、 数据集目录是空的)会当场报错; 另外 4 项训练器一句不吭——保存间隔 20 大于总轮数 10、学习率 0.02、alpha 16 大于 dim 8、 VAE 没填。

📝 本节和前面几节的关系

上一节把图和标签都备齐了。 这一节把它们和底模的路径填进配置,并且用脚本把配置过一遍——因为训练器只检查「能不能跑」。

一、训练配置就四段

不管界面长什么样,底下的配置文件就四个段:

段 管什么 关键字段
model 底模与 VAE pretrained、vae
dataset 图与输入 img_dir、resolution、batch_size、num_repeats
training 训练过程 learning_rate、epochs、save_every_n_epochs
network LoRA 本体 network_dim、network_alpha
为什么写成文件,而不是在界面上点:文件能进 Git、能复制、能对比、能被脚本校验。
界面上点的参数,你下周就记不清上次用的是哪一版。
📋 实操清单:训练器界面上每个输入框,都能在配置文件里找到对应字段。
先照着界面点一遍,然后把生成的配置存下来,以后就用这份当模板改。
路径有两条硬规矩:别带中文、别带空格。Python 里 \ 是转义符,Windows 路径要么写正斜杠 /,
要么写双反斜杠。这是「文件明明在,却说找不到」的第一大原因。

二、12 项检查,6 项不过

Demo 拿一份故意写错的配置过了一遍,不通过的六项和它们的后果:

不通过的项 值 后果
数据集里有图 0 个 当场报错:没有训练数据
分辨率能被 64 整除 520 当场报错:除 64 余 8
VAE 路径 空 退回底模自带,某些底模会偏灰
学习率量级 0.02 训崩,样图第 3 轮开始花
保存间隔 ≤ 总轮数 20 对 10 跑完一个权重文件都不存
network_alpha ≤ dim 16 对 8 等效缩放 2 倍,等于偷偷加学习率
前两项是硬错,训练器会当场停下来,你能立刻发现。后四项不报错——这才是这一节真正要说的事。

三、四项不报错的,才是最贵的

① 保存间隔大于总轮数。 这一项最阴:训练能完整跑完、日志一行不红, 但一个权重文件都不会保存。你盯了两个小时,最后什么都没有。 检查方法:save_every_n_epochs 必须小于等于 epochs,最好能整除。 ② 学习率 0.02。 SD 训练常用 1e-4 量级,0.02 大了两百倍。 它不会报错,只会把模型训崩——表现是「第 3 轮开始出的样图全花了」。 这类错只能靠人看样图发现,所以训练时一定要开样图输出。 ③ alpha 大于 dim。 LoRA 的实际缩放是 alpha / dim,alpha=16、 dim=8 时等于把改动量乘了 2 倍——相当于你设的学习率被悄悄放大了一倍。规矩很简单: alpha 等于 dim,或者等于 dim 的一半。 ④ VAE 没填。 大多数底模自带 VAE,不填也能跑。 但有些社区底模的 VAE 有偏色问题,不显式指定就会训出灰调、发白的图。表现是「样图颜色不对」, 很容易被误认为「数据集有问题」。

四、把配置当代码管

三条纪律。 第一,配置文件进版本管理,文件名带上日期和关键参数(lora_20261025_r8_lr1e-4.toml), 这样「上次那个效果不错的版本」是可回溯的。 第二,每次开训前跑一遍校验。 十二项检查、二十行代码、一秒跑完, 比训废一轮便宜太多。 校验脚本应该和配置放在一起。 第三,留下三样东西:配置文件、启动命令、样图。只留权重文件是不够的—— 没有配置,你复现不出这个权重。 最后一句提醒:界面上的「开始训练」按钮, 它检查的是「参数格式对不对」,不是「参数值合不合理」。这两件事之间的差距, 就是这一节的四类事故。

五、动手 Demo:配置校验:12 项里 6 项不对,其中 4 项训练器不报错

用 tomllib 造一份带六处错误的 train.toml(分辨率 520、学习率 0.02、保存间隔大于总轮数、 alpha 大于 dim、VAE 路径不存在、数据集目录为空),解析后跑 12 项检查, 标出哪些是「会当场报错」的硬错,哪些是「训练器不会报」的隐性错。

with open(p, "rb") as f:
    c = tomllib.load(f)                 # 标准库直接读 toml

def chk(name, ok, msg, hard):
    rows.append([name, u"通过" if ok else u"不对", msg])
    if not ok:
        probs.append((name, hard))      # hard=True 表示会当场报错

res = c["dataset"]["resolution"]
chk(u"分辨率能被 64 整除", res % 64 == 0,
    u"%d 除 64 余 %d" % (res, res % 64), True)
chk(u"保存间隔 ≤ 总轮数",
    c["training"]["save_every_n_epochs"] <= c["training"]["epochs"],
    u"%d 对 %d" % (20, 10), False)     # False:训练器不报

实跑输出:

--------------------------------------------------------------------
配置校验:12 项里 6 项不对,其中 4 项训练器不报错
--------------------------------------------------------------------
  配置文件                 train.toml,21 行
  解析出几段               4 段(model/dataset/training/network)

  检查项                结果   说明
  ----------------------------------------------------------------
  底模路径              通过   存在
  VAE 路径              不对   没填 VAE,会退回底模自带
  数据集目录            通过   目录在
  分辨率能被 64 整除    不对   520 除 64 余 8
  batch × 重复数        通过   2 × 10 = 20
  学习率量级            不对   0.020,SD 训练常用 1e-4 量级
  保存间隔 ≤ 总轮数     不对   20 对 10,永远存不下来
  输出目录父级存在      通过   在
  混合精度取值          通过   bf16
  network_alpha ≤ dim   不对   alpha 16 大于 dim 8,等效缩放 2.0 倍
  数据集里有图          不对   0 个文件
  总步数估算            通过   100 步

  **12 项里有 6 项不过。** 其中硬错 2 项(分辨率不合法、数据集目录是空的),
  这些会让训练器当场报错。**剩下的 4 项它不会报。**
  「保存间隔 20 > 总轮数 10」最阴:
  **训练能跑完,但一个权重文件都不会保存。**你盯着日志等半天,最后什么都没有。
  「学习率 0.02」也不会报错——它会把模型训崩,表现为「第 3 轮开始出的样图全花了」。
  **这类错只能靠人看样图发现。**
  「alpha 16 大于 dim 8」同样不报错:等效缩放 = 16/8 = 2 倍,**学习率相当于被悄悄放大了一倍。**
  所以配置要写成文件、用脚本校验,而不是在界面上点。
  **界面只检查「能不能跑」,不检查「跑出来对不对」。**

12 项里 6 项不过,其中只有 2 项是硬的:分辨率不能被 64 整除、数据集目录里一个文件都没有。 这两项训练器会当场停下来。 剩下 4 项它一句不吭。 我特意在代码里用一个 hard 参数把它们分开—— 这个参数不是给训练器看的,是给人看的:它告诉你「哪几项要你自己盯」。 「保存间隔 20 对 10」那份配置最值得琢磨:训练会完整跑完,日志全绿,然后 output 目录是空的。 这是唯一一种「花了全部时间、产出为零」的错。 「alpha 16 大于 dim 8」那条的说明写的是「等效缩放 2.0 倍」——注意这不是一个绝对值错误, 而是「学习率被放大了一倍」。所以它和「学习率 0.02」会叠乘:0.02 再乘 2 倍,就是 0.04。 最后一句是这个 Demo 的结论: 界面只检查「能不能跑」,不检查「跑出来对不对」。所以配置必须能被脚本校验—— 这就是为什么要用 toml 而不是点按钮。

30 秒实验

  1. 把 save_every_n_epochs 从 20 改成 5,重跑,看「不过」从 6 项降到 5 项。 只有这一项变了——说明检查项之间是独立的。
  2. 把 resolution 从 520 改成 512,看硬错从 2 项降到 1 项。 「数据集里有图」还是错的——那个得真放一张图进去。
  3. 往 img 目录里放一个文件再跑,看最后一项说明变成什么。 它会变成「1 个文件」并通过——但一个文件是训不出东西的,检查项抓不到这种事。

常见误区

  1. 「界面能跑起来就没问题」。界面只查参数格式,不查参数值合不合理。四类事故全在这个缝隙里。
  2. 「保存间隔随便填」。大于总轮数就一个文件都不存,而且不报错——花了全部时间,产出为零。
  3. 「alpha 和 dim 填一样大就行」。填大了等于放大学习率,会和你设的学习率叠乘。
自测三问(点开对答案) 1. 训练配置有哪四段? —— model(底模与 VAE)、dataset(图与输入)、training(训练过程)、network(LoRA 本体)。 2. 哪一种配置错会导致「训练跑完但没有文件」? —— 保存间隔大于总轮数。它不报错,训练会完整跑完,只是永远到不了保存点。 3. 为什么配置要写成文件而不是在界面上点? —— 文件能进版本管理、能复制对比、能被脚本校验。界面上点的参数事后查不回来。

配置通了就能开训。这一章还剩两节:训完的产物是什么、怎么部署,以及出图时那几个参数到底怎么调。

相关笔记