尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

kohya_ss 实战:SDXL ControlNet-LLLite 轻量级 ControlNet 的训练、推理与合成数据集构建指南

kohya_ss 实战:SDXL ControlNet-LLLite 轻量级 ControlNet 的训练、推理与合成数据集构建指南 kohya_ss 实战SDXL ControlNet-LLLite 轻量级 ControlNet 的训练、推理与合成数据集构建指南【免费下载链接】kohya_ss项目地址: https://gitcode.com/GitHub_Trending/ko/kohya_ssControlNet-LLLiteLoRA Like Lite是 kohya_ss 生态中一种受 LoRA 启发的轻量级 ControlNet 实现仅需远小于标准 ControlNet 的参数量即可为 SDXL 模型注入边缘Canny、深度depth等结构控制能力。本文以 docs/train_lllite_README.md 为骨架完整讲解其模型结构、数据集组织方式、训练与推理命令、以及生成图像→Canny 加工→写 caption→配置 TOML的合成数据集四步法并结合仓库内 GUI 源码与测试用例补充实现细节帮助你从零跑通一条可复现的 LLLite 训练链路。ControlNet-LLLite 是什么从 ControlNet 到轻量化ControlNet-LLLite 是标准 ControlNet 的轻量级版本名字中的 LLLite 即 LoRA Like Lite——它从 LoRA 中汲取灵感采用一种轻量化结构来实现控制信号注入。当前版本仅支持 SDXL 基底模型。从原文档对模型结构的描述可以把握其核心设计一个 LLLite 模块由两部分组成conditioning image embedding把控制用图像映射到潜在空间和一个结构与 LoRA 类似的小型网络该模块像 LoRA 一样被叠加到 U-Net 的 Linear 层和 Conv 层上受推理环境限制目前只注入CrossAttention层具体为 attn1 的 q/k/v 与 attn2 的 q。也就是说LLLite 并不是一个完整复制 U-Net 的 ControlNet 分支而是一组小而精的适配器权重因此对显存和算力的要求显著更低。原文档强调这是一个极实验性的实现未来可能发生较大变化原文This is an extremely experimental implementation and may change significantly in the future使用时应留意版本演进。在 kohya_ss 仓库中的定位与前置条件需要先说明本仓库的角色kohya_ss 是一个基于 Gradio 的 GUI/CLI 前端真正的训练脚本位于其sd-scripts子模块中。LLLite 相关的训练脚本sdxl_train_control_net_lllite.py与推理脚本sdxl_gen_img.py都由 sd-scripts 提供GUI 通过accelerate launch拼接命令调用它们。仓库内的 kohya_gui/anima_lllite_gui.py 提供了面向Anima 模型的 ControlNet-LLLite 训练标签页对应 GH #3525其模块注释明确写着它封装的是 sd-scripts 的anima_train_control_net_lllite.py并强调后端是实验性的blocks_to_swap、cpu_offload_checkpointing、unsloth_offload_checkpointing、deepspeed、fused_backward_pass等选项不被支持、因此在界面中刻意不暴露。而本文主讲的 SDXL 版本sdxl_train_control_net_lllite.py是最早出现、被原文档完整描述的版本。另外README.md 的 masked loss 一节也引用了本 LLLite 文档的数据集规范masked loss 使用 ControlNet 数据集格式来指定掩码掩码图像应为 RGB 图像R 通道像素值 255 视为掩码区域只对该区域计算损失、0 视为非掩码0–255 的像素值会被换算为 0–1 的损失权重。这说明了 LLLite 的conditioning_data_dir数据集格式在仓库中被更广泛复用。数据集准备conditioning image 的组织与约束LLLite 训练在常规数据集之外还需要一份控制信号数据。核心规则如下在数据集配置中通过conditioning_data_dir指定存放 conditioning image 的目录conditioning image 的文件 basename 必须与训练图像一致例如img_001.png对应img_001.png训练时系统会自动把 conditioning image 缩放到与训练图像相同的尺寸conditioning image 不需要 caption 文件当前限制不能使用random_crop。一个使用 DreamBooth 方式、携带 caption 文件的数据集子集配置如下[[datasets.subsets]] image_dir path/to/image/dir caption_extension .txt conditioning_data_dir path/to/conditioning/image/dir原文档给出的数据组织建议很明确最省事的做法是使用合成数据集——用原模型自己生成一批图像作为训练图像再把它们加工后的结果如 Canny 边缘图作为 conditioning image。不过文档也提醒这种合成数据集的质量可能存在问题。关于训练图像的内容有一个容易踩坑的要点如果训练图像的画风与原模型不同模型不仅要学习控制信号还要额外学习画风。而 ControlNet-LLLite 容量很小并不适合学习画风遇到这种情况应当按后文所述把维度--cond_emb_dim/--network_dim调大一些。训练sdxl_train_control_net_lllite.py 与关键参数训练入口是 sd-scripts 的sdxl_train_control_net_lllite.py核心参数只有两个是 LLLite 特有的参数含义样本 Canny 取值--cond_emb_dimconditioning image embedding 的维度32--network_dimLoRA 式模块的 rank64其余选项与sdxl_train_network.py基本一致但不需要指定--network_module。由于训练期间显存占用很大原文档强烈建议开启省内存选项打开cache 类选项latents 缓存、text encoder 输出缓存等开启gradient checkpointing使用--full_bf16以 BFloat16 全程训练要求 RTX 30 系列及以后的 GPU文档确认在24GB VRAM环境下可正常运行。维度选择的经验Canny 样本使用了 cond_emb_dim32、network_dim64应根据目标 conditioning image 的特征调整。文档特别提醒Canny 难度较高若是 depth 等信号维度减半如 cond_emb_dim≈16、network_dim≈32可能更合适。以下是原文档给出的完整.toml训练配置示例可直接作为模板pretrained_model_name_or_path /path/to/model_trained_on.safetensors max_train_epochs 12 max_data_loader_n_workers 4 persistent_data_loader_workers true seed 42 gradient_checkpointing true mixed_precision bf16 save_precision bf16 full_bf16 true optimizer_type adamw8bit learning_rate 2e-4 xformers true output_dir /path/to/output/dir output_name output_name save_every_n_epochs 1 save_model_as safetensors vae_batch_size 4 cache_latents true cache_latents_to_disk true cache_text_encoder_outputs true cache_text_encoder_outputs_to_disk true network_dim 64 cond_emb_dim 32 dataset_config /path/to/dataset.toml要点解读cache_latentscache_latents_to_disk、cache_text_encoder_outputscache_text_encoder_outputs_to_disk把 VAE 编码结果与 text encoder 输出预先算好并缓存到磁盘避免训练中反复前向计算是省显存的关键gradient_checkpointing true以少量计算换显存mixed_precision bf16与full_bf16 true组合全程 BFloat16显著降低显存占用vae_batch_size 4限制 VAE 编码的批大小配合缓存使用xformers true启用 xFormers 加速注意力。GUI 侧的实现佐证LLLite 参数面板虽然仓库内 GUI 当前提供的是 Anima 版 LLLite 训练页kohya_gui/anima_lllite_gui.py但其中的 LLLite 参数面板可以侧面印证这类训练的调参维度Anima 版参数名带lllite_前缀SDXL 版与之对应但略有差异cond_emb_dim默认 32shared cond_emb width即 conditioning embedding 维度lllite_mlp_dim默认 64LoRA-rank-like hidden dim即类似 LoRA rank 的隐藏维度lllite_cond_dim默认 64conditioning 主干内部宽度lllite_cond_resblocks默认 1conditioning 处理残差块数量lllite_target_layers可选预设如self_attn_q、self_attn_qkv、self_attn_q_pre,mlp_fc1_pre等SDXL 版目前固定注入 attn1 q/k/v 与 attn2 qlllite_multiplier默认 1.0控制注入强度设为 0 会在训练时禁用 LLLitelllite_cond_in_channels3RGB 控制4inpaintingRGBmask模式。对应地tests/test_anima_lllite_gui.py 中验证了这些参数的转发行为cond_emb_dim/lllite_mlp_dim/lllite_cond_dim/lllite_cond_resblocks/lllite_multiplier会被写入生成的 TOML 配置test_lllite_dims_are_forwardedlllite_use_aspp仅在开启时才出现在配置里test_lllite_use_aspp_forwarded_when_enabled/test_lllite_use_aspp_omitted_when_disabled且不支持的 offload 标志绝不会被写入test_unsupported_mvp_flags_are_never_emitted。测试同时确认了命令行会调用anima_train_control_net_lllite.py而不是 LoRA 或 SDXL-LLLite 脚本test_invokes_anima_train_control_net_lllite、test_does_not_invoke_lora_or_sdxl_lllite_scripts从侧面印证了训练脚本的命名约定。推理sdxl_gen_img.py 与 conditioning image 指定训练完成后用脚本生成图像时运行sdxl_gen_img.py用--control_net_lllite_models指定 LLLite 模型文件维度会自动从模型文件中读取无需手动指定用--guide_image_path指定推理用的 conditioning image注意推理时不做任何预处理preprocess例如 Canny 场景必须自己先对引导图做 Canny 处理黑底白线--control_net_preps、--control_net_weights、--control_net_ratios这三个参数不受支持。结合 docs/gen_img_README-ja.md 中对--guide_image_path的说明该选项同样适用于一般 img2img / ControlNet 场景可传入单张图片或文件夹文件夹时依次使用其中图片本 LLLite 文档则明确了其作为 LLLite 条件图的用法与预处理要求。合成数据集的四步法原文档为没有现成配对数据的情况给出了一套完整的合成数据集流水线共四步生成训练图像 → 加工出 conditioning image → 生成 caption 文件 → 编写数据集 TOML。第一步用基底模型生成训练图像用训练所用的基底模型即想赋予其控制能力的那个模型生成图像可用 Web UI 或 ComfyUI 完成。图像尺寸取模型默认尺寸如 1024×1024即可也可使用 bucketing此时按任意合适分辨率生成。生成图像时的 caption 与设置应与你未来用训练好的 LLLite 生成图像时的设置保持一致——这是保证控制能力在训练与推理间对齐的关键。生成结果保存到任意目录之后在数据集配置中指定该目录。也可以直接用本仓库sd-scripts的sdxl_gen_img.py批量生成。原文档给出了一个面向24GB VRAM的完整示例命令python sdxl_gen_img.py --ckpt path/to/model.safetensors --n_iter 1 --scale 10 --steps 36 --outdir path/to/output/dir --xformers --W 1024 --H 1024 --original_width 2048 --original_height 2048 --bf16 --sampler ddim --batch_size 4 --vae_batch_size 2 --images_per_prompt 512 --max_embeddings_multiples 1 --prompt {portrait|digital art|anime screen cap|detailed illustration} of 1girl, {standing|sitting|walking|running|dancing} on {classroom|street|town|beach|indoors|outdoors}, {looking at viewer|looking away|looking at another}, {in|wearing} {shirt and skirt|school uniform|casual wear} { |, dynamic pose}, (solo), teen age, {0-1$$smile,|blush,|kind smile,|expression less,|happy,|sadness,} {0-1$$upper body,|full body,|cowboy shot,|face focus,} trending on pixiv, {0-2$$depth of fields,|8k wallpaper,|highly detailed,|pov,} {0-1$$summer, |winter, |spring, |autumn, } beautiful face { |, from below|, from above|, from side|, from behind|, from back} --n nsfw, bad face, lowres, low quality, worst quality, low effort, watermark, signature, ugly, poorly drawn该命令的要点--batch_size 4 --vae_batch_size 2是 24GB 显存下的取值需按自身 VRAM 调整prompt 中使用了{a|b|c}形式的通配符随机机制如{portrait|digital art|...}、{0-1$$smile,|blush,|...}按概率出现可批量产出多样化图像按需修改--original_width/--original_height 2048与 SDXL 训练时的条件尺寸语义一致--n之后为负面 prompt。第二步用外部程序加工出 conditioning image把生成的图像加工成控制信号保存到另一目录这些加工图即为 conditioning image。以 Canny 为例原文档给出的 OpenCV 脚本如下含已注释的随机阈值备选方案import glob import os import random import cv2 import numpy as np IMAGES_DIR path/to/generated/images CANNY_DIR path/to/canny/images os.makedirs(CANNY_DIR, exist_okTrue) img_files glob.glob(IMAGES_DIR /*.png) for img_file in img_files: can_file CANNY_DIR / os.path.basename(img_file) if os.path.exists(can_file): print(Skip: img_file) continue print(img_file) img cv2.imread(img_file) # random threshold # while True: # threshold1 random.randint(0, 127) # threshold2 random.randint(128, 255) # if threshold2 - threshold1 80: # break # fixed threshold threshold1 100 threshold2 200 img cv2.Canny(img, threshold1, threshold2) cv2.imwrite(can_file, img)脚本会跳过已存在的输出文件断点续跑友好默认使用固定阈值(100, 200)如果想增强数据多样性可改用注释中的随机阈值逻辑保证两个阈值之差大于 80。depth、lineart 等其他控制信号同理用对应工具处理即可。第三步为每张训练图像生成 caption 文件为每张训练图像创建 basename 相同的.txtcaption 文件内容可直接复用生成图像时使用的 prompt。如果图像是用sdxl_gen_img.py生成的prompt 会被写入 PNG 元数据img.text[prompt]可用以下脚本批量抽取生成 captionimport glob import os from PIL import Image IMAGES_DIR path/to/generated/images img_files glob.glob(IMAGES_DIR /*.png) for img_file in img_files: cap_file img_file.replace(.png, .txt) if os.path.exists(cap_file): print(fSkip: {img_file}) continue print(img_file) img Image.open(img_file) prompt img.text[prompt] if prompt in img.text else if prompt : print(fPrompt not found in {img_file}) with open(cap_file, w) as f: f.write(prompt \n)第四步编写数据集 TOMLconditioning_data_dir既可以直接作为训练脚本的命令行参数传入也可以在.toml中配置。原文档给出的完整示例[general] flip_aug false color_aug false resolution [1024,1024] [[datasets]] batch_size 8 enable_bucket false [[datasets.subsets]] image_dir path/to/generated/image/dir caption_extension .txt conditioning_data_dir path/to/canny/image/dir这份配置与仓库内 test/config/dataset-finetune.toml 等测试配置的结构一致[general]设置分辨率与增强开关、[[datasets]]设置批大小与 bucketing、[[datasets.subsets]]指定图像目录与 caption 扩展名额外多出的就是conditioning_data_dir一行。注意示例中flip_aug/color_aug均为 false、enable_bucket为 false需要 bucketing 时可按需开启。至此四步产出物齐备训练图像目录、conditioning image 目录basename 一一对应、caption 文件、数据集 TOML即可交给前文训练配置中的dataset_config开始训练。调参建议与注意事项汇总结合原文档与仓库实现把 LLLite 使用中的关键注意事项归纳如下显存策略训练必须配合 latents/text encoder 缓存与 gradient checkpointingRTX 30 系以上 GPU 建议开启full_bf16。原文档确认 24GB VRAM 可跑通。维度调节Canny 样本为cond_emb_dim32, network_dim64特征更简单的控制信号如 depth可减半画风偏差大的数据则需加大维度。画风耦合训练图与原模型画风差异大时LLLite 会被迫学习画风而非纯控制因其容量小应尽量保持画风一致或增大维度。推理无预处理--guide_image_path传入的必须是已加工好的控制图--control_net_preps/--control_net_weights/--control_net_ratios均不受支持。数据集约束conditioning image 与训练图 basename 必须一致、不需要 caption、会被自动缩放random_crop不可用。实验性质LLLite 实现极早期、可能大幅变更仓库内 Anima 版 GUI 也明确声明后端 assert 不支持多种 offload/DeepSpeed 等加速选项说明该技术栈仍在快速演进中升级 sd-scripts 子模块时需留意脚本接口变化。延伸阅读本文配套的日语原版说明docs/train_lllite_README-ja.mdLLLite 数据集格式在 masked loss 中的复用说明见 README.md 的 Masked loss 一节仓库内 Anima 版 LLLite 训练页实现kohya_gui/anima_lllite_gui.pyLLLite 参数转发与命令生成的回归测试tests/test_anima_lllite_gui.py--guide_image_path在生成脚本中的通用用法docs/gen_img_README-ja.md训练脚本sdxl_train_control_net_lllite.py/anima_train_control_net_lllite.py位于仓库的sd-scripts子模块内GUI 通过accelerate launch调用本文所述 TOML 键值即对应其命令行参数【免费下载链接】kohya_ss项目地址: https://gitcode.com/GitHub_Trending/ko/kohya_ss创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表