
1. 为什么选择本地部署而不是云端Notebook很多人第一次接触LoRA训练第一反应是打开云端Notebook跑一遍示例。我最初也是这么干的但很快就发现几个绕不过去的问题免费额度跑两次SDXL微调就没了数据集上传下载来回折腾最要命的是训练到一半断线几十个epoch白跑。后来我下定决心在本地把kohya_ss这套环境搭起来前后折腾了大概三个晚上踩了不少坑也总结出一套相对稳定的流程。kohya_ss本质上是一个围绕扩散模型训练脚本的图形化封装它把原本需要手写命令行参数的训练过程变成了可视化配置。核心能力包括SD1.5/SDXL的LoRA训练、DreamBooth微调、Textual Inversion等。LoRALow-Rank Adaptation低秩适应的思路是在原有大模型的权重矩阵旁边挂两个小矩阵训练时只更新这两个小矩阵这样显存占用和训练时间都大幅下降。SDXL因为底模参数量比SD1.5大好几倍直接全量微调基本不现实LoRA几乎是个人玩家的唯一选择。这篇文章适合谁看如果你手上有一张8GB以上显存的N卡想训练自己的角色LoRA或者画风LoRA又不想被云端平台的各种限制绑住那这套流程可以直接抄。如果你连Python都没装过也不用慌我会把每一步的命令和预期输出都写清楚。先说结论性的硬件门槛这是我实测下来的经验值训练类型最低显存推荐显存备注SD1.5 LoRA6GB8GBbatch size1开启梯度检查点SDXL LoRA8GB12GB必须开gradient checkpointingSDXL LoRA (高分辨率)12GB16GB1024分辨率训练DreamBooth SD1.510GB12GB全量微调显存需求高显存不够的时候不要硬撑先把batch size降到1再开梯度检查点还不行就降分辨率。我见过太多人卡在CUDA out of memory上反复重启其实调两个参数就能解决。2. 环境部署从Python版本到依赖冲突的完整排雷2.1 Python和CUDA版本的匹配逻辑kohya_ss对Python版本有明确要求我建议用Python 3.10.x这是目前兼容性最好的版本。3.11和3.12虽然也能跑但部分依赖包尤其是bitsandbytes和xformers的预编译轮子还没跟上容易在安装阶段就卡住。CUDA版本要和你的显卡驱动匹配。用nvidia-smi查看驱动支持的CUDA最高版本然后去PyTorch官网找对应的安装命令。比如驱动显示CUDA 12.1就装cu121版本的PyTorch。这里有个坑很多人直接pip install torch装到的是CPU版本训练时才发现用不了GPU。正确的做法是明确指定index-urlpip install torch2.1.2 torchvision0.16.2 --index-url https://download.pytorch.org/whl/cu121装完之后一定要验证import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))三行输出分别应该是版本号、True、你的显卡型号。如果第二行是False后面所有训练都跑不起来先解决这个问题再往下走。2.2 kohya_ss的克隆与安装脚本选择官方仓库的安装脚本分Windows和Linux两套。Windows下直接运行setup.batLinux/Mac下用setup.sh。但我要提醒一句安装脚本会自动创建虚拟环境并装一大堆依赖整个过程可能持续20到40分钟取决于网络状况。国内网络环境下建议先配置pip镜像源否则大概率中途超时。配置镜像源的方法pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple然后再跑安装脚本。安装完成后启动脚本是gui.batWindows或gui.shLinux。启动成功后浏览器会自动打开一个本地页面地址通常是http://127.0.0.1:7860。看到界面就说明环境基本通了。2.3 依赖冲突的典型表现与修复安装过程中最常见的报错是版本冲突典型的有两类第一类是xformers和torch版本不匹配。xformers能显著降低显存占用、提升训练速度但它对torch版本极其敏感。如果报错提示xformers requires torchxxx最省事的做法是先卸载xformers用--no-deps参数单独装匹配版本pip uninstall xformers -y pip install xformers0.0.23.post1 --no-deps第二类是bitsandbytes在Windows上的兼容问题。这个包在Linux下开箱即用Windows下需要额外装一个补丁包。如果训练时提示bitsandbytes library load error去GitHub搜bitsandbytes-windows按说明替换dll文件即可。提示每次改动依赖后建议重启一次GUI让Python重新加载所有模块。我遇到过改完依赖不重启训练脚本仍然调用旧版本的情况。2.4 验证环境是否真正可用环境装完不要急着上正式数据集先用官方提供的示例配置跑一个最小训练。准备5到10张图片分辨率统一到512跑10个step看看能不能正常出loss曲线。这一步的目的是确认数据加载、模型加载、显存分配、保存输出这条链路全部通畅。我见过有人直接上几百张图训练跑到一半报错排查成本极高。先用小数据集验证是省时间而不是浪费时间。3. 数据集准备标注质量决定LoRA上限3.1 图片筛选与预处理的实际标准数据集的质量比数量重要得多。我训练角色LoRA的经验是15到30张高质量图片就能出不错的效果关键是图片要有多样性。什么叫多样性不同角度、不同表情、不同光照、不同背景、半身和全身都要有。如果全是同一个角度的自拍训练出来的LoRA换个角度就崩。分辨率方面SD1.5训练用512x512或512x768SDXL用1024x1024。图片不要强行拉伸保持原始比例用裁剪或者padding补齐。kohya_ss内置了预处理工具在Utilities标签页里可以批量resize和裁剪。图片格式统一用PNG或JPG去掉透明通道。我遇到过带alpha通道的PNG导致训练报错的情况批量转成RGB模式就好了。3.2 打标触发词的选择与正则化标签打标是LoRA训练里最容易被忽视但影响最大的环节。每张图都要配一个txt文件内容是对图片的描述。触发词trigger word是你希望用来激活这个LoRA的特殊词建议用一个不常见的词比如ohwx、sks这种避免和底模已有的概念冲突。打标工具推荐用BLIP或WD14 Tagger自动生成初稿然后手动修正。自动打标的问题是它会描述所有细节包括你不想让模型学的东西。比如你训练一个角色背景里有桌子椅子自动打标会把桌子椅子也标进去结果模型把这个角色和桌子绑定了。手动修正的原则是只保留你希望模型关联的特征背景元素尽量删掉或者用通用词替代。正则化标签regularization是另一个关键概念。简单说你需要准备一批和训练目标同类但不包含特定特征的图片配上通用标签防止模型过拟合。比如训练特定人物正则图就是各种不同的人标签统一用person。kohya_ss支持在配置里指定正则图目录训练时会混合采样。3.3 目录结构组织与配置文件的对应关系kohya_ss对目录结构有约定搞错了会直接报找不到文件。标准结构是这样的train_data/ └── 10_ohwx/ ├── img1.png ├── img1.txt ├── img2.png └── img2.txt文件夹名10_ohwx里的10表示每张图重复训练10次ohwx是触发词。这个数字不是随便定的重复次数乘以图片数量再乘以epoch数就是总训练步数。一般角色LoRA总步数控制在1500到3000之间比较合适。正则图目录单独放reg_data/ └── 1_person/ ├── reg1.png └── reg1.txt配置界面里分别指定训练目录和正则目录即可。3.4 数据集常见问题排查表问题现象可能原因解决方法报错找不到图片目录名格式不对检查是否为数字_触发词格式训练loss不下降标注质量差或学习率过低检查txt内容适当提高学习率过拟合严重重复次数过高或图片太少降低重复次数增加图片多样性生成图不带触发词也像触发词太常见换一个生僻词作为触发词显存溢出分辨率或batch size过高降分辨率batch size设为14. 训练参数配置每个数字背后的取舍逻辑4.1 学习率与优化器的搭配学习率是训练中最敏感的参数。LoRA训练常用的优化器有AdamW和AdamW8bit后者显存占用更低但精度略差。学习率建议从1e-4开始试SDXL因为模型更大可以适当降到5e-5。这里有个反直觉的点学习率不是越低越好。太低会导致训练不充分loss降不下去太高会导致过拟合或者训练崩溃。我的做法是先跑200步看loss曲线如果loss在0.1以上且下降缓慢说明学习率偏低如果loss剧烈震荡或者直接变成nan说明学习率偏高。调度器scheduler推荐用cosine_with_restarts或者constant_with_warmup。warmup步数设为总步数的5%到10%让学习率从0慢慢升上去避免一开始就大步更新破坏预训练权重。4.2 网络维度与alpha的关系LoRA的rank网络维度决定了可训练参数的数量。rank越大模型容量越大但过拟合风险也越高。SD1.5常用rank 32到64SDXL常用rank 16到32。alpha是缩放系数一般设为rank的一半或者等于rank。我实测下来的经验角色LoRA用rank 32、alpha 16比较稳画风LoRA用rank 64、alpha 32能保留更多风格细节。如果训练数据少于20张rank不要超过32否则几乎必然过拟合。4.3 混合精度与梯度检查点的显存账混合精度mixed precision有两个选项fp16和bf16。bf16动态范围更大训练更稳定但需要显卡支持RTX 30系及以上。fp16兼容性好但容易出现梯度下溢。如果你的显卡支持bf16优先选bf16。梯度检查点gradient checkpointing是用时间换显存的技术开启后显存占用能降低30%到50%代价是训练速度慢20%左右。显存紧张时必开显存充足时可以关掉提速。算一笔显存账SDXL LoRA训练1024分辨率batch size1开启梯度检查点和bf168GB显存勉强够用。如果关掉梯度检查点至少需要12GB。这就是为什么我一直强调先确认显存再选参数。4.4 保存策略与训练中断的恢复kohya_ss支持按epoch或按步数保存checkpoint。建议每2个epoch保存一次同时保存优化器状态optimizer state这样训练中断后可以从最近的checkpoint继续不用从头再来。保存的LoRA文件有两种格式safetensors和ckpt。safetensors更安全加载更快优先选它。保存路径不要有中文和空格否则某些脚本会报编码错误。注意训练过程中不要手动关闭GUI窗口正确做法是在界面点Stop按钮等它保存完当前checkpoint再退出。直接关窗口可能导致最后一个checkpoint损坏。5. 训练过程监控与常见故障处理5.1 loss曲线的正确读法训练开始后GUI会实时显示loss值。健康的loss曲线应该是先快速下降然后趋于平缓。前100步loss从0.3降到0.15左右是正常的之后缓慢降到0.08到0.1区间并稳定。如果loss一直卡在0.2以上不降检查三个地方学习率是否太低、标注是否和图片内容匹配、触发词是否在每张图的txt里都出现了。如果loss降到0.05以下还在降大概率过拟合了赶紧停用中间epoch的checkpoint。5.2 显存溢出的逐步排查路径CUDA out of memory是最高频的报错。排查顺序应该是这样的第一步确认没有其他程序占用显存。浏览器开着一堆标签页、后台跑着游戏都会抢显存。用nvidia-smi看当前占用。第二步降低batch size到1。这是最直接有效的手段。第三步开启梯度检查点。如果已经开了尝试降低分辨率比如从1024降到768。第四步换用AdamW8bit优化器能省不少显存。第五步如果以上都不行说明硬件确实不够考虑用云端或者换显卡。我遇到过一次诡异的情况所有参数都调到最低还是溢出最后发现是xformers版本不对导致显存泄漏。卸载xformers后反而正常了。所以排查时不要忽略依赖包本身的问题。5.3 训练速度异常的定位方法训练速度突然变慢常见原因有三个一是硬盘IO瓶颈数据集放在机械硬盘上每次加载图片都要等二是CPU预处理跟不上图片解码和增强在CPU上做CPU太弱会拖后腿三是显存快满了系统在频繁做内存和显存之间的交换。解决办法数据集放SSD关闭不必要的图片增强监控nvidia-smi的显存占用率。如果显存占用率长期在95%以上说明快满了适当降参数。5.4 出图效果不理想的归因分析训练完了出图效果差先别急着重新训练按这个顺序排查先确认触发词用对了。txt里写的触发词和出图prompt里用的必须完全一致大小写敏感。再确认权重weight设置。LoRA加载时有个权重系数默认1.0。效果太弱就调到1.2效果太强导致画面崩坏就降到0.8。然后看是不是过拟合。过拟合的表现是出图风格单一、背景总是那几个、换个prompt就不像了。解决办法是用更早的checkpoint或者减少训练步数重新训练。最后才考虑数据集本身的问题。如果图片质量差、标注混乱再怎么调参数也救不回来。6. 模型验证与迭代从能跑到好用6.1 用固定prompt做横向对比训练完成后不要凭感觉判断好坏。准备一组固定的测试prompt包含不同场景、不同角度、不同风格用同一个seed生成图片。然后对比不同epoch的checkpoint看哪个版本综合表现最好。我通常会测这几类prompt正面特写、侧面、全身、不同表情、和不同背景组合。如果某个checkpoint在大部分场景下都稳定那就是最佳版本。6.2 过拟合与欠拟合的补救训练过拟合了怎么办两个方案一是用更早的checkpoint二是用正则化图片重新训练一轮降低学习率。欠拟合则相反增加训练步数或者提高学习率。还有一种情况是“局部过拟合”某些特征学得很好但整体不够自然。这种通常是标注不均衡导致的比如大部分图都标注了某个特征模型就过度关注它。解决办法是重新平衡标注让每个特征的描述频率大致相当。6.3 多LoRA叠加时的冲突处理实际使用中经常需要叠加多个LoRA比如一个角色LoRA加一个画风LoRA。叠加时容易出现特征冲突表现为画面混乱或者某个LoRA完全不起作用。处理原则是主LoRA权重设高一些0.8到1.0辅助LoRA设低一些0.4到0.6。如果冲突严重可以用分层控制让不同LoRA作用于不同的网络层。kohya_ss支持在配置里指定block权重这个功能进阶玩家可以深入研究。6.4 版本管理与实验记录习惯训练多了之后最大的问题是记不清哪个LoRA是用哪套参数训的。我的习惯是每次训练建一个文件夹命名格式为日期_触发词_rank_学习率里面放配置文件副本、数据集信息、最终LoRA文件。这样半年后回头看也能快速定位。另外建议用表格记录每次实验的关键参数和结果实验编号rank学习率步数效果评价exp001321e-42000略过拟合exp002325e-51500最佳exp003641e-42000风格强但崩坏这个习惯看起来麻烦但当你训练到第十个LoRA的时候会感谢自己当初做了记录。7. 一些没人告诉你的实操细节训练SDXL LoRA时底模的选择很关键。官方SDXL base模型适合训练通用能力但如果你的目标是特定画风用对应的微调底模效果更好。不过要注意底模换了之后之前训好的LoRA可能不兼容。关于触发词有个小技巧在触发词后面加一个空格再跟其他描述词能减少触发词和其他概念的粘连。比如ohwx, a person standing比ohwx person standing效果更干净。还有一点训练过程中如果发现loss突然飙升不要慌先看是不是到了某个epoch边界。有些调度器在epoch切换时会调整学习率导致loss短暂波动。等几十步看是否恢复恢复了就继续没恢复再考虑中断。最后说一个显存优化的偏方把Windows的硬件加速GPU计划关掉有时候能释放出几百MB显存。这个不是万能药但在临界状态下可能刚好够用。训练LoRA这件事参数是死的数据是活的。同样的参数数据集质量差一倍效果差十倍。与其反复调参不如花时间把图片选好、标注写准。这是我踩了无数坑之后最深的体会。