TypeError: can only concatenate tuple (not “list”) to tuple

当你在 Accelerate 的 split_between_processes() 中传入 tuple 类型数据并同时设置 apply_padding=True 时,会在所有 rank 上触发该报错;优先检查输入是否为 tuple,以及当前 accelerate 版本是否已包含类型感知的 padd

快速结论:当你在 Accelerate 的 split_between_processes() 中传入 tuple 类型数据并同时设置 apply_padding=True 时,会在所有 rank 上触发该报错;优先检查输入是否为 tuple,以及当前 accelerate 版本是否已包含类型感知的 padding 修复。

适用环境:已在 accelerate 1.15.0 稳定版复现,reporter 也在 main(1.16.0.dev0)上遇到;macOS 26.5.1 arm64、Python 3.11、torch 2.14.0(reporter 侧为 torch 2.5.1)、CPU 和 CUDA 均可触发,使用 torchrun --nproc_per_node=2。

最快修复方案:该问题已在 PR #4307 中修复,修复方式是将 padding 改为类型感知:当 result 是 tuple 时,使用 (inputs[-1],) * num_padding 生成 tuple padding,而不是列表。可升级到包含该修复的 accelerate 版本,或临时将输入改为 list。

注意事项:Issue 讨论中只提到修复位于 PR #4307,未给出具体发布版本号;在确认升级到的版本确实包含该 PR 前,直接升级不一定生效。若继续使用 tuple,需回归测试 apply_padding=True 在多进程下的 padding 行为。

问题场景

用户在使用 Accelerate 的 PartialState.split_between_processes() 做多进程数据切分时,传入一个 tuple(文档中说明 tuple 属于可接受的输入类型),并开启 apply_padding=True。即使数据被当前进程数整除、不需要实际填充,也会在每一个 rank 上报错。使用 list 输入则 padding 行为正常。

报错原文

TypeError: can only concatenate tuple (not "list") to tuple

原因分析

最可能的原因是:split_between_processes() 在 apply_padding=True 时,把 padding 以 list 形式拼接到 result 上,而 tuple 切片得到的 result 也是 tuple;Python 不允许 tuple += list,因此拼接失败。讨论中还指出,这个拼接在空判断生效之前无条件执行,所以 rank 0 这种已经均分、无需 padding 的情况也会失败。list 输入路径显示 padding 语义本身是正确的,问题集中在 padding 的类型与 result 类型不一致。

环境排查

  • 确认 accelerate 版本:报错在 1.15.0 稳定版复现,main/1.16.0.dev0 也存在;检查是否已包含 PR #4307 的修复。
  • 确认 Python 版本:复现环境为 Python 3.11。
  • 确认 PyTorch 版本:reporter 使用 torch 2.5.1,另一复现环境为 torch 2.14.0。
  • 确认运行方式与进程数:使用 torchrun --nproc_per_node=2 可复现。
  • 确认硬件与后端:CPU 和 CUDA 均可触发,macOS 26.5.1 arm64 上复现。
  • 确认输入类型与参数:输入为 tuple,且 apply_padding=True。

解决步骤

  1. 先确认当前 accelerate 版本,判断是否包含 PR #4307 的类型感知 padding 修复。
  2. 如果版本未包含修复,可优先尝试升级到包含该 PR 的 accelerate 版本。
  3. 如果暂时无法升级,可优先尝试将传入 split_between_processes() 的 tuple 改为 list,以绕开 tuple += list 失败的问题。
  4. 若修改了 accelerate 源码或使用了修复分支,按 Issue 中的复现方式用 torchrun --nproc_per_node=2 重新验证 tuple 路径。

验证方法

使用 Issue 中的最小复现代码,在 torchrun --nproc_per_node=2 环境下分别测试 list 和 tuple 输入:list 应正常输出各 rank 的切分结果并正确 padding;tuple 输入在修复后不应再抛出 TypeError,且 padding 后每个 rank 的数据长度和填充值符合预期。既然问题会在所有 rank 上出现,需要同时确认两个 rank 的输出。

参考来源

huggingface/accelerate #4306

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 25589

发表回复

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