
RuntimeError: Error(s) in loading state_dict for AutoencoderKL:
快速结论:该报错通常在使用 Kohya SS 的 extract_lora_from_models.py 脚本从微调后的 SD 1.5 checkpoint 中提取 LoRA 时触发。优先排查 checkpoint 文件中是否存在重复的 “to_” 键名,或检查 VAE 部分是否包含不兼容的命名。
问题场景
用户在使用 Kohya SS 的 extract_lora_from_models.py 脚本,尝试从基于 SD 1.5 微调后的 checkpoint(例如 realistic vision 4.0 的微调模型)中提取 LoRA 权重时,脚本在加载 VAE 部分失败。
报错原文
RuntimeError: Error(s) in loading state_dict for AutoencoderKL:
Missing key(s) in state_dict: "encoder.mid_block.attentions.0.proj_in.weight", ...
Unexpected key(s) in state_dict: "encoder.mid_block.attentions.0.proj_in.to_to_q.weight", ...
...
原因分析
根据 Issue 讨论,报错原因在于 checkpoint 文件中部分 VAE 层的键名出现了重复的 “to_” 前缀(例如 “.to_to_q.” 或 “.to_to_k.”),导致加载时出现意外的键名。具体来说:
- 使用 base SD 1.5 微调的 checkpoint 可以正常加载。
- 使用 realistic vision 4.0 等第三方预训练模型微调后的 checkpoint 加载失败。
- 问题与 VAE 的键名格式有关,可能是模型转换或合并过程中产生了键名污染。
环境排查
- 确认 Kohya SS 版本是否为最新(如 2024 年 1 月版本)
- 确认 base 模型路径和微调模型路径是否正确
- 确认 checkpoint 文件格式是否为标准的 SD 1.5 .ckpt
- 尝试用 base SD 1.5 checkpoint 代替微调模型来验证是否是模型本身的问题
解决步骤
- 方法一(可优先尝试):使用第三方工具 stable-diffusion-webui-model-toolkit 对微调后的 checkpoint 进行优化处理,得到精简版本后再用于 Kohya SS。
-
方法二(代码级修复):修改 Kohya SS 源码中的 model_util.py 文件,添加键名修正函数。在 conv_attn_to_linear() 函数内增加对 “.to_to_” 键名的替换逻辑:
def correct_checkpoint_to_keys(checkpoint): keys = list(checkpoint.keys()) for key in keys: if ".to_to_" in key: newkey = key.replace(".to_to_", ".to_") checkpoint[newkey] = checkpoint[key] del checkpoint[key] logger.info("Replaced checkpoint key: " + key + " -> " + newkey) def conv_attn_to_linear(checkpoint): correct_checkpoint_to_keys(checkpoint) keys = list(checkpoint.keys()) attn_keys = ["query.weight", "key.weight", "value.weight"] for key in keys: if ".".join(key.split(".")[-2:]) in attn_keys: if checkpoint[key].ndim > 2: checkpoint[key] = checkpoint[key][:, :, 0, 0] elif "proj_attn.weight" in key: if checkpoint[key].ndim > 2: checkpoint[key] = checkpoint[key][:, :, 0] - 方法三:确保待提取的微调模型是基于标准 SD 1.5 直接微调的,而不是基于 realistic vision 等经过预训练的第三方模型微调。
验证方法
修复后重新运行 extract_lora_from_models.py,确认不再弹出 RuntimeError,且成功生成 LoRA 权重文件。你可以在终端中查看日志输出,确认 VAE 加载时没有报错,并且能正常看到 “loading vae:” 的提示信息。



