Skip to content

InMemoryAgent.commit_write_extent 的 D10 守卫在 EXTEND→decode 后永不 shrink(mock 会计失真) #45

Description

@chengda-wu

问题(mock 保真度,非生产 bug)

_prepares_since_commit 计数器在 EXTEND 步递增但不 commit,导致进入 decode 后首次 commit 恒见 n>1,永远走 n-1; return 不 shrink 分支,verify 槽回收被跳过。

证据(file:line 已核实)

EXTEND 步 prepare 递增计数器node_scheduler.py:472write_setmemory.py:109 _prepares_since_commit += 1

EXTEND 步 process 不 commitnode_scheduler.py:539-547

if computed_before < prompt_len:
    req.num_computed_tokens = min(prompt_len, computed_before + scheduled_n)
    ...
    continue   # ← 不调用 commit_write_extent

decode 步 commit 见 n≥2 跳过memory.py:62-65

n = self._prepares_since_commit.get(req_id, 0)
if n > 1:
    self._prepares_since_commit[req_id] = n - 1
    return        # ← 永不 shrink

任何经过 EXTEND 的 req,_prepares_since_commit 至少为 1;decode prepare 再 +1 → commit 时 n≥2 恒成立 → 永远不执行 l0_token_end = min(...)

后果(仅限 InMemoryAgent)

spec verify 拒绝部分 draft(A < max_accept)时,l0_token_end 应从预留 end+max_accept 回收到 end+A,但 shrink 被跳过 → probe_local 对同 req 报告过长的 L0 前缀(unaccepted verify 槽未回收),直到 on_request_finished 才清。

生产用真 agent 不受影响,但 mock 不再忠实模拟「verify 槽回收」,可能掩盖真池的同类 bug(如 #44 的反向溢出)。

解决方案

二选一:

  1. EXTEND 步 process 后也 commit(或 commit 在 EXTEND 分支显式调用一次)。
  2. D10 计数只对 generate/verify 步递增,EXTEND 不计入「待 commit」序列。

待核实生产 agent 是否有等价问题。

参考

  • D10 守卫对齐 vLLM V2 device 侧接受长度会计(host min 不得压后续 prepare 已抬高的预留)。本项无外部参考实现,属内部 mock 逻辑缺陷。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions