在单块 GPU 上从头训练 2.1 亿参数文生图模型:哪些因素真正起作用

0 阅读

数据在训练开始前就决定了结果

作者早期尝试使用百万级网络爬取图片配合重写标题训练模型,结果比仅用 COCO 数据集还差——图片质量参差不齐,标题与内容严重不符。这次他采取了更笨但有效的方法:从每个候选数据集中随机抽取二十张图片,在 256×256 分辨率下肉眼检查,再决定是否采用。

最终训练数据由三部分组成:60% 来自 Pexels 的高质量免版税照片(280 万张),25% 是 FLUX-Reason-6M 中经过美学评分筛选的子集(120 万张),剩下 15% 为 COCO 2017 训练集(11.8 万张)。每张图配有长短两个版本的标题,训练时 50% 概率用长标题(最多 128 个 T5 token),40% 用短标题,10% 使用空标题以支持分类器自由引导(CFG)。纯长标题会削弱对简短提示的响应能力,而只有短标题则影响画面构图。

特别值得注意的是图片裁剪策略。传统做法常将图片中心裁成正方形,但这会丢弃 94% 的 COCO 图片和 99% 的 Pexels 图片——因为真实摄影多为 4:3 或 3:2 画幅。tinydit 改用五种宽高比桶(256×256、288×224、224×288、320×208、208×320),每批数据只从一个桶中采样,且不做中心裁剪,仅做轻微缩放(长边最多裁掉 3–5%)。配合二维旋转位置编码(2D RoPE),模型甚至能泛化到从未见过的 448×256 画幅。

架构采用当前主流方案并加入寄存器

tinydit 的 Transformer 并非原创设计,而是复现了当前主流文生图模型的标准结构:基于 DiT(Diffusion Transformer),通过交叉注意力接入文本特征(类似 PixArt 和 SANA,不同于 FLUX 和 SD3 的联合注意力),配备 2D RoPE、QK 归一化、SwiGLU 前馈网络,以及 adaLN-single 调制机制。后者用一个共享调制网络加小型每层参数表替代传统的全连接层,节省了 27% 的参数量,省下的空间用于增加深度——最终模型宽度 896,16 层,14 个注意力头,总计 2.1 亿参数。

唯一新增的是“寄存器”(registers)机制,源自《Vision Transformers Need Registers》等近期研究。从第 3 层开始,16 个可学习的寄存器 token 被插入图像序列,并在输出前移除;同时每个交叉注意力层额外引入两个可学习的“空”键值槽(null key/value slots)。这些设计为模型提供了存放全局状态和“无目标注意力”的专用位置,避免其滥用图像中的某个随机 patch 或文本编码器的结束符(EOS)来承担此功能。

Same six prompts and seeds at every checkpoint of the run

实测效果显著:在中等噪声水平的中间层,约 90% 的交叉注意力权重流向这两个空槽,而原本被当作“垃圾桶”的 EOS token 仅占 4%。寄存器向量的范数在中间层达到图像 token 的 4–13 倍,符合“暂存空间”的特征;每个图像 patch 也会将 8–18% 的自注意力分配给寄存器。

Held-out metrics every 10k steps

训练配方:时间步偏移、两项辅助损失与编译加速

Objects and animals

时间步偏移(timestep shift)设为 2.8。tinydit 基于 rectified flow 框架,预测从噪声到图像的速度向量,时间步按对数正态分布采样(同 SD3)。由于使用 FLUX.2 自编码器生成的潜变量有 32 通道(远多于 Stable Diffusion 的 4 通道),图像在更高噪声水平下仍可辨识。为让模型在高噪声区域获得足够训练,需人为增加噪声强度。设置偏移后,一半训练样本的噪声比例超过 74%,且 20 步采样中有 15 步落在该区域——这正是画面布局形成的关键阶段。

How one image is sampled

两项辅助损失:一是速度方向的余弦损失(来自 LightningDiT),因为在高噪声下均方误差(MSE)主要受向量模长影响,而方向才决定最终图像内容;二是第 5 层特征的离散损失(dispersive loss,Wang & He, 2025),通过拉大不同样本内部表征的距离防止特征坍缩,且无需额外编码器,几乎零开销。

Where it fails

全程启用 torch.compile。很多人以为编译只用于推理,其实它对训练同样有效:Dynamo 跟踪前向计算,AOTAutograd 自动生成反向传播,Inductor 则融合矩阵乘法周围的逐元素操作。实测训练速度提升 2.4 倍,显存占用减半。唯一限制是要求静态形状,因此五个宽高比桶各自编译独立计算图。

其余配置包括:AdamW 优化器(学习率 2e-4,betas (0.9, 0.95)),bf16 自动混合精度配合 fp32 主权重,权重指数移动平均(EMA,衰减率 0.9999,对应约 1 万步窗口),批量大小 256,学习率在最后四分之一训练步数线性衰减至零。最终每步耗时 0.76 秒,40 万步训练在 3.5 天内完成。

损失值不是质量信号

整个训练过程中,flow-matching 损失仅从 0.805 缓慢降至 0.754,但生成图像却从模糊色块进化为清晰照片。原因在于:对于给定的带噪输入,存在多个合理的“干净图像+噪声”组合,模型最优预测只能是它们的平均值,而围绕该平均值的方差构成了无法消除的“不可约误差”。在高噪声区域(占训练一半),这部分误差占主导,导致损失值变化微弱。

因此损失值仅能反映训练是否正常(训练集与验证集损失始终在小数点后三位一致,证明未发生过拟合),却无法衡量生成质量。作者每 1 万步在固定验证提示集上评估多项指标:FID、FD-DINOv2(基于 DINOv2 特征的 Fréchet 距离)、COCO 80 类物体检测准确率(用预训练检测器验证“一张 {类别} 的照片”是否包含目标物体),以及人类偏好模型 PickScore 和 HPSv2.1 的得分。

结果显示:FID 和物体准确率在 30 万步左右趋于饱和,而 FD-DINOv2 和偏好得分持续提升至训练结束。最后 10 万步的学习率衰减使 FD-DINOv2 进一步提升 5%。

步数 FID FD-DINOv2 物体准确率 PickScore HPSv2.1
1万 33.7 570 65% 19.5 0.199
10万 28.1 274 88% 20.6 0.238
40万 27.0 218 90% 20.9 0.254

模型能力与局限

tinydit 能稳定生成单个物体、动物、场景、颜色及简单空间关系(如“左边的猫,右边的狗”),且在全部五种宽高比下表现一致。对于训练风格的长提示,也能遵循主句描述。

但以下任务仍是明显短板:

  • 可读文字(如招牌、书本内容)
  • 近距离人脸细节
  • 人群(三人以上)
  • 精确计数(超过三个物体)
  • 钟表指针位置
  • 多层堆叠几何体(如积木塔)

这些正是 2.1 亿参数模型在 256 分辨率下的天然边界,也将成为下一阶段强化学习的重点优化目标。

关于采样步数,作者发现 20 步已足够:模型自身对最终图像的预测显示,画面布局在前三步就已确定,后续步骤仅用于细节锐化。在 2456 个验证提示上测试,50 步相比 20 步仅带来 0.4 的 FID 提升,且对偏好得分毫无帮助;而若移除训练时的时间步偏移,即使加倍采样步数也无法弥补性能损失。

给后来者的五条建议

  1. 先看数据:在训练分辨率下肉眼检查每个候选数据集的真实样本,这比任何架构选择都重要。
  2. 匹配潜变量的时间步分布:32 通道潜变量需要约 2.8 的时间步偏移,否则模型会在布局形成的关键区域欠训练。
  3. 从第一步就用宽高比桶:放弃“先正方形预热再扩展”的习惯,直接保留原始构图,因为标题描述的往往是被裁掉的边缘内容。
  4. 别信损失值:选定两三个可每小时计算的指标(如 FID、物体准确率),并固定验证提示集以保证可比性。
  5. 编译训练过程:这是你能获得的最便宜的 2 倍加速。

目前 tinydit 故意未做蒸馏,也未使用高级 CFG 变体,因为下一步计划是基于 Flow-GRPO 的强化学习,直接用上述偏好模型作为奖励信号,针对性改进失败案例。相关成果将作为同一仓库的第二版发布。

项目代码、权重、在线 Demo 及更新均已在 Hugging Face 和 GitHub 开源。