每一张照片里,都藏着一段温暖的回忆。训练一个专属的 LoRA,让她出现在任何一张照片里,都还是那个她。

这次的目标很简单:给一个虚构角色训一个专属 LoRA。角色叫 Moss,银金色头发、冰灰色眼睛、英伦学院风,灵感来自马尔福。用 GPT Image 2 生成训练数据,再让 MOSS-Image 学会这个人物。最终只用了 56 张图片、一张 RTX 4090 48GB,训练约 65 分钟,第 300 步就已经能比较稳定地画出这个角色。
AI 生图已经这么强了,还需要自己训练 LoRA 吗?直接生成确实够用,但要锁定一张脸、一个产品外观、一种画风,做电商、漫画、短剧、虚拟 IP 时就得靠 LoRA。LoRA(低秩适配)冻结原模型的权重,只在部分网络层增加两个很小的低秩矩阵:W + ΔW,ΔW = B × A。只训练 B 和 A 这两个小矩阵,不用重训整个模型,训完的增量大约 150MB,可以单独保存、加载和替换。

基座选了 MOSS-Image-Base:5B 参数的 Diffusion Transformer 架构,Apache-2.0 开源协议,提供 Base 和 SFT 两个版本,这次用适合继续微调的 Base 版。
数据准备:用 GPT Image 2 给 MOSS-Image 当老师
采真实人物比较麻烦,这次先用 Claude 调用 GPT Image 生成一张满意的定妆照,再以定妆照为参考,生成不同场景的图片,尽量保持人物身份一致。这有点像蒸馏里的老师和学生,但严格说不是把 GPT Image 2 的能力蒸馏过去,而是用合成数据给开源模型做定向微调。参考图生成的人脸基本是拷贝的,会损失多样性,有条件可以用实拍图集来训练。
第一轮设计了 48 个镜头,覆盖正脸、侧脸、背影、不同服装和场景。检查下来问题不少:侧脸不听话、喜欢抬下巴、大量校园场景略显重复。于是针对缺口补拍 20 张,重点增加侧脸、背影、不同表情和便装。最终得到 68 张候选图,剔除 12 张重复的,留下 56 张:17 张全身照、4 张侧脸,44 张是校服,占了 79%。

图片备好后,还要给每张图写对应的文字描述。以前是人打标,现在可以让 Agent 直接做。这里有两个概念:触发词是人物的专属身份标识,这次用 moss01,希望模型看到这个词就认出 Moss;Caption 是训练阶段的图像描述,本质上也是一种 Prompt,包含触发词,以及图里的服装、姿势、表情、场景。这次用传统的标签式写法,方便逐张审核、统一字段,也方便检查哪些属性没描述准。比如要求侧脸、实际却画成正脸,Caption 就必须按实际图片标注,而不是照搬原来的生成提示词。

为了提高效率,还做了一个图片挑选页面,整个数据准备过程花了约 3 小时 15 分钟。用 AI 生成数据不难,难的还是人工参与,确保数据真正符合训练目标。
正式训练:一张 4090,65 分钟
数据准备完成,训练反而简单了。这次用 KohakuMossTrainer,一个支持 MOSS-Image 微调的第三方训练框架。配置如下:模型 MOSS-Image-Base,GPU RTX 4090 48GB,训练图片 56 张,LoRA Rank 32,学习率 1e-4,训练步数 1200 步,训练时间约 65 分钟。

训练过程每 150 步保存一个 Checkpoint,每 300 步生成一组固定测试图片。Checkpoint 就是模型在某个训练阶段保存的权重,可以理解成不同时间点的存档,方便训完回头比较,选出效果最好的版本。这次训到第 300 步,人物就已经能认出来了。训练 LoRA 不默认最后一个 Checkpoint 就是最好的,测一测中间的版本,找到最适合的。
验收:Loss 还不够,重点看三件事
这次训练过程中,Loss 一直在 0.4~0.65 之间来回跳,看不出明显的下降趋势。Loss 衡量的是模型在训练目标上的误差,能帮你检查训练有没有异常,但不直接代表最终图片的质量、人物一致性或提示词遵循能力。

验收图像 LoRA,Loss 还不够,重点看三件事:人物像不像、提示词听不听、有没有学到不该绑定的特征。做法是设计五组固定测试,每隔 300 步用相同的测试提示词和随机种子生成图片,这样就能把不同 Checkpoint 放在一起比较。

第 300 步,五官和整体形象已经比较一致。之前用一批以头肩肖像为主的数据训过人物 LoRA,结果训久了,模型总喜欢把全身照拉回大头照。这次训练集角度比较丰富,各种构图保持得都不错。基座模型本来就会画全身照、侧脸和各种服装,LoRA 主要负责让它学会这个新人物。
还有个意外发现:加上 LoRA,所有人都变成了 Moss。最后一列测试,提示词里没写 moss01,只写了一个普通的年轻女性,照理说应该和不加 LoRA 的原模型画得差不多。原因不难理解:有点过拟合了,没加正则数据的话触发词没啥用,Rank 太大也容易过拟合。不过没关系,LoRA 圈很多模型是这样的。配合 ComfyUI + MOSS,想用的时候才加载这个 LoRA,不想要她就不加载。验收时一定要拿原模型做对照,才看得出来。
完整开源,亲手跑一次
整个流程已经整理到了 GitHub,准备了运行环境镜像、Jupyter Notebook 和 ComfyUI 工作流。Notebook 可以理解成一本能直接运行代码的交互式教程,每一步都有说明和对应的代码,运行一格、查看结果,再继续下一格。整个流程已经按顺序拆开:检查 GPU 环境、准备图片、整理 Caption、下载模型、缓存数据、启动训练、比较 Checkpoint,最后导出 LoRA,生成自己的角色图片。Notebook 里边训练边看:进度、Loss 曲线和最新一轮测试图都直接显示在格子下面。
没有 GPU 但想复现,可以注册复制镜像,里面已经有所有的环境和数据集,一键开始训练。这次用的实例是 48G RTX 40 系 ×1,按量 3.80 元/小时,点右上角的 JupyterLab 就能打开 Notebook。按照 Notebook 一步一步运行,里面设置了一个 60 步的训练,30 分钟能跑完。跑完后体验一下预装的 ComfyUI + LoRA。训练完成记得关机,别让 GPU 一直计费,新用户可以免费用 1-2 小时,做一次训练是足够的。
仓库、复现镜像与在线体验:
GitHub:limin112/Lora
一键复现镜像(Compshare)
MOSS 在线体验
最后给想学习的朋友一个建议:现在大家都习惯用 Agent,完全可以把文章或者整个 GitHub 仓库丢给 Claude Code、Codex,让 AI 帮你部署运行。但第一次尽量亲手跑一遍 Notebook,不用从零写代码,也不用背下所有训练参数,只需要运行一格,看看输出,想一想这一步为什么存在,再继续下一格。为什么需要 Caption?为什么要缓存数据?为什么保存 Checkpoint?为什么训练完成还要验收?这些问题,亲自跑一次,比单纯看教程更容易理解。跑完一遍,学到的不只是怎么训练这一个角色,而是整个图像 LoRA 从数据准备、训练到验收的方法。以后不管换成人物、产品还是特定画风,都知道应该从哪里开始。等真正理解了,再把全部流程交给 Agent 自动完成也不迟。