Torch fallbacks of the linear-attention ops drop `seq_idx` / `cu_seqlens`, so packed documents leak without the optional packages

当你在没有安装 flash-linear-attention / causal-conv1d 等可选加速包的环境中,用 DataCollatorWithFlattening 做 packed(无 padding)训练或推理时,linear-attention 的 Torch fallback 会丢弃

快速结论:当你在没有安装 flash-linear-attention / causal-conv1d 等可选加速包的环境中,用 DataCollatorWithFlattening 做 packed(无 padding)训练或推理时,linear-attention 的 Torch fallback 会丢弃 seq_idx / cu_seqlens,导致不同文档之间的状态互相泄漏,输出“静默错误”。优先检查是否真的缺少这些可选包,并确认是否必须走 packed 路径。

适用环境:transformers main(4cc2aa8430)、torch 2.13.0+cu130、H100、flash-linear-attention 0.5.2、causal-conv1d 1.7.0。复现还涉及 Qwen/Qwen3.5-0.8B 模型与 DataCollatorWithFlattening。

最快修复方案:暂无确认的一步修复方案。根据讨论,维护者选择的方向是:保留 packed 的 seq_idx / 类似参数时,让 wrapper 在丢弃这些参数前直接 raise,而不是静默走 fallback(对应草稿 PR #49474 的思路)。在修复落地前,临时规避方式是避免在缺少这些可选包时使用 packed 路径。

注意事项:不要试图在纯 eager(仅 Torch)路径上自行“补齐” seq_idx 支持,讨论中明确表示这样过于复杂且低效。另外,packed 训练属于 power feature,期望是“不可见、隐藏在 kwargs 之后”的行为,因此官方更倾向于显式报错而不是继续静默降级。

问题场景

用户在使用 Transformers 的 linear-attention 类模型(如 Qwen3.5、Bamba、Falcon-H1、GraniteMoeHybrid、Mamba2、Nemotron-H、Zamba2 等)配合 DataCollatorWithFlattening(return_flash_attn_kwargs=True, return_seq_idx=True) 做 packed 文档训练或推理时触发。当环境中没有安装 flash-linear-attention / causal-conv1d,方法会回退到 Torch 参考实现;此时第二个文档的得分会受第一个文档影响,出现文档边界泄漏。

报错原文

tensor(0.0007, device='cuda:0')
# 缺少 causal_conv1d 时
[transformers] `causal_conv1d_fn` is falling back to its reference PyTorch implementation because `causal_conv1d` is not installed. This is correct but much slower; install `causal_conv1d` for the optimized kernel.
tensor(5.7380, device='cuda:0')
# 同时缺少 flash-linear-attention 与 causal_conv1d 时
[transformers] `chunk_gated_delta_rule` is falling back to its reference PyTorch implementation because `flash-linear-attention` is not installed. This is correct but much slower; install `flash-linear-attention` for the optimized kernel.
tensor(1.9553, device='cuda:0')

Torch fallbacks of the linear-attention ops drop `seq_idx` / `cu_seqlens`, so packed documents leak without the optional packages

原因分析

最可能的原因是:use_kernel_func_from_hub_with_fallback 会把 Torch 参考实现未声明的 kwargs 丢弃,而这些参考实现都没有声明 seq_idx / cu_seqlens。于是 conv 和 recurrent state 会跨文档边界运行:没有安装任何可选包时,第二个文档的得分就像只给了 position_ids(参见 #49440);只装了 flash-linear-attention 而没装 causal-conv1d 时更糟——delta rule 会在边界重新开始,但 conv 特征已经与上一个文档混合。讨论中还指出 mamba_chunk_scan_combined 有同样的问题(影响 Bamba、Falcon-H1、GraniteMoeHybrid、Mamba2、Nemotron-H、Zamba2)。

虽然相关行为在 padding-free training 文档中有说明,但讨论中认为它并不完全等同于 FA 的契约:没有 FA 时,sdpa 仍会依据 position_ids 构建 mask(#39194)把 packed 序列分开,只是更慢;而缺少 fla / causal-conv1d 时,linear-attention 的 fallback 不是更慢,而是静默地算错。历史上 LFM2 的 slow path 曾按 segment 跑 conv(#46633,直到 #47452),Bamba 也曾在 #47630 之前直接抛错 seq_idx support requires fast path support。

环境排查

  • 确认 transformers 版本,是否为 main(4cc2aa8430)或包含相关改动的版本。
  • 确认 PyTorch 版本,例如 2.13.0+cu130。
  • 确认是否安装 flash-linear-attention(如 0.5.2)和 causal-conv1d(如 1.7.0),以及 kernels-community/mamba-ssm hub kernel 是否可用。
  • 确认 GPU 型号/算力(复现使用 H100)与 CUDA 版本。
  • 确认是否使用 DataCollatorWithFlattening 且设置了 return_seq_idx=True / return_flash_attn_kwargs=True 等 packed 相关 kwargs。
  • 确认模型类型是否属于 linear-attention / Mamba 系列(Qwen3.5、Bamba、Falcon-H1、GraniteMoeHybrid、Mamba2、Nemotron-H、Zamba2 等)。

解决步骤

  1. 先确认当前环境是否缺少 flash-linear-attention / causal-conv1d。缺少这些包时,linear-attention 会走 Torch fallback,packed 的 seq_idx / cu_seqlens 会被丢弃。
  2. 用 Issue 提供的复现脚本对比安装可选包前后的结果差异,确认第二个文档的 logprob 偏差是否随包的不同而变化(示例中三种情况下最大偏差分别为 0.0007、5.7380、1.9553)。
  3. 关注 #49474(最小方案:丢弃 seq_idx / 类似参数时直接 raise)和 #49477(让 torch 参考实现按 seq_idx 处理 conv 窗口、按序列跑 delta rule / Mamba2 scan)的进展。
  4. 在官方修复落地前,如果没有安装相关可选包,避免使用 packed 路径;或安装对应的可选包/hub kernel,让计算走 fast path。
  5. 如果希望走 raise 方案,可以考虑采用 #49474 的思路:当 packed 相关 kwargs 存在时,让 wrapper 在进入 Torch fallback 前显式报错,而不是静默降级。

验证方法

用 Issue 中的复现脚本:在同一 batch 上对 packed 和单独 alone 的第二个文档 logprob 求差,观察 (lp(packed) - lp(alone)).abs().max()。如果文档边界不再泄漏,该值应在无泄漏场景下接近 0;如果走 raise 方案,则应在传入 seq_idx / cu_seqlens 时得到显式异常而非错误数值。也可以进一步用“重新随机化第一个文档”的方式,确认第二个文档输出是否随之变化(讨论中给出的变化幅度:causal_conv1d_fn 约 5.1,mamba_chunk_scan_combined 约 5.0,chunk_gated_delta_rule 约 0.05;安装 causal-conv1d、flash-linear-attention 和 kernels-community/mamba-ssm hub kernel 时变化为 0)。

参考来源

huggingface/transformers #49472

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 29212

发表回复

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