使用🧨diffusers进行高级Flux Dreambooth LoRA训练

社区文章 发布于2024年10月21日

刚刚合并了:diffusers Dreambooth LoRA训练脚本的高级版本!受社区技术和贡献的启发,我们添加了新功能以最大化灵活性和控制。我们鼓励您进行实验,并与我们分享您的见解,以便我们共同发展🤗

鸣谢🙌🏻:ostrissimo ryuthe last benbghiraRon MokadyRinon GalNataniel RuizJonathan Fischoff

新增功能

关键调整(以及更多)

除了CLIP编码器微调,现在还支持关键调整🧨(继我们为SDXL训练提供关键调整功能之后,该功能基于simo ryucog-sdxl,更多关于关键调整的信息请点击这里)。

但这还不是全部——

(1) 仅应用于CLIP,或同时应用于CLIP和T5:

Flux使用两个文本编码器——CLIPT5,默认情况下--train_text_encoder_ti对CLIP执行关键调整,您可以通过添加--enable_t5_ti来同时激活两个编码器,例如:

--train_text_encoder_ti
--enable_t5_ti

动机 - 单独使用CLIP进行关键调整可以带来更好的收敛和Transformer训练,同时保持其相对轻量级(在训练速度和所需内存方面)——然而,添加T5可能会影响表达能力和提示遵循性。

特别是对于人脸,我们观察到添加CLIP的关键调整是有益的,但我们认为这对于样式和T5的实验也具有潜力!

image/png

这些模型是在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来指定您选择的概念作为新插入词元训练的起点。

动机 - 这个想法是,通过选择一个与训练概念相似的概念初始化器,我们可以更好地利用模型的先验知识。

我们注意到使用初始化器概念时出现了一些非常有趣的表现,我们认为这绝对值得进一步探索,例如:

image/png

这些模型是在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最佳实践的更广泛分析,并欢迎社区成员贡献并参与其中!🤗 这是一个实验性资源👩‍🔬 我们的目标是不断添加和改进它,因此请随时分享您的成果,让我们一起构建它🚀

训练愉快🌈✨

社区

注册登录以发表评论