DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

pipeline 指定 device 后报错

Accelerate 已分派模型时,pipeline 的整体设备迁移会冲突。以 Transformers 4.45.2 为接口基线,保留一种设备管理方式,检查封装参数并用短推理验收。

模型通过 device_map="auto" 加载后,给 pipeline() 传 device=0,可能收到:

cannot be moved to a specific device

在 Transformers 4.45.2 中,只要模型的 hf_device_map 不为 None,又传入非 None 的 device,构造器就拒绝继续。它发生在整体迁移之前,不能据此认定 CUDA 设备不存在。因此不要同时传入这两个参数。

保留 Accelerate 分派时,去掉 pipeline 的 device

先检查已经加载好的模型:

print(getattr(model, "hf_device_map", None))

这个诊断片段假定 model 是项目已加载的对象。映射可能包含多块 GPU、CPU 或磁盘卸载位置。只看 model.device 的第一个位置,不能代表整份模型的分配。

以下例子使用同一份可信本地文本生成 checkpoint:

from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline

checkpoint = "/srv/models/verified-text-checkpoint"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForCausalLM.from_pretrained(
    checkpoint,
    device_map="auto",
)
generator = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
)
result = generator("Explain TCP briefly.", max_new_tokens=16)
print(len(result))

示例需要相容的 PyTorch/Accelerate 依赖和足够内存。它会加载真实模型并推理;没有默认允许任意 checkpoint 的远程代码。保留原来的 dtype、量化和 offload 配置,例子只展示需要移除的冲突参数。

注意 device=-1 也是一个明确传入的值,不能把它当成“没有传 device”。公共封装若默认填了 device=0,调用处删除参数后仍会冲突,应检查最终交给 pipeline 的 kwargs。

只有单设备任务,才另走单设备加载路线

若业务确实不需要分派或卸载,而且单卡能装下模型,可以重新按普通单设备方案加载,再由 pipeline 指定设备。不要在已经分片或量化的对象上强行 model.to("cuda"),也不要删除 hf_device_map 属性伪装成未分派模型。

这条路线需要重新评估显存、输入长度和批量大小。消除构造器冲突,不会自动解决 OOM,也不会替应用调整模型覆盖范围。

验收先确认 pipeline 能构造、最终参数只保留一种设备策略,再执行短输入。随后检查代表性长输入与实际批量,核对映射和内存占用符合部署预算。若后续错误变成某个张量设备不匹配,继续检查自定义输入处理,不把它又当成 pipeline 参数冲突。