关于训练lora的小问题

#6
by JO0OJ - opened

大佬您好,我想问一下lora文件的大小是否影响出图质量?我现在也是在学习训练lora当中,我看您制作的lora文件体积相对C站上的小很多,但是出图质量很高,我在网上看到训练相关的教程说训练lora的linear rank越高细节越多,但是文件体积会同步增加,那么您的lora设置多少数值能保证文件体积小,还能保证出图质量呢?

大佬您好,我想问一下lora文件的大小是否影响出图质量?我现在也是在学习训练lora当中,我看您制作的lora文件体积相对C站上的小很多,但是出图质量很高,我在网上看到训练相关的教程说训练lora的linear rank越高细节越多,但是文件体积会同步增加,那么您的lora设置多少数值能保证文件体积小,还能保证出图质量呢?

影响是有的,参数量越大当然质量更好,但这其中存在着边际递减效应,对于一般的语言大模型来说,本身维度为1024的情况下,rank=8就能发挥出80%以上的性能了;
对于文生图模型来说,也有类似的情况,假如相似度满值为10分,那么当lora的rank=8时,相似度就已经有8分左右了,rank=16时,有8.5,rank=32时,有9分;
虽然体积和参数量在成倍增长,但此时肉眼对相似度已经察觉不出太大的进步了,后期参数量的成倍带来的更多是对皮肤细节质感的学习,对人脸轮廓相似度的提升却是很小的,又加之人脸本身也因为妆造年龄的原因呈现一定的波动;
所以理论上rank在8~32时就是性价比相对较高的值,我个人一般选择8或16;
因此这个仓库中的zit lora的rank为8,zi lokr的factor为16,基本等效为lora的rank=8。

原来如此,谢谢大佬的解答

JO0OJ changed discussion status to closed
JO0OJ changed discussion status to open

我近期看到您解答其他人的问题时想到一个问题,既然以较低的rank学习人脸主要是为了让模型记住人物的骨相,Zimage本身可以生成质量较高的皮肤,那么准备素材的时候为什么需要以能看清皮肤质感为目标呢?因为我最近在收集一些素材的时候,发现质量好的素材太少了,或者说素颜/淡妆的素材太少/几乎没有,而用AI放大和补充皮肤质感容易对人物面相产生变化,例如鹰钩鼻很容易被重绘成常见的鼻型。对于这种情况,是不是可以用能看清人物面部特征的素材直接训练呢?大佬有没有这方面的经验总结?

简单来说还是污染,也是因为zimage对图像质量较为敏感的原因,训练图像素材不够清晰、人物面部有磨皮或像素涂抹感,会导致最终生图尤其是怼脸图时,皮肤细节不够;
当然也正如你所说,zimage在真实细节这方面是经过特化的,天然能生成更真实的肤质细节,哪怕经过了低质量的污染,仍然能够保持一定的皮肤质感,不会下降太多,但对比其他有充足高质量素材的训练案例来说,对比就变得明显了;
典型的如我仓库中最近的几个年代较久的明星,看生图是和新生代明星的出图是有一些差距的,其中我个人觉得质量降低最明显的是WangZuxian和LiJiaxin,生成脸部特写都有一定涂抹感,这也是因为这两个人物的源素材哪怕用过诸多修复手段,其能用的图还是太坏太少;

虽然说训练素材最好以看清皮肤细节为最终目标,但如果能肉眼一眼看出人物面部特征的素材也是可以直接用的,只是可能得把timestep_shift调高一些,对于1024分辨率而言,shift=1.0会更注重面部肤质细节,shift=5.0时相对会更注重框架也就是骨相;
放大最好还是使用SeedVR2,基本流程就是先缩小再放大,在素材有一定细节的情况下,直接用7b版从512或768放大2k,遇到相对模糊的缩小到384或512,先过一次3b锐化放大到1k,再用7b放大2k;
修复补充的选择倒是很多,不过连seedvr2都无法高清化的图片,基本上能说明图片本身的细节是不够的,也就是涂抹感严重、噪点不足,得用一些能尽量保持一致性的修复放大手段,避免面相都发生较大的改变,我个人目前在用Flux2 Klein的Adonis来修复那些清晰度尤其低、涂抹感极重的素材,这个lora相当于为人添加噪点,准确率还是挺高的,出来的图不直接用,还是用seedvr2的3b、7b过一次,这样出来的素材面相改变相对就比较小;
不过也不太清楚有没有更新更好的能保持较高一致性的技术手段,我个人来说上面的两种方法是勉强够用的。

原来是这样,我原本还想着先按现有素材制作一个lora,通过生图的方式添加皮肤纹理,再用AI生成的图再做一版lora,看来这样并不能增强最终效果。
那么对于质量一般的素材,您通常设置多少训练步数?比如我在尝试制作某coser的模型,可用低于30张,1024*1024,能看清面部特征但是皮肤纹理一般(笑着能看到酒窝或者双眼皮之类的,但是有一些磨皮的素材),这种情况下是否需要用镜像补齐到30张,然后提高训练步数么?

原来是这样,我原本还想着先按现有素材制作一个lora,通过生图的方式添加皮肤纹理,再用AI生成的图再做一版lora,看来这样并不能增强最终效果。
那么对于质量一般的素材,您通常设置多少训练步数?比如我在尝试制作某coser的模型,可用低于30张,1024*1024,能看清面部特征但是皮肤纹理一般(笑着能看到酒窝或者双眼皮之类的,但是有一些磨皮的素材),这种情况下是否需要用镜像补齐到30张,然后提高训练步数么?

用现有素材先制作一个用于生成素材的lora这个思路是可行的,动漫训练或风格训练的大量素材很多都是这样来的,对于人脸也是适用的,不过因为人脸相似度要求相对更为精细严格加上lora训练还是有一定成本,所以后续很多人是采用编辑模型来生成更多的相似素材的,虽然编辑模型的一致性很多时候也得靠抽卡,但相对没lora那么耗时;
依照lora生成素材这个思路,可以用质量较高的几张图先做一个前置用于生成素材图的lora,这样一来训练集很小,可以继续拉高学习率,在不考虑泛化性的情况下主动让lora过拟合,以此生成相似度比较高的其他素材,只是这样确定更花功夫就是了;

对于质量一般的素材,在相同参数下训练步数会稍微多一点,但正如之前所言,主要区别是shift值,要调大shift值让模型更多地学习高噪内容(框架构图,对于人脸就是五官分布、骨相);
20—30张是性价比相对高的数量,更少更多理论上都是可行的,补齐到30张也不用刻意提高步数,只是在找到一个甜点位以后,可以比较偷懒地设置统一参数而已;
并且训练步数在shift拉高的情况下,理论上是只需要更少的步数的,因为高噪内容总是更容易学习也更容易拟合的,比如同一套素材,高shift值总是更快拟合,只是因为我们的素材质量差了一些,所以才相对需要更多步数;
我个人用OneTrainer训练zimage的lokr会开启验证集,因此训练步数是比较动态的,设置100个epoch,乘以素材数量,最终步数也就3000左右,但因为验证集的存在,大多在30轮前后就已经到达相对拟合的状态,这个时候会手动停下训练,所以基本没有跑完的时候;就已经发布的lora而言,素材整体质量较好时,用到的步数大多在500步到700步之间,素材整体质量一般时,在shift拉到5后,到顶也就1200步,也就是40轮左右。

好的,感谢大佬耐心解答,祝您生活愉快

JO0OJ changed discussion status to closed

原来是这样,我原本还想着先按现有素材制作一个lora,通过生图的方式添加皮肤纹理,再用AI生成的图再做一版lora,看来这样并不能增强最终效果。
那么对于质量一般的素材,您通常设置多少训练步数?比如我在尝试制作某coser的模型,可用低于30张,1024*1024,能看清面部特征但是皮肤纹理一般(笑着能看到酒窝或者双眼皮之类的,但是有一些磨皮的素材),这种情况下是否需要用镜像补齐到30张,然后提高训练步数么?

用现有素材先制作一个用于生成素材的lora这个思路是可行的,动漫训练或风格训练的大量素材很多都是这样来的,对于人脸也是适用的,不过因为人脸相似度要求相对更为精细严格加上lora训练还是有一定成本,所以后续很多人是采用编辑模型来生成更多的相似素材的,虽然编辑模型的一致性很多时候也得靠抽卡,但相对没lora那么耗时;
依照lora生成素材这个思路,可以用质量较高的几张图先做一个前置用于生成素材图的lora,这样一来训练集很小,可以继续拉高学习率,在不考虑泛化性的情况下主动让lora过拟合,以此生成相似度比较高的其他素材,只是这样确定更花功夫就是了;

对于质量一般的素材,在相同参数下训练步数会稍微多一点,但正如之前所言,主要区别是shift值,要调大shift值让模型更多地学习高噪内容(框架构图,对于人脸就是五官分布、骨相);
20—30张是性价比相对高的数量,更少更多理论上都是可行的,补齐到30张也不用刻意提高步数,只是在找到一个甜点位以后,可以比较偷懒地设置统一参数而已;
并且训练步数在shift拉高的情况下,理论上是只需要更少的步数的,因为高噪内容总是更容易学习也更容易拟合的,比如同一套素材,高shift值总是更快拟合,只是因为我们的素材质量差了一些,所以才相对需要更多步数;
我个人用OneTrainer训练zimage的lokr会开启验证集,因此训练步数是比较动态的,设置100个epoch,乘以素材数量,最终步数也就3000左右,但因为验证集的存在,大多在30轮前后就已经到达相对拟合的状态,这个时候会手动停下训练,所以基本没有跑完的时候;就已经发布的lora而言,素材整体质量较好时,用到的步数大多在500步到700步之间,素材整体质量一般时,在shift拉到5后,到顶也就1200步,也就是40轮左右。

大佬,用的哪一个分支的OneTrainer可以分享一下吗

原来是这样,我原本还想着先按现有素材制作一个lora,通过生图的方式添加皮肤纹理,再用AI生成的图再做一版lora,看来这样并不能增强最终效果。
那么对于质量一般的素材,您通常设置多少训练步数?比如我在尝试制作某coser的模型,可用低于30张,1024*1024,能看清面部特征但是皮肤纹理一般(笑着能看到酒窝或者双眼皮之类的,但是有一些磨皮的素材),这种情况下是否需要用镜像补齐到30张,然后提高训练步数么?

用现有素材先制作一个用于生成素材的lora这个思路是可行的,动漫训练或风格训练的大量素材很多都是这样来的,对于人脸也是适用的,不过因为人脸相似度要求相对更为精细严格加上lora训练还是有一定成本,所以后续很多人是采用编辑模型来生成更多的相似素材的,虽然编辑模型的一致性很多时候也得靠抽卡,但相对没lora那么耗时;
依照lora生成素材这个思路,可以用质量较高的几张图先做一个前置用于生成素材图的lora,这样一来训练集很小,可以继续拉高学习率,在不考虑泛化性的情况下主动让lora过拟合,以此生成相似度比较高的其他素材,只是这样确定更花功夫就是了;

对于质量一般的素材,在相同参数下训练步数会稍微多一点,但正如之前所言,主要区别是shift值,要调大shift值让模型更多地学习高噪内容(框架构图,对于人脸就是五官分布、骨相);
20—30张是性价比相对高的数量,更少更多理论上都是可行的,补齐到30张也不用刻意提高步数,只是在找到一个甜点位以后,可以比较偷懒地设置统一参数而已;
并且训练步数在shift拉高的情况下,理论上是只需要更少的步数的,因为高噪内容总是更容易学习也更容易拟合的,比如同一套素材,高shift值总是更快拟合,只是因为我们的素材质量差了一些,所以才相对需要更多步数;
我个人用OneTrainer训练zimage的lokr会开启验证集,因此训练步数是比较动态的,设置100个epoch,乘以素材数量,最终步数也就3000左右,但因为验证集的存在,大多在30轮前后就已经到达相对拟合的状态,这个时候会手动停下训练,所以基本没有跑完的时候;就已经发布的lora而言,素材整体质量较好时,用到的步数大多在500步到700步之间,素材整体质量一般时,在shift拉到5后,到顶也就1200步,也就是40轮左右。

大佬,用的哪一个分支的OneTrainer可以分享一下吗

https://github.com/gesen2egee/OneTrainer
https://pastebin.com/DQvH1pvY

原来是这样,我原本还想着先按现有素材制作一个lora,通过生图的方式添加皮肤纹理,再用AI生成的图再做一版lora,看来这样并不能增强最终效果。
那么对于质量一般的素材,您通常设置多少训练步数?比如我在尝试制作某coser的模型,可用低于30张,1024*1024,能看清面部特征但是皮肤纹理一般(笑着能看到酒窝或者双眼皮之类的,但是有一些磨皮的素材),这种情况下是否需要用镜像补齐到30张,然后提高训练步数么?

用现有素材先制作一个用于生成素材的lora这个思路是可行的,动漫训练或风格训练的大量素材很多都是这样来的,对于人脸也是适用的,不过因为人脸相似度要求相对更为精细严格加上lora训练还是有一定成本,所以后续很多人是采用编辑模型来生成更多的相似素材的,虽然编辑模型的一致性很多时候也得靠抽卡,但相对没lora那么耗时;
依照lora生成素材这个思路,可以用质量较高的几张图先做一个前置用于生成素材图的lora,这样一来训练集很小,可以继续拉高学习率,在不考虑泛化性的情况下主动让lora过拟合,以此生成相似度比较高的其他素材,只是这样确定更花功夫就是了;

对于质量一般的素材,在相同参数下训练步数会稍微多一点,但正如之前所言,主要区别是shift值,要调大shift值让模型更多地学习高噪内容(框架构图,对于人脸就是五官分布、骨相);
20—30张是性价比相对高的数量,更少更多理论上都是可行的,补齐到30张也不用刻意提高步数,只是在找到一个甜点位以后,可以比较偷懒地设置统一参数而已;
并且训练步数在shift拉高的情况下,理论上是只需要更少的步数的,因为高噪内容总是更容易学习也更容易拟合的,比如同一套素材,高shift值总是更快拟合,只是因为我们的素材质量差了一些,所以才相对需要更多步数;
我个人用OneTrainer训练zimage的lokr会开启验证集,因此训练步数是比较动态的,设置100个epoch,乘以素材数量,最终步数也就3000左右,但因为验证集的存在,大多在30轮前后就已经到达相对拟合的状态,这个时候会手动停下训练,所以基本没有跑完的时候;就已经发布的lora而言,素材整体质量较好时,用到的步数大多在500步到700步之间,素材整体质量一般时,在shift拉到5后,到顶也就1200步,也就是40轮左右。

大佬,用的哪一个分支的OneTrainer可以分享一下吗

https://github.com/gesen2egee/OneTrainer
https://pastebin.com/DQvH1pvY

大佬,用这个版本Onetrainer的backup分支训练报以下错误,后面的代码是按GLM5.2建议在AutomagicSinkGD.py第168行前进行的修改。一开始用这个仓库的master分支,启动后没找到AutomagicSinkGD这个优化器,就用了backup这个分支,然后出现这个问题,你这边有遇到这个问题么?目前按GLM5.2的建议修改代码跑了训练,但是不知道这样对训练是否有影响?

    File "/workspace/OneTrainer/modules/ui/TrainUI.py", line 716, in __training_thread_function
    trainer.train()
    ~~~~~~~~~~~~~^^
    File "/workspace/OneTrainer/modules/trainer/GenericTrainer.py", line 777, in train
    self.model.optimizer.step()
    ~~~~~~~~~~~~~~~~~~~~~~~~~^^
    File "/workspace/OneTrainer/venv/lib/python3.13/site-packages/torch/optim/lr_scheduler.py", line 133, in wrapper
    return func.__get__(opt, opt.__class__)(*args, **kwargs)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
    File "/workspace/OneTrainer/venv/lib/python3.13/site-packages/torch/optim/optimizer.py", line 517, in wrapper
    out = func(*args, **kwargs)
     File "/workspace/OneTrainer/venv/lib/python3.13/site-packages/torch/utils/_contextlib.py", line 120, in decorate_context
    return func(*args, **kwargs)
     File "/workspace/OneTrainer/modules/util/optimizer/AutomagicSinkGD.py", line 168, in step
    scaled_wd = weight_decay * lr_to_use * (base_lr / state["lr_max_val"])
                                            ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
ZeroDivisionError: float division by zero

AutomagicSinkGD.py修改

                if weight_decay != 0:
                    # --- 修改开始 ---
                    if state["lr_max_val"] == 0.0:
                        # 只有当 base_lr 不为 0 时才用它初始化
                        # 如果 base_lr 也是 0,随便给个非零值(比如 1.0)防止崩溃
                        state["lr_max_val"] = base_lr if base_lr != 0 else 1.0
                    # --- 修改结束 ---
                    scaled_wd = weight_decay * lr_to_use * (base_lr / state["lr_max_val"])

原来是这样,我原本还想着先按现有素材制作一个lora,通过生图的方式添加皮肤纹理,再用AI生成的图再做一版lora,看来这样并不能增强最终效果。
那么对于质量一般的素材,您通常设置多少训练步数?比如我在尝试制作某coser的模型,可用低于30张,1024*1024,能看清面部特征但是皮肤纹理一般(笑着能看到酒窝或者双眼皮之类的,但是有一些磨皮的素材),这种情况下是否需要用镜像补齐到30张,然后提高训练步数么?

用现有素材先制作一个用于生成素材的lora这个思路是可行的,动漫训练或风格训练的大量素材很多都是这样来的,对于人脸也是适用的,不过因为人脸相似度要求相对更为精细严格加上lora训练还是有一定成本,所以后续很多人是采用编辑模型来生成更多的相似素材的,虽然编辑模型的一致性很多时候也得靠抽卡,但相对没lora那么耗时;
依照lora生成素材这个思路,可以用质量较高的几张图先做一个前置用于生成素材图的lora,这样一来训练集很小,可以继续拉高学习率,在不考虑泛化性的情况下主动让lora过拟合,以此生成相似度比较高的其他素材,只是这样确定更花功夫就是了;

对于质量一般的素材,在相同参数下训练步数会稍微多一点,但正如之前所言,主要区别是shift值,要调大shift值让模型更多地学习高噪内容(框架构图,对于人脸就是五官分布、骨相);
20—30张是性价比相对高的数量,更少更多理论上都是可行的,补齐到30张也不用刻意提高步数,只是在找到一个甜点位以后,可以比较偷懒地设置统一参数而已;
并且训练步数在shift拉高的情况下,理论上是只需要更少的步数的,因为高噪内容总是更容易学习也更容易拟合的,比如同一套素材,高shift值总是更快拟合,只是因为我们的素材质量差了一些,所以才相对需要更多步数;
我个人用OneTrainer训练zimage的lokr会开启验证集,因此训练步数是比较动态的,设置100个epoch,乘以素材数量,最终步数也就3000左右,但因为验证集的存在,大多在30轮前后就已经到达相对拟合的状态,这个时候会手动停下训练,所以基本没有跑完的时候;就已经发布的lora而言,素材整体质量较好时,用到的步数大多在500步到700步之间,素材整体质量一般时,在shift拉到5后,到顶也就1200步,也就是40轮左右。

大佬,用的哪一个分支的OneTrainer可以分享一下吗

https://github.com/gesen2egee/OneTrainer
https://pastebin.com/DQvH1pvY

大佬,用这个版本Onetrainer的backup分支训练报以下错误,后面的代码是按GLM5.2建议在AutomagicSinkGD.py第168行前进行的修改。一开始用这个仓库的master分支,启动后没找到AutomagicSinkGD这个优化器,就用了backup这个分支,然后出现这个问题,你这边有遇到这个问题么?目前按GLM5.2的建议修改代码跑了训练,但是不知道这样对训练是否有影响?

    File "/workspace/OneTrainer/modules/ui/TrainUI.py", line 716, in __training_thread_function
    trainer.train()
    ~~~~~~~~~~~~~^^
    File "/workspace/OneTrainer/modules/trainer/GenericTrainer.py", line 777, in train
    self.model.optimizer.step()
    ~~~~~~~~~~~~~~~~~~~~~~~~~^^
    File "/workspace/OneTrainer/venv/lib/python3.13/site-packages/torch/optim/lr_scheduler.py", line 133, in wrapper
    return func.__get__(opt, opt.__class__)(*args, **kwargs)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
    File "/workspace/OneTrainer/venv/lib/python3.13/site-packages/torch/optim/optimizer.py", line 517, in wrapper
    out = func(*args, **kwargs)
     File "/workspace/OneTrainer/venv/lib/python3.13/site-packages/torch/utils/_contextlib.py", line 120, in decorate_context
    return func(*args, **kwargs)
     File "/workspace/OneTrainer/modules/util/optimizer/AutomagicSinkGD.py", line 168, in step
    scaled_wd = weight_decay * lr_to_use * (base_lr / state["lr_max_val"])
                                            ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
ZeroDivisionError: float division by zero

AutomagicSinkGD.py修改

                if weight_decay != 0:
                    # --- 修改开始 ---
                    if state["lr_max_val"] == 0.0:
                        # 只有当 base_lr 不为 0 时才用它初始化
                        # 如果 base_lr 也是 0,随便给个非零值(比如 1.0)防止崩溃
                        state["lr_max_val"] = base_lr if base_lr != 0 else 1.0
                    # --- 修改结束 ---
                    scaled_wd = weight_decay * lr_to_use * (base_lr / state["lr_max_val"])

可能是作者更新了一些代码,我当时clone的是c92e677441c4b5db025c10678250eac05b28d022这个commit,你可以回滚试试;
或者你可以试试 https://github.com/ifmylove2011/OneTrainer-zi 这个,这是我之前自己另外备份的分支,因为我当时更新后也出现了一些问题,倒是没报错,就是效果不对,索性回滚自己另外备份了一个,免得被更新影响。

https://github.com/ifmylove2011/OneTrainer-zi/commit/06f3b7d213e1ab306f1b3b03e74978d3768c1609 ,大佬你这个commit的src目录下3个文件夹是空的,没有相关依赖文件,这些文件你用的是和修改前的链接对应的版本么?https://github.com/huggingface/diffusers.git@6a1904e#egg=diffusershttps://github.com/Nerogar/mgds.git@a0c84a3#egg=mgdshttps://github.com/KellerJordan/Muon.git@f90a42b#egg=muon-optimizer,还是说直接用c92e677这个commit也是相同的效果?

用原来的仓库就行,理论上这几个目录中只有ScaleCropImage的改动可能会有一定影响,就是把中心剪裁方式改成了顶部剪裁,其他的基本没有影响;
后续我也提交了这几个目录,是之前github检测到有密钥存在所以Push这几个目录失败了,当时没注意。

Sign up or log in to comment