Mamba2Mixer: use_cache with seq_len > 1 silently produces incorrect results (both CPU and GPU paths)

用户在 HuggingFace transformers 库(Mamba2 模型)中,使用 DynamicCache 、 use_cache=True 且输入序列长度(seq_len)大于 1 时触发。场景包括:对长序列进行分块推理,期望通过缓存状态实现状态继承,但 Mamba2Mixer 仅支持单

Mamba2Mixer: use_cache with seq_len > 1 silently produces incorrect results (both CPU and GPU paths)

Mamba2Mixer: use_cache with seq_len > 1 silently produces incorrect results (both CPU and GPU paths)

快速结论:该问题发生在 transformers 库中 Mamba2 模型使用 use_cache 且输入序列长度(seq_len)大于 1 时。当前实现仅支持单 token 解码(seq_len = 1),当 seq_len > 1 时,CPU 路径会静默处理第一个 token 后忽略剩余 token,GPU 路径则因张量形状不匹配导致崩溃。优先排查是否使用了 DynamicCache 和 seq_len > 1 的组合。

问题场景

用户在 HuggingFace transformers 库(Mamba2 模型)中,使用 DynamicCacheuse_cache=True 且输入序列长度(seq_len)大于 1 时触发。场景包括:对长序列进行分块推理,期望通过缓存状态实现状态继承,但 Mamba2Mixer 仅支持单 token 解码路径。

报错原文

Mamba2Mixer: use_cache with seq_len > 1 silently produces incorrect results (both CPU and GPU paths)

CPU path: silently only processes the first token, produces incorrect results.

GPU path: `.squeeze(1)` does nothing, tensor stays (B, L, proj_dim) instead of (B, proj_dim); causal_conv1d_update expects 2D (B, conv_dim) input -> will crash.

原因分析

可能原因:Mamba2Mixer 的 forward() 方法中,is_decoding 分支(使用缓存时)硬编码了 seq_len=1 的假设:

  • CPU 路径:当 is_decoding=True,代码通过 dt = dt[:, 0, :][:, None, ...] 仅取第一个 token 执行单步 SSM,忽略后续 token。
  • GPU 路径.squeeze(1) 仅在 seq_len=1 时移除维度 1;当 seq_len>1 时,squeeze 无效,张量形状仍为 (B, L, proj_dim),导致 causal_conv1d_update 期望 2D 输入时崩溃。
  • 并行路径is_decoding=False)虽能处理完整序列,但无法传入非零初始状态,无法用于分块推理。

该 bug 的本质是缺少对“use_cache + seq_len > 1”场景的 chunked-prefill 路由,而 Mamba1 已有类似的修复 PR(如 state-spaces/mamba#830 等)。

环境排查

  • 确认库版本transformers 版本号(需 >=4.49.0 且 <4.51.0 的早期版本受影响,具体看 Issue 关闭后的修复 PR)。
  • 确认模型类型:使用 Mamba2Model 或基于 Mamba2 的模型(如 Bamba)。
  • 确认缓存机制:明确启用了 use_cache=True 且传入 DynamicCache 对象。
  • 确认序列长度:输入 input_ids 的 seq_len > 1(如 batch 预处理 10% 的长序列)。
  • 可能还需确认 CUDA 版本(用于 GPU 路径)和 PyTorch 版本。

解决步骤

  1. 升级到修复版本(可优先尝试):检查 transformers 最新版本(建议使用 ≥4.51.0 或包含该修复的 commit)。该 Issue 已被标记为 Good Second Issue,社区已有人(如 @Ramshankar07)提交 PR,等待 @vasqu 等 Mamba 专家审查。
  2. 临时规避方案:如无法升级,确保推理时 seq_len=1(即逐 token 传递),或禁用 use_cache(但会失去状态继承能力)。
  3. 自行修复参考:若需自行打补丁,需修改 Mamba2Mixer.forward()is_decoding 分支:
    • 当 seq_len > 1 时,路由到 chunked-prefill 路径:使用 causal_conv1d_fn 处理卷积 + mamba_chunk_scan_combined 传入 initial_states(来自缓存),并更新卷积状态和 SSM 状态。
    • 参考已有实现:#45513(GDN 模型的类似修复)以及 state-spaces/mamba 仓库的 #830 PR(Mamba1)。
  4. 测试覆盖:修复后需测试 seq_len=1 和 seq_len>1 场景下的结果一致性,以及状态继承的正确性。

验证方法

编写测试脚本:使用同一 Mamba2 模型,比较“全量序列前向传播结果” vs “分块推理(use_cache + seq_len>1)结果”。如果输出一致(例如 logits 张量误差在 1e-5 内),则问题修复。具体参考 Issue 中的重现代码:

import torch
from transformers import Mamba2Config, Mamba2Model
from transformers.cache_utils import DynamicCache

# 与 Issue 重现代码一致,但需添加结果对比断言

注意:transformers 官方可能也会增加集成测试,关注 #46032 的关联 PR 合并状态。

参考来源

huggingface/transformers #46032

相关 Issue/PR(来源中提及):

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 9628

发表回复

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