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
相关产品推荐
相关产品推荐

