vllm-project/vllm-ascend
[Contribution] 任务 #6:[Correctness] 为 ZMQ lookup RPC 增加有界 deadline、错误协议与连接恢复
Aperta
#14.147 aperta il 13 ago 2026
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。
任务
- 为 client 实现上述完整 deadline、初始化校验、fail-open 和 socket 重建。
- 保留当前请求字段语义,但严格校验帧数量和类型:两个整数帧必须恰为 4 字节,
token_len/hbm_hit_tokens/group id/hash 列表必须满足类型、非负性和范围约束。 - 将响应改为单帧、版本化 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 字节响应兼容,但必须在设计说明中写明协议切换。
- 成功:
- 调整 worker/server 边界,使真实 miss 与 backend/lookup 异常在 RPC 层可区分;client 对后者仍按统一契约降级为
0。 - 增加按失败类别聚合的限流 warning 和计数指标。日志仅记录错误码、阶段、耗时、token/hash/group 数量,不得记录完整 hash、key 列表或原始报文。
- 完成 client/server 生命周期:
close()可重复调用;停止 server loop,保证后台线程在有界时间内退出,关闭 socket 并释放 ZMQ context;关闭过程中不得产生未捕获异常。
验收标准
- server 不存在、无响应或回复过晚时,
lookup()在lookup_rpc_timeout_ms加明确测试容差内返回0,不存在无限阻塞。 - timeout、
zmq.Again、EFSM/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