
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 模型)中,使用 DynamicCache、use_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 版本。
解决步骤
- 升级到修复版本(可优先尝试):检查
transformers最新版本(建议使用 ≥4.51.0 或包含该修复的 commit)。该 Issue 已被标记为Good Second Issue,社区已有人(如 @Ramshankar07)提交 PR,等待 @vasqu 等 Mamba 专家审查。 - 临时规避方案:如无法升级,确保推理时 seq_len=1(即逐 token 传递),或禁用
use_cache(但会失去状态继承能力)。 - 自行修复参考:若需自行打补丁,需修改
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)。
- 当 seq_len > 1 时,路由到 chunked-prefill 路径:使用
- 测试覆盖:修复后需测试 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(来源中提及):
- state-spaces/mamba#641 – Mamba2 chunked inference 类似 bug(含重现代码)。
- state-spaces/mamba#830 – Mamba1 的并行前向+状态修复 PR。
- huggingface/transformers #45513 – GDN 模型的类似状态继承修复参考。



