You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:58:16