RuntimeError: Error(s) in loading state_dict for AutoencoderKL:

用户在使用 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:

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 代替微调模型来验证是否是模型本身的问题

解决步骤

  1. 方法一(可优先尝试):使用第三方工具 stable-diffusion-webui-model-toolkit 对微调后的 checkpoint 进行优化处理,得到精简版本后再用于 Kohya SS。
  2. 方法二(代码级修复):修改 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]
  3. 方法三:确保待提取的微调模型是基于标准 SD 1.5 直接微调的,而不是基于 realistic vision 等经过预训练的第三方模型微调。

验证方法

修复后重新运行 extract_lora_from_models.py,确认不再弹出 RuntimeError,且成功生成 LoRA 权重文件。你可以在终端中查看日志输出,确认 VAE 加载时没有报错,并且能正常看到 “loading vae:” 的提示信息。

参考来源

bmaltais/kohya_ss #1546

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

celebrityanime
celebrityanime
文章: 8318

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注