
本文禁止转载或摘编
从SD1.5到FLUX:我踩过的坑,与这份终极人物LoRA训练心法
如果你也曾为训练一个完美的LoRA而头疼,那么,相信我的经历你一定感同身受。
回想最初接触LoRA训练的时代,那还是SD1.5的天下。那时候的我们,像是一群初出茅庐的炼金术士,对着一堆参数念着咒语,每一次点击“开始训练”,都像是一场未知的豪赌。出图效果时好时坏,人物面部时常僵硬,过拟合更是家常便饭。尽管如此,我们依然乐此不疲,享受着将人物“数字生命化”的喜悦。
后来,SDXL来了。画质的飞跃提升让人振奋,但随之而来的是训练难度的指数级增长。更多的参数、更复杂的模型结构、对显存更苛刻的要求,让我们的“炼丹炉”变得愈发难以掌控。我曾为了一个理想中的模型,在参数的海洋里反复挣扎,看着显卡在深夜里发出阵阵悲鸣,产出的却是一个又一个“四不像”的失败品。
而现在,我们迎来了FLUX——这个被誉为“次世代”的全新模型。它的强大毋庸置疑,T5-XXL那恐怖的文本理解能力,预示着它在语义和细节上无与伦比的潜力。然而,兴奋之余,更多的是一丝迷茫和敬畏。因为我们深知,这意味着过去从SD1.5到SDXL积累的所有经验,都可能需要被重新审视,甚至被完全推翻。旧的地图,在新大陆上可能完全失效。
果不其然,初探FLUX的LoRA训练,我一头扎进了前所未见的深坑里。
学习率该设多少?4e-4还是1e-4?FLUX对它异常敏感。
网络维度(dim)和Alpha该如何平衡?过去“alpha=dim/2”的黄金法则还适用吗?
那个全新的network_dropout
参数,它对抗过拟合的效果究竟有多神奇?又该如何设置才能最大化人物的泛化能力,实现完美的换装换景?
还有cosine_with_restarts
这个调度器,它和lr_scheduler_num_cycles
的搭配,简直是防止过拟合的玄学……
在无数次的尝试、失败与复盘后,在消耗了海量的时间和电费之后,我终于摸清了这头“性能猛兽”的脾气。我发现,训练FLUX LoRA,不能再用过去粗放的思路,它需要的是一套更为精细、更为科学的“手术刀”式操作。
最终,我将所有踩过的坑、总结的经验、验证过的真理,全部浓缩、提炼、固化成了下面这份配置文件。
它不是一堆冰冷的参数,而是我从SD1.5时代一路走来的心血结晶。它是我为你绘制的一张“避坑地图”,一份稳定、高效、且效果惊艳的FLUX人物LoRA训练“标准操作规程”(SOP)。
我将这份配置毫无保留地分享出来,并为其中每一个关键参数都附上了详尽的中文注释,解释了“是什么”与“为什么”。希望它能为你节省下宝贵的时间和显卡资源,让你能跳过我曾经历的痛苦摸索,直接享受到FLUX带来的创作乐趣。
现在,就让我们一起揭开这份“黄金模板”的面纱吧。
效果图
韩星 朴桂瑛 Park Gyuyoung
数据集用到的图片参考
140张图训练10轮每轮10步共14000步
每一轮保存一版模型
为什么是10轮和每轮都保持一版模型,后面我有写理由
测试图固定种子固定提示词
分别从第一轮到第十轮模型文生图 从左到右权重分别是
1, 0.9, 0.8, 0.7, 0.6
LoRA出图
日星 木村光希 kimura mitsuki
数据集用到的图片参考
LoRA出图
黄金模板
output_name = "XXXlora_v1"class_tokens = "XXXlora,"pretrained_model_name_or_path = "./models/unet/flux1-dev.safetensors"ae = "./models/vae/ae.safetensors"clip_l = "./models/clip/clip_l.safetensors"t5xxl = "./models/clip/t5xxl_fp16.safetensors"resume = ""output_dir = "/root/output"save_model_as = "safetensors"save_precision = "bf16"save_state = trueimage_dir = "/root/images"tagger_model = "joy-caption-alpha-two"prompt_type = "Training Prompt"output_trigger_words = truetagger_advanced_settings = falsetagger_global_prompt = ""tagger_is_append = falsenum_repeats = 10max_train_epochs = 10train_batch_size = 1resolution_width = 512resolution_height = 768enable_bucket = falsemin_bucket_reso = 256max_bucket_reso = 1024bucket_reso_steps = 64bucket_no_upscale = falseseed = 42max_data_loader_n_workers = 2learning_rate = "4e-4"save_every_n_epochs = 1guidance_scale = 1timestep_sampling = "shift"network_dim = 64logit_mean = 0logit_std = 1mode_scale = 1.29sigmoid_scale = 1model_prediction_type = "raw"discrete_flow_shift = 3.1582loss_type = "l2"highvram = truegradient_checkpointing = truegradient_accumulation_steps = 1network_train_unet_only = falsenetwork_train_text_encoder_only = falseoutput_config = truedisable_mmap_load_safetensors = falsevalidation_split = 0text_encoder_lr = "1e-4"lr_scheduler = "cosine_with_restarts"lr_warmup_steps = 0lr_scheduler_num_cycles = 3optimizer_type = "adamw8bit"weighting_scheme = "uniform"network_module = "networks.lora_flux"network_weights = ""network_alpha = "32"network_dropout = 0.1enable_base_weight = falsebase_weights = ""enable_preview = falselogging_dir = "./logs"caption_extension = ".txt"shuffle_caption = falseweighted_captions = falsekeep_tokens = 0keep_tokens_separator = ""caption_tag_dropout_rate = 0color_aug = falseflip_aug = falserandom_crop = falseclip_skip = 0split_mode = falsemixed_precision = "bf16"full_fp16 = falsefull_bf16 = truefp8_base = truefp8_base_unet = falseno_half_vae = falsesdpa = truelowram = falsecache_latents = truecache_latents_to_disk = truecache_text_encoder_outputs = truecache_text_encoder_outputs_to_disk = truepersistent_data_loader_workers = trueddp_gradient_as_bucket_view = falsesample_prompts = ""
我将打磨出的这套最终配置,变成一份带有详细注释的“标准操作规程”,是未来所有人物LoRA训练项目的宝贵财富。下面就是这份带有详尽中文解释的“黄金模板”。
人物LoRA训练标准模板 (FLUX)
只需要根据新项目修改少数几个标记为【需修改】的参数,其他参数都已优化好,无需改动。
# ===================================================================# 核心身份与路径设置# 这一部分定义了模型的名字、触发词以及所有需要加载的基础模型路径。# ===================================================================
output_name = "XXXlora_v1"# 作用: 你训练出的LoRA模型最终的文件名。# 【需修改】: 每次训练新人物时,请改成新模型的名字,例如 "zhangsan_v1"。
class_tokens = "XXXlora,"# 作用: 你的专属触发词。在出图时,用这个词来召唤你训练的人物。# 【需修改】: 每次训练新人物时,请换一个新的、独特的、无意义的触发词,例如 "ohwx zhangsan,"。
pretrained_model_name_or_path = "./models/unet/flux1-dev.safetensors"# 作用: FLUX模型的核心UNet部分。# 原因: 这是训练FLUX LoRA必须的基础模型,通常无需改动。
ae = "./models/vae/ae.safetensors"# 作用: FLUX专用的VAE(变分自编码器),负责图像的编码和解码。# 原因: FLUX配套组件,无需改动。
clip_l = "./models/clip/clip_l.safetensors"# 作用: FLUX使用的文本编码器之一 (CLIP-L)。# 原因: FLUX配套组件,无需改动。
t5xxl = "./models/clip/t5xxl_fp16.safetensors"# 作用: FLUX使用的另一个、也是最强大的文本编码器 (T5-XXL)。它让FLUX能更好地理解自然语言。# 原因: FLUX配套组件,无需改动。
image_dir = "/root/images"# 作用: 存放你所有训练图片的文件夹路径。# 【需修改】: 每次训练新项目时,请修改为新图片集的存放路径。
output_dir = "/root/output"# 作用: 训练好的LoRA模型保存的文件夹路径。# 原因: 通常无需修改,除非你想保存到别处。
logging_dir = "./logs"# 作用: 存放训练日志(如loss值)的文件夹。# 原因: 通常无需修改。
# ===================================================================# 训练核心参数# 这是决定训练时长、深度和质量最关键的部分。# ===================================================================
num_repeats = 10# 作用: 在每一“轮”(Epoch)中,每张图片被重复学习的次数。# 原因: 10次是一个很好的平衡点,确保模型能充分学习每张图片的特征。
max_train_epochs = 10# 作用: 训练的总轮数。# 【需修改】: 这是你以后最需要根据情况调整的参数!我们的目标是总步数在10000步左右。# 计算公式: 轮数 ≈ 10000 / (图片数量 × num_repeats)# 示例: 如果你有50张图,就设置 10000 / (50 * 10) = 20轮。
save_every_n_epochs = 1# 作用: 每隔多少轮保存一次模型。# 原因: 对于人物训练,这是【绝对关键】的设置!设为1可以确保你不会错过任何一个可能的“最佳”模型,因为最佳效果往往出现在过拟合之前。
resolution_width = 512resolution_height = 768# 作用: 训练时图片被处理的分辨率。# 原因: 对于在消费级显卡上训练人物LoRA,这是一个在“细节保留”和“显存消耗”之间取得完美平衡的尺寸。训练出的LoRA可以在任意更高分辨率下使用。
train_batch_size = 1# 作用: 每次更新模型时,同时处理的图片数量。# 原因: 由于分辨率较高且FLUX模型庞大,设为1可以最大限度地节省显存。
# ===================================================================# 学习率与调度器 (Learning Rate & Scheduler)# 控制模型学习的“速度”与“节奏”,对防止过拟合至关重要。# ===================================================================
learning_rate = "4e-4"# 作用: 模型的学习速度。# 原因: 4e-4 (0.0004) 是一个针对FLUX这种强大模型优化的“慢速学习”速率。它能让模型更精细地学习人物特征,避免因学得太快而导致面部僵硬、失真。
text_encoder_lr = "1e-4"# 作用: 文本编码器的学习率。# 原因: 通常设得比主学习率低。我们希望模型“温和地”调整对文本的理解,而不是剧烈改变。
lr_scheduler = "cosine_with_restarts"# 作用: 学习率调度器,即学习率的变化策略。# 原因: "带重启的余弦退火"被证明是效果最好的策略之一。它能让学习率周期性地变化,帮助模型跳出局部最优解,获得更好的泛化能力。
lr_warmup_steps = 0# 作用: 学习率预热的步数。# 原因: 你的训练器环境强制要求在使用 "cosine_with_restarts" 时,此项必须为0。我们遵守此规则。
lr_scheduler_num_cycles = 3# 作用: 在整个训练过程中,学习率调度器“重启”的次数。# 原因: 对于10轮左右的训练,重启3次可以让模型经历多个学习周期,效果更佳。
# ===================================================================# LoRA网络核心配置# 定义了LoRA本身的结构和能力。# ===================================================================
network_dim = 64# 作用: LoRA的“网络维度”或“秩”,决定了LoRA的容量和能学习的细节多少。# 原因: 64是一个高质量设置,能捕捉丰富的人物面部细节。代价是文件会比较大(约600MB)。如果想获得更小的文件,可以尝试32。
network_alpha = "32"# 作用: LoRA的缩放因子。# 原因: 遵循 "alpha = dim / 2" 的黄金法则。这有助于稳定训练,并让LoRA在推理时使用0.8左右的权重就能获得很好的效果。
network_dropout = 0.1# 作用: 在训练时随机“丢弃”一部分神经元连接。# 原因: 这是防止过拟合的【核心手段】!它强迫模型学习更鲁棒的特征,而不是把人物和训练时的衣服、背景死记在一起,从而极大提高LoRA的泛化能力(换装、换场景)。
# ===================================================================# 标签与数据增强 (Captioning & Augmentation)# ===================================================================
shuffle_caption = false# 作用: 是否在训练时随机打乱标签文件里的词序。# 原因: 这是根据你的打标风格【特别定制】的!因为你使用的是完整的自然语言句子,所以【绝对不能】打乱,否则会破坏语法,导致训练失败。
# 以下为数据增强选项,对于训练特定人物,通常全部关闭,以保持人物特征的一致性。flip_aug = false # 关闭随机水平翻转color_aug = false # 关闭色彩增强random_crop = false # 关闭随机裁剪
# ===================================================================# 优化与性能 (Optimization & Performance)# 这些是技术向的设置,用于提升训练速度和降低显存消耗。# ===================================================================
optimizer_type = "adamw8bit"# 作用: 更新模型权重的优化器算法。# 原因: adamw8bit是目前兼具效果和显存效率的标准选择。
mixed_precision = "bf16"full_bf16 = true# 作用: 使用混合精度进行训练。# 原因: bf16是现代NVIDIA显卡(如30系、40系)上速度和稳定性都很好的选择。
gradient_checkpointing = true# 作用: 一种通过牺牲少量计算时间来大幅节省显存的技术。# 原因: 对于在消费级显卡上训练FLUX这样的大模型,此项【必须开启】。
cache_latents = truecache_latents_to_disk = truecache_text_encoder_outputs = truecache_text_encoder_outputs_to_disk = true# 作用: 将第一轮处理好的图片潜变量和文本编码缓存到硬盘。# 原因: 这是【极大的加速器】!它会让训练从第二轮开始变得飞快,因为不再需要重复处理图片和文本。
# ... 其余参数为默认或技术性设置,此模板已为你配置好,通常无需关心 ...resume = ""save_model_as = "safetensors"save_precision = "bf16"save_state = truetagger_model = "joy-caption-alpha-two"prompt_type = "Training Prompt"output_trigger_words = truetagger_advanced_settings = falsetagger_global_prompt = ""tagger_is_append = falseenable_bucket = falsemin_bucket_reso = 256max_bucket_reso = 1024bucket_reso_steps = 64bucket_no_upscale = falseseed = 42max_data_loader_n_workers = 2guidance_scale = 1timestep_sampling = "shift"logit_mean = 0logit_std = 1mode_scale = 1.29sigmoid_scale = 1model_prediction_type = "raw"discrete_flow_shift = 3.1582loss_type = "l2"highvram = truegradient_accumulation_steps = 1network_train_unet_only = falsenetwork_train_text_encoder_only = falseoutput_config = truedisable_mmap_load_safetensors = falsevalidation_split = 0weighting_scheme = "uniform"network_module = "networks.lora_flux"network_weights = ""enable_base_weight = falsebase_weights = ""enable_preview = falsecaption_extension = ".txt"weighted_captions = falsekeep_tokens = 0keep_tokens_separator = ""caption_tag_dropout_rate = 0clip_skip = 0split_mode = falsefull_fp16 = falsefp8_base = truefp8_base_unet = falseno_half_vae = falsesdpa = truelowram = falsepersistent_data_loader_workers = trueddp_gradient_as_bucket_view = falsesample_prompts = ""
总结
我分享的这份模板是在FLUX上进行高质量人物LoRA训练的钥匙。它是我实践的沉淀。
不再需要在参数的迷宫里反复试错,现在你可以把更多的精力投入到寻找优质训练素材和激发创意上。记住,技术是工具,而创作才是最终的目的。