ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

LMFlow 文本到图像(Text2Img)扩散模型微调实战指南:基于 diffusers 与 LoRA 的完整工作流

LMFlow 文本到图像(Text2Img)扩散模型微调实战指南:基于 diffusers 与 LoRA 的完整工作流 人工智能大模型微调模型评测强化学习多模态【免费下载链接】LMFlowAn Extensible Toolkit for Finetuning and Inference of Large Foundation Models. Large Models for All.项目地址https://gitcode.com/gh_mirrors/lm/LMFlow点击查看免费下载导读本文基于 LMFlow 仓库中 contrib/text2image 模块的官方文档系统讲解如何在 LMFlow 框架下借助 Hugging Face diffusers 生态对 Stable Diffusion 等文生图扩散模型进行端到端微调。全文覆盖环境准备、数据集目录结构与 JSON 格式规范、一键微调脚本finetune_t2i.sh的参数含义、基于 LoRA 的轻量训练原理含源码级剖析以及训练过程中的验证、测试与 checkpoint 保存机制。读完本文你将能够独立组织自己的 text-image 数据集并完整跑通一次 Stable Diffusion 的个性化微调如概念定制、风格迁移。一、模块定位LMFlow 生态中的 Text2Img 微调分支LMFlow 是一个面向大模型微调与推理的可扩展工具箱其核心能力集中在语言模型领域而 contrib/text2image 则是仓库中专门为文生图扩散模型微调开辟的独立分支。官方文档将其描述为 a fork function for fine-tuning text2image diffusion model based on diffusers, under the framework of lmflow——即把 diffusers 的微调能力接入 LMFlow 的框架约定复用了 LMFlow 的DatasetArguments参数体系与BaseTuner训练器基类。从源码结构看该分支由四个核心文件组成finetune_t2i.sh一键微调启动脚本解析 CLI 参数并调用accelerate launchfinetune_t2i.py微调入口负责加载模型、构建数据集并启动训练diffuser_args.py三类参数类模型、数据集、训练器的定义diffuser_finetuner.pyDiffuserModelTuner训练器实现继承自 LMFlow 的BaseTuner见 src/lmflow/pipeline/finetuner.py 的同类设计。二、环境准备在安装好lmflow主包之后只需为 t2i 微调补充额外依赖pip install -r contrib/text2image/requirements.txt该 requirements.txt 的核心依赖为diffusers0.29.2。之所以单独列出是因为扩散模型微调依赖 diffusers、peft用于 LoRA、accelerate用于多卡训练、wandb用于日志与验证图片跟踪等一整套生态而主仓库的基础环境未必包含这些组件。需要特别说明的是当前脚本在 finetune_t2i.py 开头做了两项环境变量预设无需用户干预os.environ[TOKENIZERS_PARALLELISM] false # 避免多进程 tokenizer 并行告警 os.environ[WANDB_MODE] offline # wandb 以离线模式运行不强制联网上传其中WANDB_MODEoffline意味着验证生成的图片会记录到本地而非云端可结合--logging_dir参数查看。三、数据准备目录结构与 JSON 格式3.1 目录树结构文档明确规定数据集必须采用以下组织方式在dataset_path下默认使用img目录存放图片文件train.json、valid.json、test.json分别作为训练、验证、测试数据的索引。后两者是可选的如果只提供了其中一个另一个会被自动设置为同一个文件该逻辑由 diffuser_args.py 中的__post_init__实现。data └── example ├── img │ ├── 00.jpg │ ├── 01.jpg │ ├── 02.jpg │ ├── 03.jpg │ └── 04.jpg ├── train.json ├── [valid.json] └── [test.json]3.2 train.json训练数据格式训练集 JSON 的类型为text-image每个实例由图片文件名与对应文本描述组成。以文档中的 DreamBooth 式概念定制用SKS稀有 token 指代特定物体为例{ type: text-image, instances: [ { image: 00.jpg, text: A photo of a SKS dog }, ... ] }从 t2i_dataset.py 的实现可以确认CustomT2IDataset会断言data_dict[type] text-image类型不符直接报错图片通过Image.open读取后统一convert(RGB)图片路径 dataset_path/image_folder instance[image]image_folder默认取参数--image_folder脚本中传入img。3.3 valid.json / test.json验证与测试数据格式验证与测试集只需纯文本提示词text-only类型供训练中生成样例图片、评估模型表现使用{ type: text-only, instances: [ { text: A photo of a SKS dog in front of Eiffel Tower. }, ... ] }官方还提供了一个可直接参考的示例数据 dog_t2i_data_example文档中的外链本文不再重复。实际构建时建议训练图片保持主体清晰、背景多样文本提示词与概念强绑定如统一出现SKS占位符验证/测试提示词覆盖不同场景组合地点、姿态、风格用于观察模型泛化能力图片尺寸尽量一致或接近--img_size设定值减少 Resize/Crop 带来的形变。3.4 数据加载与预处理的源码路径t2i_dataset.py 的build_t2i_dataset是完整的数据流水线CustomT2IDataset读取原始图片与文本EncodePreprocessor先对图片做Resize → CenterCrop/RandomCrop → ToTensor → Normalize(mean[0.5], std[0.5])再通过 VAE 编码得到 latent同时对文本用 CLIP tokenizer text encoder 得到 embeddingt2i_dataset.pyPreprocessedT2IDataset把所有样本预先编码成{image: latent, text: embedding}缓存在内存中。也就是说训练期间 VAE 与 CLIP 文本编码器只在前处理阶段运行一次训练循环内喂给 UNet 的是已经编码好的 latent 与 embedding——这是该实现省显存、提速的关键设计。前处理完成后入口脚本会立刻del tokenizer, text_encoder, vae并清空 CUDA 缓存finetune_t2i.py进一步释放显存。四、一键微调finetune_t2i.sh4.1 基本用法文档给出的最简启动方式bash contrib/text2image/finetune_t2i.sh \ model_name_or_pathstabilityai/stable-diffusion-2-1 \ dataset_pathdata/example其中model_name_or_pathHugging Face 上的模型名或本地预训练模型路径如stabilityai/stable-diffusion-2-1dataset_path按上文目录树组织的数据集根目录。4.2 脚本支持的参数脚本通过while/case循环解析-m/-t/-d/-o/-p/-i六个短选项finetune_t2i.sh默认值如下参数短选项默认值说明model_name_or_path-mstabilityai/stable-diffusion-2-1HF 模型名或本地模型路径model_type-tunet微调目标unet或transformer后者尚未支持dataset_path-ddata/example数据集根目录output_dir-ooutput微调结果输出目录main_port-p29500accelerate 分布式训练主端口img_size-i768微调/验证/测试的图像尺寸关于model_typetransformer文档明确说明该类型暂未支持。对应实现中finetune_t2i.py 在传入transformer时直接抛出NotImplementedError其他非法值则抛出ValueError因此当前版本请固定使用unet。4.3 脚本背后的实际命令脚本最终执行的是finetune_t2i.shaccelerate launch \ --config_file./accelerate_t2i_config.yaml \ --main_port${main_port} \ finetune_t2i.py \ --model_name_or_path${model_name_or_path} \ --model_type${model_type} \ --use_loraTrue \ --lora_target_module to_k to_q to_v to_out.0 add_k_proj add_v_proj \ --dataset_path${dataset_path} \ --image_folderimg \ --image_size${img_size} \ --train_filetrain.json \ --validation_filevalid.json \ --test_filetest.json \ --output_dir${output_dir} \ --logging_dirlogs \ --overwrite_output_dirTrue \ --mixed_precisionfp16 \ --num_train_epochs100 \ --train_batch_size1 \ --learning_rate1e-4 \ --valid_steps50accelerate_t2i_config.yaml 默认配置为单机 4 卡num_processes: 4、gpu_ids: all、mixed_precision: fp16。如果显卡数量或显存规模不同请相应调整该文件如改为单卡可将distributed_type设为NO、num_processes设为1。五、参数详解三类 Dataclass 的完整字段脚本只是入口真正决定行为的是 diffuser_args.py 中三个 dataclass 的全部字段。它们经HfArgumentParser合并解析均可直接通过命令行覆盖。5.1 T2IDatasetArguments数据集参数继承自 LMFlow 的DatasetArgumentssrc/lmflow/args.py新增字段字段默认值说明image_folderNone必填图片目录名如imgimage_size512图片处理尺寸脚本默认传 768image_crop_typecenter裁剪方式center为中心裁剪否则为随机裁剪text_embedding_typeraw文本 embedding 获取方式is_t2iTrue模态类型标记继承自基类的关键字段脚本中已显式覆盖train_file、validation_file、test_file。__post_init__中还有若干自动校验逻辑diffuser_args.pytrain_file缺省时自动探测train.json不存在则报错各文件必须为.json扩展名否则断言失败校验/测试文件若在磁盘上不存在会被静默置回None校验与测试文件只提供一个时两者共用同一个文件。5.2 DiffuserModelArguments模型参数字段默认值说明model_name_or_pathNone必填基座模型名或路径model_typeNoneunet当前唯一支持use_loraFalse是否使用 LoRA 微调lora_r8LoRA 秩越小参数量越少lora_alpha8LoRA 缩放系数论文中的 alpha控制合并比例lora_target_modulesNone应用 LoRA 的模块列表lora_dropout0.1LoRA 线性层 dropout 率脚本默认开启 LoRA目标模块为 UNet 注意力层的投影矩阵to_k to_q to_v to_out.0 add_k_proj add_v_proj。对应实现见 finetune_t2i.py开启 LoRA 时先将模型整体requires_grad_(False)再以gaussian初始化权重添加 PEFT 适配器不开启时则全量requires_grad_(True)。5.3 DiffuserTunerArguments训练器参数字段默认值说明output_diroutput输出目录logging_dirlogs日志目录overwrite_output_dirFalse是否清空重建输出目录mixed_precisionno混合精度脚本传fp16do_trainTrue是否训练num_train_epochs50训练轮数脚本传 100train_batch_size1单卡 batch sizelearning_rate1e-4学习率weight_decay0.0权重衰减do_valid/do_testTrue是否做验证/测试valid_steps50每多少步验证一次valid_seed/test_seed42验证/测试的随机种子保证生成样例可复现save_steps500每多少步保存 checkpointsave_total_limitNone保留 checkpoint 总数上限六、训练循环与底层原理源码级剖析DiffuserModelTunerdiffuser_finetuner.py继承自BaseTuner其tune()方法完整复刻了 Stable Diffusion 官方训练脚本的核心逻辑1. 噪声调度器与优化器从基座模型加载DDPMSchedulerdiffuser_finetuner.py只过滤requires_gradTrue的参数即 LoRA 参数送入 AdamW学习率1e-4、weight decay 0使用 diffusers 的get_scheduler(constant)恒定学习率调度器diffuser_finetuner.py。2. 加噪与去噪目标每步训练随机采样 timestep向 latent 加入高斯噪声noise torch.randn_like(clean_latents) timesteps torch.randint(0, noise_scheduler.config.num_train_timesteps, (bsz,), device...) noisy_latents noise_scheduler.add_noise(clean_latents, noise, timesteps) model_pred model(noisy_latents, timesteps, text_embedding)[0]损失目标依据调度器的prediction_type分支epsilon类型直接以噪声为回归目标v_prediction类型则回归 v 速度diffuser_finetuner.py损失函数为 MSE。这是扩散模型训练的标准噪声预测损失。3. 验证机制valid_steps 触发每valid_steps步在主进程上用当前 UNet 替换 DiffusionPipeline 中的 UNet以valid_seed固定的生成器按valid.json中的每个提示词生成一张图结果写入output_dir/step_{global_step}_validation/并同步到 wandbdiffuser_finetuner.py。这一步让你在训练中途直观看到生成质量的演进。4. 测试机制训练结束后训练完成后若do_testTrue且有test.json会用test_seed生成最终测试图集保存到output_dir/test_final/diffuser_finetuner.py。5. Checkpoint 保存策略LoRA 模式将 PEFT 状态字典转换为 diffusers 格式通过LoraLoaderMixin.save_lora_weights保存为 diffusers 兼容的 LoRA 权重保存到output_dir/checkpoints/final/非 LoRA 模式用accelerator.save保存完整模型状态字典final.pt若 checkpoint 数量超过max_checkpoints会删除最旧的 checkpoint 以控制磁盘占用diffuser_finetuner.py。6. 分布式与精度模型、数据、优化器、调度器均经accelerator.prepare包装mixed_precisionfp16时训练权重 dtype 为torch.float16diffuser_finetuner.py。main_port参数即传给accelerate launch --main_port用于分布式通信。七、LoRA 微调轻量概念定制的推荐路径脚本默认--use_loraTrue这也是文档示例Stable Diffusion 2.1 SKS宠物狗定制的标准做法。LoRA 模式的核心收益在于只训练 UNet 注意力层的低秩适配矩阵目标模块为to_k/to_q/to_v/to_out.0/add_k_proj/add_v_proj训练参数量远小于全量微调显存占用低适合单卡或小显存环境产物是 diffusers 格式的 LoRA 权重可通过pipeline.load_lora_weights(...)随时加载合并到原模型实现一个底座模型 多个轻量 LoRA的多概念复用训练结束后自动以pytorch_lora_weights.safetensors形式保存diffuser_finetuner.py。若想全量微调将脚本中的--use_loraTrue改为--use_loraFalse即可代价是显存需求显著上升请务必结合accelerate_t2i_config.yaml的卡数规划。八、从零跑通全流程操作清单安装依赖先安装 LMFlow 主包再执行pip install -r contrib/text2image/requirements.txt准备数据按 3.1 的目录树组织img/与三个 JSON 文件参考 3.2/3.3 格式注意train.json类型必须是text-image启动训练bash contrib/text2image/finetune_t2i.sh \ model_name_or_pathstabilityai/stable-diffusion-2-1 \ dataset_pathdata/example按需调参修改脚本内默认值或直接追加-m/-d/-o/-i等短选项显存不足时降低img_size如 512、调低train_batch_size、改用单卡配置观察训练训练中每valid_steps步在output_dir/step_*_validation/下生成验证图配合 wandb 离线日志output_dir/logs监控 loss 与学习率获取产物LoRA 权重位于output_dir/checkpoints/final/测试图集位于output_dir/test_final/。九、已知限制与注意事项model_typetransformer尚未实现当前只能微调unet源码直接抛NotImplementedError训练入口使用WANDB_MODEoffline未联网也能运行但 wandb 需要本地有可写缓存目录--overwrite_output_dirTrue会先删除已有输出目录仅主进程执行见 finetune_t2i.py重复实验注意保存旧结果验证/测试 JSON 中任意一项缺失时二者会被自动指向同一文件磁盘上不存在时则静默禁用对应流程数据集图片在前处理阶段一次性编码进内存样本量大时内存占用可观小显存机器建议控制数据集规模并适时调低img_size。结语LMFlow 的 text2image 分支用约数百行代码将 Stable Diffusion 微调所需的模型加载、数据编码、LoRA 注入、扩散训练循环、过程验证与结果保存完整封装同时无缝复用 LMFlow 的参数体系与BaseTuner基类。理解本文的数据格式与参数含义后你只需准备一份规范的数据集即可在 LMFlow 框架下快速完成文生图模型的个性化微调深入阅读 finetune_t2i.py、diffuser_finetuner.py 与 t2i_dataset.py 三个源码文件还能进一步按需扩展自己的训练流程。赞分享人工智能大模型微调模型评测强化学习多模态【免费下载链接】LMFlowAn Extensible Toolkit for Finetuning and Inference of Large Foundation Models. Large Models for All.项目地址https://gitcode.com/gh_mirrors/lm/LMFlow点击查看免费下载相关推荐DPOK用强化学习策略梯度微调文本到图像扩散模型的完整实战指南DPOK用强化学习策略梯度微调文本到图像扩散模型的完整实战指南 DPOK 是论文《DPOK: Reinforcement Learning for Fin人工智能深度学习NLP计算机视觉强化学习Home Assistant 上传图片到 OpenDisplay 电子墨水屏实战指南Home Assistant 上传图片到 OpenDisplay 电子墨水屏实战指南 想让 Home Assistant 的 opendisplay.uploa文档教程智能家居物联网PEFT 中的 OFT 详解基于正交微调的文本到图像扩散模型参数高效微调PEFT 中的 OFT 详解基于正交微调的文本到图像扩散模型参数高效微调 OFTOrthogonal Finetuning正交微调是 PEFT 仓库中一人工智能大模型微调LoRA上一篇3个让你爱上小狼毫输入法的理由下一篇Lightdash MCP Tool 契约治理工具命名、合同快照与发布安全 Diff创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表