3596 字
18 分钟
从SD1.5到FLUX:我踩过的坑,与这份终极人物LoRA训练心法

本文禁止转载或摘编#

从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 = true
image_dir = "/root/images"
tagger_model = "joy-caption-alpha-two"
prompt_type = "Training Prompt"
output_trigger_words = true
tagger_advanced_settings = false
tagger_global_prompt = ""
tagger_is_append = false
num_repeats = 10
max_train_epochs = 10
train_batch_size = 1
resolution_width = 512
resolution_height = 768
enable_bucket = false
min_bucket_reso = 256
max_bucket_reso = 1024
bucket_reso_steps = 64
bucket_no_upscale = false
seed = 42
max_data_loader_n_workers = 2
learning_rate = "4e-4"
save_every_n_epochs = 1
guidance_scale = 1
timestep_sampling = "shift"
network_dim = 64
logit_mean = 0
logit_std = 1
mode_scale = 1.29
sigmoid_scale = 1
model_prediction_type = "raw"
discrete_flow_shift = 3.1582
loss_type = "l2"
highvram = true
gradient_checkpointing = true
gradient_accumulation_steps = 1
network_train_unet_only = false
network_train_text_encoder_only = false
output_config = true
disable_mmap_load_safetensors = false
validation_split = 0
text_encoder_lr = "1e-4"
lr_scheduler = "cosine_with_restarts"
lr_warmup_steps = 0
lr_scheduler_num_cycles = 3
optimizer_type = "adamw8bit"
weighting_scheme = "uniform"
network_module = "networks.lora_flux"
network_weights = ""
network_alpha = "32"
network_dropout = 0.1
enable_base_weight = false
base_weights = ""
enable_preview = false
logging_dir = "./logs"
caption_extension = ".txt"
shuffle_caption = false
weighted_captions = false
keep_tokens = 0
keep_tokens_separator = ""
caption_tag_dropout_rate = 0
color_aug = false
flip_aug = false
random_crop = false
clip_skip = 0
split_mode = false
mixed_precision = "bf16"
full_fp16 = false
full_bf16 = true
fp8_base = true
fp8_base_unet = false
no_half_vae = false
sdpa = true
lowram = false
cache_latents = true
cache_latents_to_disk = true
cache_text_encoder_outputs = true
cache_text_encoder_outputs_to_disk = true
persistent_data_loader_workers = true
ddp_gradient_as_bucket_view = false
sample_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 = 512
resolution_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 = true
cache_latents_to_disk = true
cache_text_encoder_outputs = true
cache_text_encoder_outputs_to_disk = true
# 作用: 将第一轮处理好的图片潜变量和文本编码缓存到硬盘。
# 原因: 这是【极大的加速器】!它会让训练从第二轮开始变得飞快,因为不再需要重复处理图片和文本。
# ... 其余参数为默认或技术性设置,此模板已为你配置好,通常无需关心 ...
resume = ""
save_model_as = "safetensors"
save_precision = "bf16"
save_state = true
tagger_model = "joy-caption-alpha-two"
prompt_type = "Training Prompt"
output_trigger_words = true
tagger_advanced_settings = false
tagger_global_prompt = ""
tagger_is_append = false
enable_bucket = false
min_bucket_reso = 256
max_bucket_reso = 1024
bucket_reso_steps = 64
bucket_no_upscale = false
seed = 42
max_data_loader_n_workers = 2
guidance_scale = 1
timestep_sampling = "shift"
logit_mean = 0
logit_std = 1
mode_scale = 1.29
sigmoid_scale = 1
model_prediction_type = "raw"
discrete_flow_shift = 3.1582
loss_type = "l2"
highvram = true
gradient_accumulation_steps = 1
network_train_unet_only = false
network_train_text_encoder_only = false
output_config = true
disable_mmap_load_safetensors = false
validation_split = 0
weighting_scheme = "uniform"
network_module = "networks.lora_flux"
network_weights = ""
enable_base_weight = false
base_weights = ""
enable_preview = false
caption_extension = ".txt"
weighted_captions = false
keep_tokens = 0
keep_tokens_separator = ""
caption_tag_dropout_rate = 0
clip_skip = 0
split_mode = false
full_fp16 = false
fp8_base = true
fp8_base_unet = false
no_half_vae = false
sdpa = true
lowram = false
persistent_data_loader_workers = true
ddp_gradient_as_bucket_view = false
sample_prompts = ""

总结

我分享的这份模板是在FLUX上进行高质量人物LoRA训练的钥匙。它是我实践的沉淀。

不再需要在参数的迷宫里反复试错,现在你可以把更多的精力投入到寻找优质训练素材和激发创意上。记住,技术是工具,而创作才是最终的目的。

本文禁止转载或摘编#

从SD1.5到FLUX:我踩过的坑,与这份终极人物LoRA训练心法
https://blog.wlens.top/posts/从sd15到flux我踩过的坑与这份终极人物lora训练心法/
作者
Lao Wang
发布于
2025-07-20
许可协议
CC BY-NC-SA 4.0