)
Kohya_ss 中文指南Stable Diffusion LoRA 训练完全手册train_network 详解【免费下载链接】kohya_ss项目地址: https://gitcode.com/GitHub_Trending/ko/kohya_ss导读本文档是 kohya_sssd-scripts中train_network.py的完整中文指南系统讲解如何在 Stable Diffusion 上训练 LoRALow-Rank Adaptation低秩适配网络。文章涵盖 LoRA 的核心原理与两种变体LoRA-LierLa / LoRA-C3Lier、命令行训练全流程、DyLoRA 动态秩训练、分层学习率与分层维度rank的高级配置以及 LoRA 合并、模型差异提取、Diffusers 推理调用等配套脚本的使用方法。读完本文你将能够独立完成从数据准备、网络训练、参数调优到模型合并与推理的完整 LoRA 工作流。LoRA 原理与适用背景LoRA: Low-Rank Adaptation of Large Language Models 最初为大型语言模型设计而本仓库将其应用于 Stable Diffusion。其核心思路是不直接修改预训练模型庞大的权重矩阵 W而是为需要学习的层附加一个小型神经网络用低秩分解 ΔW B·A其中 A 将输入映射到 rank 维隐空间B 将隐空间映射回输出维度来近似权重更新量。由于 ΔW 的参数量远小于原始权重LoRA 训练产物通常只有几十到几百 MB便于分发这正是 LoRA 相对 DreamBooth 全量微调的最大优势。原文档特别致谢 cloneofsimo 的 lora 仓库 提供了参考实现并致谢 KohakuBlueleaf 在 LoCon 中揭示了将 LoRA 扩展到 3x3 卷积的有效性。从源码结构看kohya_ss 仓库的 GUI 入口kohya_gui/lora_gui.py通过train_network.py驱动底层训练而训练脚本本身位于sd-scripts子模块参见仓库根目录 .gitmodules本文涉及的所有networks/脚本均属该子模块。可训练的 LoRA 类型本仓库定义了两类 LoRA 变体仓库自定义命名非通用术语LoRA-LierLa读作 LielaLinearLayers适用于 Linear 层与 Kernel 大小为 1x1 的 Conv2d 卷积层。LoRA-C3Lier读作 Seria适用于具有3x3 Kernel的卷积层与 Linear 层即在 LoRA-LierLa 基础上额外覆盖了 3x3 卷积。由于 LoRA-C3Lier 覆盖了更多层与原文档的说明一致它通常能获得比 LoRA-LierLa 更高的训练精度代价是更大的内存占用与更长的训练时间。原文档提示即使在 8GB VRAM 上LoRA 训练也可以勉强运行。训练时还可以使用DyLoRADynamic LoRA详见后文其他的学习方法。与推理生态的兼容性注意事项LoRA-LierLa可直接用于 AUTOMATIC1111 Web UI 的 LoRA 功能。LoRA-C3Lier在 Web UI 中生成需要使用 sd-webui-additional-networks 扩展。本仓库脚本支持将训练好的 LoRA 预先合并回 Stable Diffusion 模型。需要注意由于本实现进行了功能扩展如覆盖 Text Encoder 的 MLP、U-Net 的 FFN 与 Transformer 输入/输出投影以及模块交换机制的不同与 cloneofsimo 的原始仓库及 d8ahazard 的 sd_dreambooth_extension 不兼容。学习步骤环境准备与数据准备先参照仓库根目录 README.md 完成环境设置安装 PyTorch、accelerate、xformers 等依赖可通过 setup.sh 或 gui.sh 引导。训练数据准备请遵循 通用训练文档将训练图像放入任意文件夹支持.png、.jpg、.jpeg、.webp、.bmp可选配同名 caption 文本文件并通过 TOML 数据集配置文件描述分辨率、batch_size、重复次数与正则化图像等。使用 train_network.py 进行网络训练训练入口为train_network.py通过--network_module指定要训练的模块名称训练 LoRA 时指定networks.lora。原文档特别强调LoRA 的学习率应高于通常的 DreamBooth 或 fine tuning建议设定在1e-4至1e-3左右。以下是原文档给出的基础命令行示例训练 LoRA-LierLaaccelerate launch --num_cpu_threads_per_process 1 train_network.py --pretrained_model_name_or_path.ckpt或.safetensors或Diffusers版模型目录 --dataset_config数据集配置的.toml文件 --output_dir训练过程中的模型输出文件夹 --output_name训练模型输出时的文件名 --save_model_assafetensors --prior_loss_weight1.0 --max_train_steps400 --learning_rate1e-4 --optimizer_typeAdamW8bit --xformers --mixed_precisionfp16 --cache_latents --gradient_checkpointing --save_every_n_epochs1 --network_modulenetworks.lora训练产物 LoRA 模型会保存到--output_dir指定文件夹。其他通用选项优化器、学习率调度器等请参阅 通用训练文档 中的常用选项一节。核心网络训练选项详解原文档列出的 LoRA 专属选项如下每一项都直接影响训练效果与资源占用--network_dim指定 LoRA 的 RANK维度例如--network_dim4。默认值为 4。数值越大表示表现力越强但需要更多内存与训练时间不要盲目增大。作为参考options.md 提到一般上限约 128有报告称 32 已足够试训阶段可从 28 起步GUI 默认 8。--network_alpha指定 alpha 值用于防止权重下溢并稳定训练。默认值为 1。alpha 与 dim 的关系为实际生效权重按alpha/rank的比例缩放当network_alpha与network_dim指定相同值时行为与旧版本一致即缩放系数为 1相当于关闭缩放。若训练结果精度不佳往往是权重过小坍缩为 0此时可尝试调低 alpha 以放大存储权重值。注意 alpha 不应超过 rank超过大概率产生非预期结果。--persistent_data_loader_workers在 Windows 环境中指定可大幅缩短 epoch 之间的等待时间。--max_data_loader_n_workers指定数据读取进程数。进程越多数据读取越快GPU 利用越充分但会占用更多主存。默认值为8或CPU 同步执行线程数-1的最小值。若主存不足或 GPU 使用率超过 90%建议将该数值降低到约2或1。--network_weights在训练前读取预训练 LoRA 权重并在此基础上继续训练注意原 LoRA 文件不会被覆盖训练产物另存为新文件。--network_train_unet_only仅启用与 U-Net 相关的 LoRA 模块。在类似 fine tuning 的学习中指定此选项可能很有用。另外docs/LoRA/top_level.md 特别建议SDXL 训练强烈推荐该选项以避免 SDXL 双 Text Encoder 带来的非预期训练结果。--network_train_text_encoder_only仅启用与 Text Encoder 相关的 LoRA 模块可能期望获得类似 Textual Inversion 的效果。--unet_lr为 U-Net 相关 LoRA 模块单独指定学习率覆盖--learning_rate。--text_encoder_lr为 Text Encoder 相关 LoRA 模块单独指定学习率。由于 Text Encoder 的影响波及整个 U-Net 的所有 Attention 块建议将其学习率适当调低如 5e-5以防过拟合。--network_args可指定多个额外参数以空格分隔多个keyvalue具体取值详见下文其他的学习方法。默认情况下既不指定--network_train_unet_only也不指定--network_train_text_encoder_onlyText Encoder 与 U-Net 的 LoRA 模块同时启用。其他的学习方法训练 LoRA-C3Lier在原命令行基础上通过--network_args传入conv_dim即可将 LoRA 扩展到 3x3 卷积层--network_args conv_dim4使用 DyLoRA 训练DyLoRA 出自论文 DyLoRA: Parameter Efficient Tuning of Pre-trained Models using Dynamic Search-Free Low-Rank Adaptation官方实现见 KD-NLP/DyLoRA。论文观点是LoRA 的 rank 并非越高越好而需根据模型、数据集与任务寻找合适值DyLoRA 可在指定的维度范围内同时学习多种 rank 的 LoRA省去逐一搜索最佳 rank 的麻烦。本仓库实现基于官方实现做了自定义扩展原文档注明可能存在缺陷。本仓库 DyLoRA 的特点DyLoRA 训练后的模型文件与普通 LoRA兼容可从模型文件中提取多个低于指定维度rank的 LoRADyLoRA-LierLa 与 DyLoRA-C3Lier 均可训练。DyLoRA 训练方法指定--network_modulenetworks.dylora并通过--network_args传入unit参数划分 rank 的单位。unit应为可被network_dim整除的值即network_dim是unit的倍数未指定时默认为unit1。--network_modulenetworks.dylora --network_dim16 --network_args unit4 --network_modulenetworks.dylora --network_dim32 --network_alpha16 --network_args unit4对于 DyLoRA-C3Lier需在--network_args中额外指定conv_dim。与普通 LoRA 不同此时conv_dim必须与network_dim取值相同--network_modulenetworks.dylora --network_dim16 --network_args conv_dim16 unit4 --network_modulenetworks.dylora --network_dim32 --network_alpha16 --network_args conv_dim32 conv_alpha16 unit8例如使用dim16、unit4训练可以学习并提取 rank 为 4、8、12、16 的 4 个 LoRA。对每个提取的模型生成图像并对比即可选出最佳 rank。unit是本仓库的独有扩展由于 DyLoRA 相比同维度rank的普通 LoRA 学习时间更长因此通过加大分割单位来平衡。其他选项与普通 LoRA 相同。从 DyLoRA 模型中提取 LoRA使用networks文件夹中的extract_lora_from_dylora.py在指定unit后即可从 DyLoRA 模型中提取出各 rank 的 LoRApython networks\extract_lora_from_dylora.py --model foldername/dylora-model.safetensors --save_to foldername/dylora-model-split.safetensors --unit 4--model指定 DyLoRA 模型文件--save_to指定提取结果的保存文件名rank 值会自动附加到文件名中--unit指定训练 DyLoRA 时的 unit 值。分层学习率Hierarchical Learning Rate分层学习率允许为完整模型的25 个块分别指定学习率权重U-Net 结构为 Down 12 块 Mid 1 块 Up 12 块参见 docs/LoRA/options.md 中的结构说明。虽然第一个块没有对应的 LoRA但为兼容分层 LoRA 应用仍要求指定 25 个值同理未扩展到 conv2d 3x3 时某些块可能不存在 LoRA但为统一描述仍始终指定 25 个值。详细设计可参阅 PR #355。在--network_args中指定以下参数down_lr_weightU-Net down blocks 的学习率权重。两种指定方式逐块指定给出 12 个数字如down_lr_weight0,0,0,0,0,0,1,1,1,1,1,1从预设指定如down_lr_weightsine正弦曲线权重可选项为sine、cosine、linear、reverse_linear、zeros。追加数字可将所有权重加上该数字例如sine.5得到 0.251.25 区间。mid_lr_weightU-Net mid block 的学习率权重只需一个数字如mid_lr_weight0.5。up_lr_weightU-Net up blocks 的学习率权重指定方式与down_lr_weight相同。省略未指定的部分按 1.0 处理。权重设为 0 的块将不会创建 LoRA 模块。block_lr_zero_threshold权重小于该值的块不创建 LoRA 模块。默认值为 0。命令行指定示例--network_args down_lr_weight0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0,1.5,1.5,1.5,1.5 mid_lr_weight2.0 up_lr_weight1.5,1.5,1.5,1.5,1.0,1.0,1.0,1.0,0.5,0.5,0.5,0.5 --network_args block_lr_zero_threshold0.1 down_lr_weightsine.5 mid_lr_weight1.5 up_lr_weightcosine.5TOML 配置文件指定示例network_args [ down_lr_weight0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0,1.5,1.5,1.5,1.5, mid_lr_weight2.0, up_lr_weight1.5,1.5,1.5,1.5,1.0,1.0,1.0,1.0,0.5,0.5,0.5,0.5,] network_args [ block_lr_zero_threshold0.1, down_lr_weightsine.5, mid_lr_weight1.5, up_lr_weightcosine.5, ]层次结构维度rank与 alpha同样按 25 个块分别指定维度rank与 alpha实现哪一层放更多表达能力的精细控制。在--network_args中指定block_dims指定每个块的维度rank共 25 个数字例如block_dims2,2,2,2,4,4,4,4,6,6,6,6,8,6,6,6,6,4,4,4,4,2,2,2,2。block_alphas指定每个块的 alpha同样 25 个数字省略时使用network_alpha的值。conv_block_dims将 LoRA 扩展到 Conv2d 3x3 并为每个块指定维度rank。conv_block_alphas扩展到 Conv2d 3x3 时指定每个块的 alpha省略时使用conv_alpha的值。说明由于 LoRA 的目标是 Attention 块部分位置如 IN0、IN3、IN6、IN9 等不含 Attention 块的序号的维度设置会在训练中被忽略详见 docs/LoRA/options.md。不指定时全部块统一使用network_dim与network_alpha的值。命令行指定示例--network_args block_dims2,4,4,4,8,8,8,8,12,12,12,12,16,12,12,12,12,8,8,8,8,4,4,4,2 --network_args block_dims2,4,4,4,8,8,8,8,12,12,12,12,16,12,12,12,12,8,8,8,8,4,4,4,2 conv_block_dims2,2,2,2,4,4,4,4,6,6,6,6,8,6,6,6,6,4,4,4,4,2,2,2,2 --network_args block_dims2,4,4,4,8,8,8,8,12,12,12,12,16,12,12,12,12,8,8,8,8,4,4,4,2 block_alphas2,2,2,2,4,4,4,4,6,6,6,6,8,6,6,6,6,4,4,4,4,2,2,2,2TOML 配置文件指定示例network_args [ block_dims2,4,4,4,8,8,8,8,12,12,12,12,16,12,12,12,12,8,8,8,8,4,4,4,2,] network_args [ block_dims2,4,4,4,8,8,8,8,12,12,12,12,16,12,12,12,12,8,8,8,8,4,4,4,2, block_alphas2,2,2,2,4,4,4,4,6,6,6,6,8,6,6,6,6,4,4,4,4,2,2,2,2,]相关脚本LoRA 合并与提取工具networks/目录下还提供了多个与 LoRA 相关的工具脚本用于合并、提取与推理。merge_lora.py合并 LoRA 到 SD 模型或合并多个 LoRA合并到 Stable Diffusion 模型合并后的模型可像常规 Stable Diffusion ckpt 一样使用python networks\merge_lora.py --sd_model ..\model\model.ckpt --save_to ..\lora_train1\model-char1-merged.safetensors --models ..\lora_train1\last.safetensors --ratios 0.8--v2使用 Stable Diffusion v2.x 模型训练并合并时需指定。--sd_model要合并到的 Stable Diffusion 模型文件仅支持.ckpt或.safetensors目前不支持 Diffusers。--save_to合并后模型的保存路径根据扩展名自动判断为.ckpt或.safetensors。--models已训练的 LoRA 模型文件可指定多个并按顺序合并。--ratios以 01.0 的数字指定每个模型的应用率反映到原始模型中的权重比例。例如接近过拟合时降低应用率可能获得更好结果比率数量必须与模型数量一致。多模型合并格式示例python networks\merge_lora.py --sd_model ..\model\model.ckpt --save_to ..\lora_train1\model-char1-merged.safetensors --models ..\lora_train1\last.safetensors ..\lora_train2\last.safetensors --ratios 0.8 0.5将多个 LoRA 模型相互合并不涉及 SD 模型将多个 LoRA 先合并再应用于 SD 模型与逐个应用相比由于计算顺序不同结果会有微妙差异python networks\merge_lora.py --save_to ..\lora_train1\model-char1-style1-merged.safetensors --models ..\lora_train1\last.safetensors ..\lora_train2\last.safetensors --ratios 0.6 0.4此时无需指定--sd_model--models可指定三个或更多 LoRA若两个模型 1:1 合并比率应为0.5 0.5若为1.0 1.0总权重过大可能产生不理想结果限制v1 与 v2 训练的 LoRA 不能合并rank维度或 alpha 不同的 LoRA 不能合并仅含 U-Net 的 LoRA 与含 U-NetText Encoder 的 LoRA 可以合并但结果未知。其他选项精度合并计算精度可选float、fp16、bf16默认为float保证精度需减少内存可指定 fp16/bf16。save_precision保存模型时的精度同样可选 float/fp16/bf16默认与精度一致。svd_merge_lora.py合并维度不同的 LoRA当多个 LoRA 的维度rank不同时可使用svd_merge_lora.py将它们近似合并为一个 LoRA无法完全复制使用奇异值分解 SVD 近似python networks\svd_merge_lora.py --save_to ..\lora_train1\model-char1-style1-merged.safetensors --models ..\lora_train1\last.safetensors ..\lora_train2\last.safetensors --ratios 0.6 0.4 --new_rank 32 --device cuda选项与merge_lora.py基本相同另增加--new_rank指定要创建的 LoRA rank--new_conv_rank指定要创建的 Conv2d 3x3 LoRA 的 rank省略时与new_rank相同--device指定--device cuda在 GPU 上计算处理速度更快。gen_img_diffusers.py训练后生成验证图像在本仓库的生成脚本gen_img_diffusers.py中添加--network_module与--network_weights选项即可加载 LoRA含义与训练时相同通过--network_mul选项可指定 01.0 的数字调整 LoRA 的应用率等价于merge_lora.py中的 ratio 概念。在 Diffusers pipeline 中手动加载 LoRA以下示例展示了如何脱离生成脚本、直接用 Diffusers 加载多个 LoRA所需文件仅为networks/lora.py该示例仅在 Diffusers 版本 0.10.2 中可正常运行import torch from diffusers import StableDiffusionPipeline from networks.lora import LoRAModule, create_network_from_weights from safetensors.torch import load_file # if the ckpt is CompVis based, convert it to Diffusers beforehand with tools/convert_diffusers20_original_sd.py. See --help for more details. model_id_or_dir rmodel_id_on_hugging_face_or_dir device cuda # create pipe print(fcreating pipe from {model_id_or_dir}...) pipe StableDiffusionPipeline.from_pretrained(model_id_or_dir, revisionfp16, torch_dtypetorch.float16) pipe pipe.to(device) vae pipe.vae text_encoder pipe.text_encoder unet pipe.unet # load lora networks print(floading lora networks...) lora_path1 rlora1.safetensors sd load_file(lora_path1) # If the file is .ckpt, use torch.load instead. network1, sd create_network_from_weights(0.5, None, vae, text_encoder,unet, sd) network1.apply_to(text_encoder, unet) network1.load_state_dict(sd) network1.to(device, dtypetorch.float16) # # You can merge weights instead of apply_toload_state_dict. network.set_multiplier does not work # network.merge_to(text_encoder, unet, sd) lora_path2 rlora2.safetensors sd load_file(lora_path2) network2, sd create_network_from_weights(0.7, None, vae, text_encoder,unet, sd) network2.apply_to(text_encoder, unet) network2.load_state_dict(sd) network2.to(device, dtypetorch.float16) lora_path3 rlora3.safetensors sd load_file(lora_path3) network3, sd create_network_from_weights(0.5, None, vae, text_encoder,unet, sd) network3.apply_to(text_encoder, unet) network3.load_state_dict(sd) network3.to(device, dtypetorch.float16) # prompts prompt masterpiece, best quality, 1girl, in white shirt, looking at viewer negative_prompt bad quality, worst quality, bad anatomy, bad hands # exec pipe print(generating image...) with torch.autocast(cuda): image pipe(prompt, guidance_scale7.5, negative_promptnegative_prompt).images[0] # if not merged, you can use set_multiplier # network1.set_multiplier(0.8) # and generate image again... # save image image.save(rby_diffusers..png)要点解析create_network_from_weights的第一个参数0.5 / 0.7 / 0.5即各 LoRA 的乘法因子multiplier加载时可实时调节强度通过apply_toload_state_dict方式挂载 LoRA 后可在推理前调用network.set_multiplier(0.8)动态调整应用率无需重新加载若想直接合并权重可使用merge_to(text_encoder, unet, sd)此时set_multiplier不生效若基础模型是 CompVis 格式的 ckpt需先用tools/convert_diffusers20_original_sd.py转换为 Diffusers 格式。extract_lora_from_models.py从两个模型的差异创建 LoRA参考 cloneofsimo/lora 的讨论 实现将两个模型例如原始模型与微调后模型的差异用 SVD 近似为 LoRA。数学公式未改变。python networks\extract_lora_from_models.py --model_org base-model.ckpt --model_tuned fine-tuned-model.ckpt --save_to lora-weights.safetensors --dim 4--model_org原始 Stable Diffusion 模型.ckpt 或 .safetensors。后续要应用生成的 LoRA 时需指定此模型作为基础。--model_tuned目标微调后模型例如 Fine Tuning 或 DreamBooth 训练后的模型.ckpt 或 .safetensors。--save_toLoRA 模型的保存路径。--dimLoRA 的维数。生成的 LoRA 可以像普通训练的 LoRA 一样使用。若两个模型的 Text Encoder 相同生成的 LoRA 将是仅含 U-Net 的 LoRA。其他选项--v2使用 v2.x 模型时指定--device指定--device cuda在 GPU 上计算CPU 上也不会太慢大约快几倍--save_precision保存格式可选float、fp16、bf16默认float--conv_dim指定后将 LoRA 扩展到 Conv2d 3x3 并指定其 rank。图像大小调整脚本在 Aspect Ratio Bucketing 功能扩展中现在可以直接将小图像用作教师数据而不必放大。有报告指出将原始教师图像缩小后的版本加入教师数据可提升精度本脚本整理自 bmaltais 的贡献。脚本为tools/resize_images_to_resolution.py。python tools\resize_images_to_resolution.py --max_resolution 512x512,384x384,256x256 --save_as_png --copy_associated_files 源图像文件夹 目标文件夹原始图像与调整大小后的图像都会保存到目标文件夹调整大小后的图像会在文件名中附加调整后的分辨率如512x512与实际图像大小不同小于调整后分辨率的图像不会被放大。--max_resolution调整大小后的目标尺寸可指定多个按面积适配。例如512x512,384x384,256x256会使目标文件夹中每张图变成原始大小 调整后大小 x3共 4 张。--save_as_png以 PNG 格式保存省略则默认以 JPEGquality100保存。--copy_associated_files将与图像同文件名扩展名不同的关联文件如 caption 文本一并复制到对应位置。其他选项divisible_by将图像中心裁剪到能被该值整除的尺寸宽、高分别处理使调整后的图像尺寸可被该值整除。interpolation缩小时的插值方法可选area、cubic、lanczos4默认area。追加信息与 cloneofsimo 代码库的区别截至 2022 年 12 月 25 日本代码库将 LoRA 的应用范围扩展到了Text Encoder 的 MLP、U-Net 的 FFN 以及 Transformer 的输入/输出投影增强了表现力但内存使用量也随之增加接近 8GB 显存的上限。此外模块交换机制也与原实现完全不同。关于未来的扩展除了 LoRA 之外仓库还计划添加其他扩展以支持更多功能。从当前仓库结构看kohya_gui/中已包含 LoHa/LoKR 等更多网络模块的训练入口如extract_lycoris_locon_gui.py、merge_lycoris_gui.py、resize_lora_gui.py等docs/LoRA/options.md亦提及 LoHa 与 LoCon 类型说明该训练体系已从标准 LoRA 逐步扩展为更丰富的参数高效微调工具集。小结本文完整覆盖了 kohya_sstrain_network.py的 LoRA 训练链路从 LoRA 低秩原理与 LoRA-LierLa / LoRA-C3Lier 两种变体出发给出了可直接复制的命令行训练模板与核心选项network_dim、network_alpha、分网络学习率、数据加载并发等的取值建议并深入讲解了 DyLoRA 动态秩训练与提取、分层学习率、层次结构维度这三类高级配置最后通过merge_lora.py、svd_merge_lora.py、gen_img_diffusers.py、Diffusers 手动加载示例与extract_lora_from_models.py串联起训练 → 评估 → 合并 → 分发的完整生态。读者可结合 通用训练文档 与 数据集配置说明 完成端到端实战。【免费下载链接】kohya_ss项目地址: https://gitcode.com/GitHub_Trending/ko/kohya_ss创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考