vllm-project/vllm-ascend

[Contribution] 任务 #6:[Correctness] 为 ZMQ lookup RPC 增加有界 deadline、错误协议与连接恢复

Aperta

#14.147 aperta il 13 ago 2026

 (2 commenti) (0 reazioni) (0 assegnatari)C++ (2101 fork)github user discovery
help wanted

Metriche repository

Star
 (2689 stelle)
Metriche merge PR
 (Merge medio 3g 22h) (733 PR mergiate in 30 g)

Descrizione

背景

非 layerwise 模式下,scheduler 通过 ZMQ REQ/REP 向 worker 查询外部 KV 命中。当前 client 在发送后无界阻塞等待回复;server 的收包循环没有请求级异常边界,畸形帧或解码异常可终止 server thread。backend lookup 异常虽被 worker 捕获并折叠为 0,但协议无法区分真实 miss 与服务端故障。REQ/REP 在超时或未完成收发状态后也不能安全复用现有 socket。

相关代码路径:vllm_ascend/distributed/kv_transfer/kv_pool/ascend_store

固定行为契约

  • 新增 lookup_rpc_timeout_ms:单位毫秒,默认 5000,只接受正整数;0 或负数不表示无限等待,必须在初始化阶段拒绝。
  • timeout 是单次 lookup() 从开始发送、等待回复到完成响应校验的完整 wall-clock deadline;实现不能让 send 和 recv 分别消耗一份完整 timeout。
  • 任一 timeout、transport、REQ 状态、协议、解码或 server lookup 错误,当前请求均 fail-open 为 0 个外部命中,scheduler 返回无外部命中并继续本地重算;默认行为不得向 scheduler 抛出异常,也不得在同一次调用中无界重试。
  • client 在失败时先以 linger=0 关闭旧 REQ socket,再创建新 socket;失败调用返回前必须完成恢复,使下一次正常 lookup 可以成功。
  • server 对每个已收到的请求恰好发送一次成功或错误响应。单请求异常不得结束服务循环;若 REP socket 自身进入不可恢复状态,server 必须关闭并重建 socket。

任务

  1. 为 client 实现上述完整 deadline、初始化校验、fail-open 和 socket 重建。
  2. 保留当前请求字段语义,但严格校验帧数量和类型:两个整数帧必须恰为 4 字节,token_len/hbm_hit_tokens/group id/hash 列表必须满足类型、非负性和范围约束。
  3. 将响应改为单帧、版本化 msgpack envelope:
    • 成功:{"version": 1, "status": "ok", "hit_tokens": N}
    • 失败:{"version": 1, "status": "error", "code": CODE, "message": SANITIZED_MESSAGE}。 client 必须校验版本、字段集合、类型及 0 <= hit_tokens <= token_len。不支持的版本按协议错误 fail-open。该 RPC 连接同一实例内的 scheduler/worker,双方同时升级;不要求旧裸 4 字节响应兼容,但必须在设计说明中写明协议切换。
  4. 调整 worker/server 边界,使真实 miss 与 backend/lookup 异常在 RPC 层可区分;client 对后者仍按统一契约降级为 0
  5. 增加按失败类别聚合的限流 warning 和计数指标。日志仅记录错误码、阶段、耗时、token/hash/group 数量,不得记录完整 hash、key 列表或原始报文。
  6. 完成 client/server 生命周期:close() 可重复调用;停止 server loop,保证后台线程在有界时间内退出,关闭 socket 并释放 ZMQ context;关闭过程中不得产生未捕获异常。

验收标准

  • server 不存在、无响应或回复过晚时,lookup()lookup_rpc_timeout_ms 加明确测试容差内返回 0,不存在无限阻塞。
  • timeout、zmq.AgainEFSM/REQ 状态错误、断连、空响应、旧 4 字节响应、错误版本、缺字段、错误类型、越界/负数命中均 fail-open,并重建 socket。
  • server 对缺帧、多帧、非 4 字节整数、非法 msgpack、非法 group/hash/token 参数和 backend 异常返回版本化错误;处理后 thread 仍存活,下一次合法请求成功。
  • scheduler 级回归测试证明 RPC 失败返回 (0, False)、不创建外部 load spec,并继续本地计算路径。
  • 正常的零命中、部分命中、完整命中和多 KV group 语义无回归;成功响应仍严格限制在 token_len 内。
  • client/server 连续调用两次 close() 均安全,server thread 和 ZMQ context 无泄漏。
  • 提供正常路径改动前后延迟对比;错误日志和测试输出不包含完整 hash payload。

交付件

  • PR、deadline/协议/fail-open/socket 状态机设计说明和兼容性说明。
  • client、server、scheduler 层异常与恢复单测。
  • 正常路径开销数据、日志/指标示例和回退方案。

环境约定

  • vllm-ascend:最新 main
  • 硬件:Ascend NPU(注明型号 + 卡数 + TP/CP/PP 配置)
  • 关联任务池:#9079
  • 验收人:@赵鹏博

任务周期

  • 发布:2026-08-12
  • 回收:2026-10-31

Guida contributor