Llama-2-7b-chat-hf运行时addmm_impl_cpu_不支持Half类型的问题
解决Llama-2-7b-chat-hf运行时"addmm_impl_cpu_ not implemented for 'Half'"错误
问题场景
加载meta-llama/Llama-2-7b-chat-hf模型后,执行ConversationalRetrievalChain推理时触发错误:addmm_impl_cpu_ not implemented for 'Half'。已尝试匹配模型配置的float16精度,以及切换float32、bfloat16等精度,问题仍存在。
完整操作流程
- 认证环节(已成功):
from huggingface_hub import notebook_login # 输入有效token后提示`Token is valid (permission: read)` notebook_login()
- 模型加载代码:
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-chat-hf", use_auth_token=True) model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-chat-hf", device_map='auto', torch_dtype=torch.float16, use_auth_token=True)
- 模型配置确认
torch_dtype为float16:
LlamaConfig { "_name_or_path": "meta-llama/Llama-2-7b-chat-hf", "architectures": [ "LlamaForCausalLM" ], "bos_token_id": 1, "eos_token_id": 2, "hidden_act": "silu", "hidden_size": 4096, "initializer_range": 0.02, "intermediate_size": 11008, "max_position_embeddings": 4096, "model_type": "llama", "num_attention_heads": 32, "num_hidden_layers": 32, "num_key_value_heads": 32, "pretraining_tp": 1, "rms_norm_eps": 1e-06, "rope_scaling": null, "tie_word_embeddings": false, "torch_dtype": "float16", "transformers_version": "4.32.0", "use_cache": true, "vocab_size": 32000 }
- Pipeline与QA链构建:
# 构建文本生成pipeline pipe=pipeline("text-generation", model=model, tokenizer=tokenizer, torch_dtype=torch.float16, device_map='auto', max_new_tokens=512, min_new_tokens=-1, top_k=30) llm=HuggingFacePipeline(pipeline=pipe,model_kwargs={'temperature':0.7})
memory=ConversationBufferMemory(memory_key='chat_history',return_messages=True) pdf_qa=ConversationalRetrievalChain.from_llm(llm=llm, retriever=vectordb.as_retriever(search_kwargs={'k':6}), verbose=False, memory=memory)
执行result=pdf_qa({"question":"question here"})时触发上述错误。
解决方案
核心原因
错误本质是部分张量被分配到CPU上,但PyTorch的CPU后端不支持float16的addmm矩阵乘法操作。即使设置device_map='auto',仍可能存在模型组件或检索环节的张量落在CPU上,导致精度不兼容。
具体修复步骤
强制全量加载到GPU(显存足够时优先选择)
放弃device_map='auto',直接指定GPU设备,确保所有模型张量都在GPU运行:model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-chat-hf", device='cuda', torch_dtype=torch.float16, use_auth_token=True)同时在Pipeline中明确指定GPU索引:
pipe=pipeline("text-generation", model=model, tokenizer=tokenizer, torch_dtype=torch.float16, device=0, # 多卡环境可调整为对应索引 max_new_tokens=512, min_new_tokens=-1, top_k=30)同步检索环节张量到GPU
如果使用的向量数据库(如FAISS)检索结果在CPU上,手动转移到GPU:# 以FAISS为例,将向量库转移到CUDA vectordb = vectordb.to('cuda')启用自动混合精度上下文
在执行QA链时,用自动混合精度上下文确保张量精度自动兼容:from torch.cuda.amp import autocast with autocast(): result=pdf_qa({"question":"question here"})降级到float32(显存不足时的备选方案)
强制使用CPU支持的float32精度,同时开启低CPU内存占用模式:model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-chat-hf", device_map='cpu', torch_dtype=torch.float32, use_auth_token=True, low_cpu_mem_usage=True)
内容的提问来源于stack exchange,提问作者Yilmaz
相关产品推荐
相关产品推荐

