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

M1 Mac上用HuggingFace评估文本摘要遇torch dtype RuntimeError

解决方案

问题根源

你遇到的错误是PyTorch对低于macOS 14.0的MPS环境的兼容性限制:torch.isin在旧版MPS上仅支持浮点类型张量,但模型生成过程中内部使用了Long类型的词汇表张量,导致触发RuntimeError。这和你输入的文本数据无关,是transformers库内部生成逻辑与MPS的适配问题。

具体解决方法

方法1:切换到CPU运行(最快速有效)

直接将pipeline的device参数设为-1,强制使用CPU避开MPS的限制:

pipe = pipeline(
    task="summarization",
    model="pszemraj/led-base-book-summary",
    device=-1  # 改用CPU
)

后续的task_evaluator.compute()不需要额外传device参数,直接运行即可。

方法2:升级macOS到14.0(Sonoma)及以上

苹果在macOS 14.0中修复了MPS对torch.isin的Long类型支持,升级系统后可以正常使用MPS加速,无需修改代码。

方法3:手动打补丁适配旧版MPS

找到报错的transformers库文件:~/.pyenv/versions/3.12.0/envs/llm-aug/lib/python3.12/site-packages/transformers/generation/logits_process.py,修改第157行附近的代码,临时适配MPS的类型限制:

# 原代码
# eos_token_mask = torch.isin(vocab_tensor, self.eos_token_id)

# 修改后的代码
if vocab_tensor.device.type == "mps":
    # 临时转换为浮点型适配旧版MPS
    vocab_tensor_float = vocab_tensor.float()
    eos_token_id_float = self.eos_token_id.float()
    eos_token_mask = torch.isin(vocab_tensor_float, eos_token_id_float).bool()
else:
    eos_token_mask = torch.isin(vocab_tensor, self.eos_token_id)

修改后保存文件,重新运行代码即可。

关于device参数的错误说明

你之前在task_evaluator.compute()中添加device="mps"触发的错误,是因为pipeline已经指定了device,compute方法会复用pipeline的设备,不需要重复传入,直接去掉该参数即可。

内容的提问来源于stack exchange,提问作者Duong Vu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 01:55:56