
TE keys missing
快速结论:该报错通常发生在 Kohya SS 的 LoRA 训练中,原因是 v25 版本将文本编码器学习率(Text Encoder learning rate)的默认值从 v24 的 0.0001 改为了 0,导致训练默认仅针对 UNet,LoRA 输出文件不含 TE 键值。优先排查并确认 Text Encoder 学习率是否为非零值。
问题场景
用户使用 Kohya SS 的 LoRA 训练功能训练 SDXL 模型时,训练日志一切正常,但生成的 safetensors 文件中缺少 TE 键值(TE keys),导致训练出的 LoRA 模型无法保留人物身份特征,面部变得千篇一律,细节丢失。该问题在 Linux、Windows 以及 Docker 环境下均有复现,影响既有默认分支。
报错原文
TE keys missing
(注意:该报错并非显式错误提示,而是用户对比新旧 LoRA 文件内容后发现的差异现象)
原因分析
根本原因在于 Kohya SS v25.0.0+ 版本中,LoRA 训练选项卡的 Text Encoder learning rate 默认值发生了无声变更:
- v24.x 版本默认值为
0.0001(与 UNet 学习率一致),训练时会同时训练 UNet 和文本编码器的 LoRA 模块。 - v25.0.0+ 版本默认值改为
0,而 UNet learning rate 仍保持0.0001。
训练程序根据学习率值自动推导训练模式:
- 当 TE LR 为
0且 UNet LR 非零时 → 推导为network_train_unet_only(仅训练 UNet) - 当 TE LR 非零且 UNet LR 为
0时 → 推导为network_train_text_encoder_only(仅训练文本编码器)
因此,使用默认配置的每次新 LoRA 训练实际上都是 UNet-only 模式,输出的 safetensors 文件中不含任何 TE 键值。训练日志不会报错,用户难以察觉模式变更。
注意:这个 bug 的核心问题不在于 UNet-only 模式本身(某些 SDXL 流程确实推荐此模式),而在于:
- 模式变更没有被明确告知用户
- 默认值在两个大版本之间发生了无声翻转
- 用户得不到任何关于“TE LoRA 不会被训练/写入”的明确提示
环境排查
- 确认 Kohya SS 版本号:是否从 v24.x 升级到了 v25.0.0+。
- 确认 LoRA 训练选项卡中 Text Encoder learning rate 的设置值是否为
0。 - 对比新旧 LoRA 文件:检查 safetensors 文件中是否包含文本编码器相关的键值(TE keys)。
- 确认训练日志中是否出现
network_train_unet_only标志。 - 确认配置文件中
network_train_unet_only和network_train_text_encoder_only的推导逻辑。
解决步骤
- 可优先尝试:将 Text Encoder learning rate 从默认的
0修改为非零值(例如恢复为 v24 默认值0.0001),使训练模式变为同时训练 UNet 和文本编码器。 - 检查并确保 UNet learning rate 保持为非零值(例如
0.0001),避免因两者同时为0导致其他问题。 - 如果希望保持 UNet-only 模式,请在 UI 中显式确认:将 Text Encoder learning rate 设置为
0,同时确认 UNet learning rate 为非零值,并在训练前查看日志或界面提示,确认你理解此模式将导致输出文件中不含 TE 键值。 - 建议开发者在 UI 字段中添加提示信息,说明将 TE LR 设为
0且 UNet LR 非零时,将进入 UNet-only 模式,输出的 safetensors 文件中不包含 TE 键值。 - 建议在训练启动时的日志行中明确输出当前有效的训练模式(例如 “Training mode: UNet-only (no TE keys will be saved)”)。
- 检查是否与其他 Issue #3430 相关(配置除了 text_encoder_lr 不同外完全一致),确认 TE LR 设回
0.0001后质量恢复。
验证方法
训练完成后,检查生成的 safetensors 文件中是否包含 TE 键值(可通过代码或工具查看文件内容)。同时对比新旧 LoRA 在 SDXL 推理时的效果:确保人物特征保持,面部细节丰富不泛化。若使用 v24 相同配置(text_encoder_lr = 0.0001)训练后 TE 键值正常出现且效果恢复,则问题已解决。



