CPU运行PEFT模型推理报错:addmm_impl_cpu_未实现Half类型
CPU环境下LLM微调后推理报错的解决方案
错误原因
你遇到的RuntimeError: "addmm_impl_cpu_" not implemented for 'Half',本质是PyTorch在CPU环境下不支持bfloat16/Half类型的矩阵乘法运算,而你加载模型时指定了torch.bfloat16,导致推理阶段触发了不兼容的运算逻辑。
可行修改方案
直接针对CPU环境调整模型加载和推理的参数类型,以下是修改后的完整代码:
import torch from transformers import AutoModelForCausalLM, AutoTokenizer from peft import PeftConfig, PeftModel # 纯CPU环境下无需复杂配置,直接指定设备 device = torch.device("cpu") # 加载Peft配置 config = PeftConfig.from_pretrained(model_dir) # 加载基础模型:CPU环境下使用float32,替换不支持的bfloat16 model = AutoModelForCausalLM.from_pretrained( config.base_model_name_or_path, torch_dtype=torch.float32, low_cpu_mem_usage=True ) model.to(device) tokenizer = AutoTokenizer.from_pretrained(config.base_model_name_or_path) # 加载Peft模型:保持和基础模型一致的float32类型 peft_model = PeftModel.from_pretrained( model, model_dir, torch_dtype=torch.float32, low_cpu_mem_usage=True, use_cache=True ) peft_model.to(device) prompt = "The hobbits were so suprised seeing their friend" # 直接将输入移到CPU,自动匹配模型参数类型 inputs = tokenizer(prompt, return_tensors="pt").to(device) tokens = peft_model.generate( **inputs, max_new_tokens=100, temperature=1, eos_token_id=tokenizer.eos_token_id, early_stopping=True, use_cache=True ) # 输出生成结果 print(tokenizer.decode(tokens[0], skip_special_tokens=True))
关键改动说明
- 移除冗余配置:纯CPU环境下
BitsAndBytesConfig和Accelerator的配置没有必要,反而会增加复杂度,直接删除即可 - 替换浮点类型:将所有
torch.bfloat16改为torch.float32,确保模型参数和运算都使用CPU原生支持的浮点类型 - 简化输入处理:直接把tokenizer输出的张量移到CPU,避免手动转换类型时出现不匹配问题
- 简化调用逻辑:用
**inputs直接传入所有生成所需的参数,减少手动代码量
内容的提问来源于stack exchange,提问作者maop
相关产品推荐
相关产品推荐

