TypeError: this function got an unexpected keyword argument ‘device’

该报错通常出现在 Apple Silicon(MPS)上使用 model.generate_batch() 或 transformers serve --continuous-batching 启用连续批处理时。torch 2.15.0 新增了 torch.mps.Stream ,而 Transfo

快速结论:该报错通常出现在 Apple Silicon(MPS)上使用 model.generate_batch() 或 transformers serve --continuous-batching 启用连续批处理时。torch 2.15.0 新增了 torch.mps.Stream,而 Transformers 的 create_device_stream 向它传入了 device 关键字参数,导致 TypeError;优先排查 torch 版本。

适用环境:Issue 已确认的环境为 transformers 5.22.1、torch 2.15.0、macOS 26.7、Apple Silicon(arm64)、Python 3.13.3、huggingface_hub 2.4.0、accelerate 1.15.0;同环境下 torch 2.14.1 可正常运行。

最快修复方案:Issue 中已验证的规避方案是将 torch 固定为 torch==2.14.1。原作者反馈 Transformers 侧修复会进入下个版本,torch 侧修复计划随 torch 2.16 发布,但 Issue 讨论中未给出具体版本号,需以实际发布为准。

注意事项:临时把 create_device_stream 改为返回 None,在当前脚本下未报错,但属于绕过实现,并非官方修复;改为返回 torch.mps.Stream()(不传 device)虽不再抛异常,但生成文本会出现乱码,不能作为修复方案。固定 torch 版本属于临时规避,升级 Transformers 或 torch 后该问题应随之解决,届时可以解除固定。

问题场景

用户在 Mac(Apple Silicon)上加载 Qwen/Qwen2.5-0.5B-Instruct,以 device_map="mps" 和 dtype=torch.bfloat16 加载模型,然后调用 model.generate_batch() 使用连续批处理(continuous batching)生成文本。使用 transformers serve <model> --continuous-batching 启动服务时也会触发同一错误,请求返回 503,并提示 CB worker died。同一脚本在 torch 2.14.1 下输出正常,在 torch 2.15.0 下失败。

报错原文

  File ".../transformers/generation/continuous_batching/input_outputs.py", line 129, in __init__
  File ".../transformers/generation/continuous_batching/utils.py", line 257, in create_device_stream
    return device_module.Stream(device=device)
TypeError: this function got an unexpected keyword argument 'device'

服务模式下对应的报错表现为:

CB worker died during request ...: this function got an unexpected keyword argument 'device'

原因分析

最可能的原因来自 torch 版本差异。Issue 中核实的现象是:torch 2.14.1 没有 torch.mps.Stream,因此 MPS 路径下 create_device_stream 返回 None;torch 2.15.0 新增了 torch.mps.Stream,而 create_device_stream(该调用由 #49156 引入)在加速模块存在 Stream 属性时会执行 device_module.Stream(device=device)。torch.mps.Stream() 本身可用,但不接受 device 关键字参数,于是抛出 TypeError。维护者将该现象描述为 torch 侧回归。

环境排查

  • 确认 torch 版本是否为 2.15.0;同环境下 2.14.1 可正常完成连续批处理。
  • 确认 transformers 版本(Issue 为 5.22.1),并确认 transformers/generation/continuous_batching/utils.py 中的 create_device_stream 是否包含 device_module.Stream(device=device) 调用。
  • 确认运行设备为 MPS(Apple Silicon / arm64),并记录 macOS 与 Python 版本。
  • 确认是否通过 generate_batch() 或 transformers serve --continuous-batching 触发,服务模式下关注 503 与 CB worker 日志。
  • 确认 huggingface_hub、accelerate 等依赖版本,便于问题复现时对比。

解决步骤

  1. 先记录当前环境:python -c "import torch, transformers; print(torch.__version__, transformers.__version__)",确认 torch 是否为 2.15.0。
  2. 采用 Issue 中已验证的规避方案,将 torch 固定为 2.14.1(例如在依赖中写入 torch==2.14.1),重新创建或安装环境后再运行复现脚本。
  3. 如果不想降级 torch,可优先尝试升级到包含修复的 Transformers 新版本;Issue 中维护者表示修复会进入下个 Transformers 版本,但未给出具体版本号,升级前请确认发布说明。
  4. 关于 torch 侧的修复,Issue 中维护者表示计划随 torch 2.16 发布,同样未给出确切版本;在官方修复可用前,不建议继续使用手动修改 create_device_stream 的方式。
  5. 不要采用 return None 或 return torch.mps.Stream() 作为长期方案:前者只是当前脚本未报错,后者已验证会产生乱码输出。
  6. 如果使用 transformers serve,完成上述处理后重启服务,再发起同样的连续批处理请求。

验证方法

使用 Issue 中的复现脚本,在 MPS 上对两条输入调用 model.generate_batch(),确认不再出现 TypeError: this function got an unexpected keyword argument 'device',并且生成文本正常可读(torch 2.14.1 下实测输出类似 ' The American Shorthair is a popular cat breed...')。服务模式下,确认请求返回 200,日志中不再出现 CB worker died。若升级到修复版本,建议分别用 generate_batch() 和 transformers serve --continuous-batching 各验证一次。

参考来源

huggingface/transformers #50395

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 33047

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注