Prhub

#53523 [Bugfix][NIXL] Fix Mamba prefill truncation ordering

原始 PR 作者 ZeldaHuang 合并时间 2026-08-25 10:13 文件变更 5 提交数 2 评论 2 代码增减 +32 / -14

执行摘要

修复 NIXL Mamba prefill 截断时序问题

Issue #53514 指出,在 NIXL prefill 侧(do_remote_decode=True)处理 Mamba 或混合 Mamba 请求时,若本地前缀缓存命中恰好覆盖了 N-1 截断后的剩余 prompt 长度,会导致 num_new_tokens 计算为 0,触发 Scheduler.schedule() 中的 assert num_new_tokens > 0 失败。问题根源在于截断发生在缓存查找之后,导致请求长度在查找前后不一致。PR 旨在通过调整截断时机来修复此问题。

该 PR 值得精读,特别是对于理解 KV 连接器中请求生命周期管理(截断时机与调度器交互)有参考价值。建议关注 _p_side_truncated 标记的设计和幂等性保证,这有助于类似时序问题的修复。同时,应跟进 MooncakeConnector 的 follow-up。

讨论亮点

ivanium 在 review 中提出,MooncakeConnector(针对 PD,而非 kv offloading 的 MooncakeStoreConnector)也需要相同的修复,建议合并此 PR 后提交 follow-up。ywang96 也 @ 了相关维护者。此建议未在当前 PR 中实现,但已被记录为后续工作。

实现拆解

  1. 在 base_scheduler.py 的 on_new_request 方法开头新增逻辑:当请求的 kv_transfer_params 包含 do_remote_decode 且连接器检测到 Mamba 模型时,调用 _truncate_mamba_request_for_prefill 执行 N-1 截断,确保在调度器前缀缓存查找之前请求长度已稳定。
  2. 从 pull_scheduler.py 和 push_scheduler.py 的 get_num_new_matched_tokens 方法中移除原有的截断调用,避免重复截断。
  3. 更新测试文件 test_nixl_push_connector.py:新增测试 test_p_side_mamba_truncates_before_cache_lookup,验证 on_new_request 后 prompt 长度减一且设置 _p_side_truncated 标记,并通过 patch 确保 get_num_new_matched_tokens 不再调用截断函数。
  4. 更新 test_nixl_connector_hma.py:调整 test_mamba_n1_p_side_truncation 测试,将截断调用从 get_num_new_matched_tokens 移到 on_new_request,并验证幂等性。
文件 模块 状态 重要度
vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py 调度器 modified 5.6
vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py 调度器 modified 5.2
vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py 调度器 modified 5.2
tests/v1/kv_connector/unit/test_nixl_push_connector.py 测试 modified 5.49
tests/v1/kv_connector/unit/test_nixl_connector_hma.py 测试 modified 4.46

关键符号

on_new_request get_num_new_matched_tokens _truncate_mamba_request_for_prefill

关键源码片段

vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py core-logic

核心修复:将截断逻辑提前至 on_new_request,确保调度器在缓存查找前请求长度已稳定。

# vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py
# on_new_request 方法:新增截断逻辑,确保在调度器前缀缓存查找前请求长度已稳定
def on_new_request(self, request: "Request") -> None:
    """Track a request that may need heartbeats."""
    params = request.kv_transfer_params
    # 新增:如果请求用于远程 decode 且连接器支持 Mamba,则先执行 N-1 截断
    if params is not None and params.get("do_remote_decode") and self._has_mamba:
        # 截断最后一个 prompt token,并设置 _p_side_truncated 标记,防止重复截断
        self._truncate_mamba_request_for_prefill(request)
​
    # 原有逻辑:心跳跟踪,仅对需要远程 prefill 的请求生效
    if params is None or not params.get("do_remote_prefill"):
        return
    # ...(后续心跳跟踪代码)
tests/v1/kv_connector/unit/test_nixl_push_connector.py test-coverage

新增测试验证截断提前到 on_new_request,并确保 get_num_new_matched_tokens 不再截断。

# tests/v1/kv_connector/unit/test_nixl_push_connector.py
# 新增测试:验证 P 侧 Mamba 请求在缓存查找前截断
def test_p_side_mamba_truncates_before_cache_lookup(self):
    """Push mode normalizes P-side Mamba requests before cache lookup."""
    sched = make_nixl_push_scheduler(has_mamba=True)
    request = create_request(num_tokens=10, do_remote_decode=True)
    original_len = len(request.prompt_token_ids)
​
    # 调用 on_new_request,应触发截断
    sched.on_new_request(request)
​
    # 断言 prompt 长度减一,且设置了截断标记
    assert len(request.prompt_token_ids) == original_len - 1
    assert request.kv_transfer_params["_p_side_truncated"] is True
​
    # 模拟缓存查找时不应再次截断,否则触发断言错误
    with patch.object(
        sched,
        "_truncate_mamba_request_for_prefill",
        side_effect=AssertionError("must not truncate after cache lookup"),
    ):
        assert sched.get_num_new_matched_tokens(request, 0) == (0, False)

评论区精华

MooncakeConnector 需要相同修复 设计

ivanium 在 review 中指出,MooncakeConnector(针对 PD)也需要相同的截断时序修复,建议合并后提交 follow-up。

结论:当前 PR 已合并,MooncakeConnector 的修复留待后续 PR 处理。 · resolved-followup

风险与影响

主要风险在于将截断逻辑提前到 on_new_request 后,可能影响请求的其他处理路径,例如心跳跟踪逻辑。但变更仅在 do_remote_decode 且存在 Mamba 时执行,并有 _p_side_truncated 标记防止重复截断,风险较低。另外,测试是否充分覆盖了所有边界情况(如预emption)仍需关注。

该修复直接影响 NIXL KV 连接器在 Mamba 模型上的 prefill 路径,消除了零新增 token 的崩溃风险。影响范围限于使用 NIXL 连接器且启用 do_remote_decode 的 Mamba 场景,对普通路径无影响。团队需关注 MooncakeConnector 的 follow-up 修复。

核心路径变更 缺少端到端测试

关联 Issue

#53514 [Bug]: NIXL Mamba P-side truncation can produce zero new tokens after a local prefix-cache hit

完整报告

参与讨论