经过8小时的漫长等待,训练终于完成。

在DGX Spark(基于ARM)上进行FLUX 1-dev 12B模型的微调,90W的低功耗所产生的结果如何呢?

今天我将比较分析250、500、750、1000步生成的LoRA适配器,并分享我发现的‘学习的蜜点(Honey Spot)’


1. 测试环境及条件



  • 基础模型: FLUX 1-dev (12B)

  • 数据集: 40张人像实拍图片 (1024x1024)

  • 采样器: dpmpp_2m, euler

  • 硬件: DGX Spark (120GB统一内存)

  • LoRA检查点: 250,500,750,1000步

2. 步骤结果比较 (The Battle of Steps)

生成了包含训练人物的实拍图像,测试其一致性。

🥉 Step 250: "你...是谁?" (Underfitting)

  • 结果: 学习目标和气氛相似,但如果问“是同一个人吗?”,会稍微感到疑惑。五官的微妙细节不足。

  • 速度: 生成速度最快(少于100秒),但不符合期望的质量。

  • 诊断: 不足拟合 (Underfitting). 模型尚未充分吸收数据的特征。

🥈 Step 500: "哦!是你啊!" (Good Fit)

  • 结果: 无论是谁都能辨认出这个人。终于感受到LoRA有效运作的感觉。

  • 特异点: 偶尔表情变化可能会让人看起来像其他人,但总体上保持了良好的一致性。

  • 诊断: 进入适量学习区间。 基于40张数据,从这一点开始似乎可以实用。

🥇 Step 750: "稳定之美" (Stable)

  • 结果: 与500步相比差异不大,但感觉更稳定。在各种姿势中,个人特征得到了很好的保持。

  • 诊断: 与500步延续,形容为‘成熟’的感觉。

🏅 Step 1000: "完美但...太完美反而有问题" (Overfitting Risk)

  • 结果: 一致性100%。即使进行盲测,辨别与原版几乎无差别。

  • 问题: 请求不在学习数据中的‘愤怒表情’,‘性感表情’等会导致人物一致性破裂的现象。

  • 诊断: 已接近过拟合 (Overfitting) 的边界。 模型对学习数据(“这个人的这个表情”)记忆过于牢固,开始丧失应用能力 (Generalization)。

3. 技术神秘与分析



在测试过程中发现了两个有趣(或说令人尴尬)的技术问题。

1) LoRA文件竟然有5GB?

生成的4个LoRA文件大小均为5GB。通常LoRA适配器的正常大小应为几十MB到几百MB。

分析:

起初怀疑是“优化器状态或文本编码器全部存储在一起了?”
然而,FLUX 12B规模和rank 256 LoRA加到每一层后,LoRA本身的参数量可以变得几GB。
换句话说,基于SD1.5的标准,不应将“LoRA是几十~几百MB”的感觉直接套用,
而是在大模型中,LoRA的rank与适用范围直接关系到容量。
下次将尝试将network_dim降低到64~128,以重新平衡容量与性能。

2) 生成速度下降 (97~130秒)

应用LoRA后生成时间变长。

分析:

  1. 结构原因: LoRA通过在基本权重($W$)上添加学习到的权重($B \times A$)来进行计算,因此计算量增加。

  2. 瓶颈现象: 学习脚本设计上,T5XXL文本编码器是进行缓存后推给CPU的结构,因此,
    在推理管道中,也可能存在CPU↔GPU的回传。

这部分目前尚未在代码级别彻底确认,所以下次实验将:

  1. 在TE完全强制分配到CUDA时
  2. 改变缓存策略时,
    比较生成速度和质量的变化。

4. 结论:寻找‘蜜点(Honey Spot)’

通过这次8小时的旅程,我得出的结论很明确:“并不是学习越多就越好。”

  1. 最佳区间: 基于40张数据集,400~600步之间是‘性价比’与‘质量’都能兼顾的蜜点。1000步不仅浪费时间,还可能损害灵活性。

  2. 数据的重要性: 仅学习特定表情就会成为只能做那个表情的‘表情机器人’。在构建数据集时,涵盖多种角度和表情的重要性远超过增加步数。

  3. DGX Spark的潜力: 尽管花了8小时并且遇到了一些设置问题,但能以90W电力成功微调12B模型本身就是鼓舞人心的。

当然,这个蜜点(400~600步区间)
是在“40张数据 / FLUX 1-dev / 此LoRA设置”这样一个相对特定的条件下得出的结果。
不过基于这次经验,

  • 应根据数据量探索合适的步数范围
  • 并在此范围内仔细切割保存,以寻找最佳点的方法让我有了启示。

5. 下一步

下次实验的目标已经明确。

  • 优化: 是否强制所有文本编码器(TE)分配到CUDA,这涉及到FLUX LoRA脚本的设计(在大T5XXL后进行缓存再转到CPU以节省VRAM),需要深入探讨。

  • LoRA减肥: network_dim从256→128→64时的容量/质量/一致性进行比较。

  • 精准打击: 不超过1000步,对400~600步区间进行精细划分(每50步保存一次),寻找最佳模型。

  • 在学习数据集上引入标注:

    • 对相同人40张,带标注与不带标注的对比。
    • 从“表情/姿态多样性 vs 过拟合”的角度进行分析。

低功耗高效能的AI研究仍在继续。下次发布将带着减肥成功的LoRA再见!