如何解决加载QFormer预训练权重时的KeyError: 'model.embed_tokens.weight'?
问题解决:KeyError: 'model.embed_tokens.weight'
核心原因
你加载的权重文件checkpoint-15000_embeddings_qformer.bin中不存在model.embed_tokens.weight这个键,要么是键名和代码预期不符,要么该文件本身就不包含LLaMA的词嵌入权重。
解决步骤
1. 先确认权重文件的所有键
在加载权重后添加打印代码,查看文件里实际存在的键:
weights = torch.load(SD_QFormer_conversation_33tokens, map_location="cpu") # 新增打印所有键 print("权重文件包含的键:", list(weights.keys()))
运行后就能看到该权重文件里的所有可用键,对比代码里的调用,找到对应词嵌入的正确键名。
2. 修改代码中的键名匹配实际情况
如果打印后发现词嵌入的键是embed_tokens.weight(没有model.前缀),就把代码中对应行修改为:
LLaMA_word2vec = weights.pop('embed_tokens.weight')
如果实际键名是其他形式,替换成对应的名称即可。
3. 确认权重文件是否包含LLaMA词嵌入
如果打印后发现权重文件里根本没有词嵌入相关的键,说明这个QFormer checkpoint只保存了QFormer、mm_projector等组件的权重,没有包含LLaMA的词嵌入。这种情况下,你需要从原始LLaMA模型权重中读取model.embed_tokens.weight,或者检查是否应该从LLaVA_00002文件中提取该权重(比如尝试LLaVA_00002_weights['model.embed_tokens.weight'])。
额外验证
修改后可以添加判断,避免直接pop报错:
if 'model.embed_tokens.weight' in weights: LLaMA_word2vec = weights.pop('model.embed_tokens.weight') elif 'embed_tokens.weight' in weights: LLaMA_word2vec = weights.pop('embed_tokens.weight') else: # 从其他来源加载或者抛出明确提示 raise ValueError("权重文件中未找到词嵌入权重")
内容的提问来源于stack exchange,提问作者hshsh
相关产品推荐
相关产品推荐

