使用🧨diffusers进行高级Flux Dreambooth LoRA训练
刚刚合并了:diffusers Dreambooth LoRA训练脚本的高级版本!受社区技术和贡献的启发,我们添加了新功能以最大化灵活性和控制。我们鼓励您进行实验,并与我们分享您的见解,以便我们共同发展🤗
鸣谢🙌🏻:ostris、simo ryu、the last ben、bghira、Ron Mokady、Rinon Gal、Nataniel Ruiz、Jonathan Fischoff
新增功能
关键调整(以及更多)
除了CLIP编码器微调,现在还支持关键调整🧨(继我们为SDXL训练提供关键调整功能之后,该功能基于simo ryu的cog-sdxl,更多关于关键调整的信息请点击这里)。
但这还不是全部——
(1) 仅应用于CLIP,或同时应用于CLIP和T5:
Flux使用两个文本编码器——CLIP和T5,默认情况下--train_text_encoder_ti
对CLIP执行关键调整,您可以通过添加--enable_t5_ti
来同时激活两个编码器,例如:
--train_text_encoder_ti
--enable_t5_ti
动机 - 单独使用CLIP进行关键调整可以带来更好的收敛和Transformer训练,同时保持其相对轻量级(在训练速度和所需内存方面)——然而,添加T5可能会影响表达能力和提示遵循性。
特别是对于人脸,我们观察到添加CLIP的关键调整是有益的,但我们认为这对于样式和T5的实验也具有潜力!
这些模型是在4张图像上训练的,配置如下(除了关键调整的使用,其他都相同)
--dataset_name=linoyts/linoy_face
--instance_prompt=TOK
--output_dir=linoy_flux_v19
--lora_layers="attn.to_k,attn.to_q,attn.to_v,attn.to_out.0"
--mixed_precision=bf16
--optimizer=prodigy
--train_transformer_frac=1
*--train_text_encoder_ti*
--train_text_encoder_ti_frac=.25
--weighting_scheme=none
--resolution=768
--train_batch_size=1
--guidance_scale=1
--repeats=1
--learning_rate=1.0
--gradient_accumulation_steps=1
--rank=16
--max_train_steps=1000
--push_to_hub
(2) 控制新词元的初始化方式:
与原始文本反演工作类似,您现在可以通过添加--initializer_concept
来指定您选择的概念作为新插入词元训练的起点。
动机 - 这个想法是,通过选择一个与训练概念相似的概念初始化器,我们可以更好地利用模型的先验知识。
我们注意到使用初始化器概念时出现了一些非常有趣的表现,我们认为这绝对值得进一步探索,例如:
这些模型是在multimodalart/1920-raider-waite-tarot-public-domain数据集上训练的,配置如下(除了初始化器概念的使用,其他都相同)
--dataset_name=multimodalart/1920-raider-waite-tarot-public-domain
--instance_prompt="a trtcrd tarot card"
--caption_column=caption
--token_abstraction=trtcrd
--output_dir=tarot_card_flux_v12
--lora_layers="attn.to_k,attn.to_q,attn.to_v,attn.to_out.0"
*--initializer_concept="tarot card"*
--mixed_precision=bf16
--optimizer=prodigy
--train_transformer_frac=1
--train_text_encoder_ti
--train_text_encoder_ti_frac=1.
--weighting_scheme=none
--resolution=768
--train_batch_size=1
--guidance_scale=1
--learning_rate=1.0
--gradient_accumulation_steps=1
--rank=16
--max_train_steps=750
--push_to_hub
(3) 纯文本反演:
为了支持从关键调整到文本反演的完整范围,我们引入了--train_transformer_frac
,它控制Transformer LoRA层训练的时期数。默认情况下,--train_transformer_frac==1
,要触发文本反演运行,请设置--train_transformer_frac==0
,例如:
--train_text_encoder_ti
--train_text_encoder_ti_frac=1
--train_transformer_frac==0
也支持0到1之间的值!
动机 - Flux的基础知识非常广泛,纯文本反演可能足以满足某些概念的需求——从而消除了对大尺寸LoRA的需求,并可能缓解一些提示遵循问题。
目标模块
为了对训练模块提供细粒度控制,我们添加了--lora_layers
,允许您精确指定要训练的模块——包括Transformer层和应用LoRA训练的块的类型。
动机——最近(由the last ben和其他社区成员)表明,仅关注两个块——一个DiT和一个MMDiT——就足以获得高质量的LoRA。另一个方面是我们使用的层类型——对于许多概念,仅在注意力层上进行训练似乎足以达到很好的效果,同时保持LoRA尺寸最小。
例如,您可以像这样仅针对注意力层:
--lora_layers="attn.to_k,attn.to_q,attn.to_v,attn.to_out.0"
想要训练更广泛的模块集?您可以在逗号分隔列表中指定所有模块🎯
想要训练特定块?添加前缀single_transformer_blocks.i
,例如——用于DiT的single_transformer_blocks.i.attn.to_k
;添加前缀transformer_blocks.i
,例如——用于第i个MMDiT的transformer_blocks.i.attn.to_k
。
例如,以下配置将仅对DiT块#7的注意力层应用LoRA训练
--lora_layers="single_transformer_blocks.7.attn.to_k,single_transformer_blocks.7.attn.to_q,single_transformer_blocks.7.attn.to_v,single_transformer_blocks.7.attn.to_out.0"
➡️ 在这里查看更多模块示例
开始训练
有关更多示例、安装说明和推理代码片段,请查看此README
接下来呢?
我们计划很快发布关于训练功能和Flux最佳实践的更广泛分析,并欢迎社区成员贡献并参与其中!🤗 这是一个实验性资源👩🔬 我们的目标是不断添加和改进它,因此请随时分享您的成果,让我们一起构建它🚀
训练愉快🌈✨