微调Hugging Face T5模型推理时遇设备不匹配RuntimeError求助
解决Hugging Face Pipeline推理时设备不匹配的RuntimeError
核心原因
训练完成的模型参数或推理时的输入张量分散在CPU和GPU上,导致张量设备不一致,触发设备不匹配报错。
针对性解决方案
1. 显式将模型移至GPU并指定Pipeline设备
加载微调后的模型时,直接调用.to("cuda")将模型参数全部移至GPU;同时初始化pipeline时显式指定device=0(对应cuda:0):
from transformers import AutoModelForSequenceClassification, AutoTokenizer, pipeline # 加载模型并移至GPU model = AutoModelForSequenceClassification.from_pretrained("your_finetuned_model_path").to("cuda") tokenizer = AutoTokenizer.from_pretrained("your_finetuned_model_path") # 初始化pipeline时指定设备 classifier = pipeline( "text-classification", # 根据你的任务类型调整 model=model, tokenizer=tokenizer, device=0 # 对应cuda:0,若有多GPU可指定其他编号 )
2. 检查自定义预处理的张量设备
如果是手动预处理测试集数据而非完全依赖pipeline的自动处理,必须确保所有输入张量与模型在同一设备:
# 手动预处理示例 texts = ["测试文本1", "测试文本2"] inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt") # 将所有输入张量移至GPU inputs = {key: tensor.to("cuda") for key, tensor in inputs.items()} # 直接用模型推理 outputs = model(**inputs)
3. 修复多GPU训练后的模型加载问题
如果训练时使用了DataParallel或DistributedDataParallel,保存的模型参数会带有module.前缀,加载时需要去除并移至GPU:
from transformers import AutoModelForSequenceClassification # 加载带module前缀的模型 model = AutoModelForSequenceClassification.from_pretrained("your_finetuned_model_path") # 去除module前缀并移至GPU model = model.module.to("cuda") if hasattr(model, "module") else model.to("cuda")
是否需要更换测试集推理方式?
不一定必须更换。只要确保模型、输入张量的设备完全一致,无论是用pipeline还是直接调用模型推理都能正常运行。上述方案已经覆盖了绝大多数设备不匹配的场景,优先尝试这些修复步骤。
内容的提问来源于stack exchange,提问作者wJoyW
相关产品推荐
相关产品推荐

