Open
[RFC]: vllm-ascend KV Cache 监控 需求设计文档 #658
wangchao285Add on 16 days ago
16 days ago Added label: rfc
16 days ago Added label: rfc
捡到宝。
16 days ago Comments:
16 days ago Comments:
👋 您好,欢迎向 MindStudio Probe 提交 Issue!
我们已收到您的反馈,感谢你对开源社区的支持。🎉
📅处理时效: 维护团队将在24小时内 查看并回复您的问题(工作日)。
🔍自助查询: 在等待期间,建议您先查阅以下资料,可能已有解决方案:
📖 MindStudio Probe官方文档
📝 贡献者指南
请确保 Issue 描述清晰,包含复现步骤和日志,这将帮助我们更快定位问题。谢谢!


16 days ago Added label: triage-review
11 days ago Modify description of issue
状态(Status): Reviewing
作者(Authors): wangchao285, hekunkun
**创建日期(Created):**2026-10-28
**更新日期(Updated):**2026-10-28
相关 Issue/PR: #123(关联 Issue/PR 以便追踪背景)
1. 概述
1.1 简介
本提案面向 vllm-ascend 推理框架,规划一套完整的 KV Cache 可观测性能力,由两个相互独立、可分别使能的子需求组成:
两个子需求共享统一的可观测性框架(指标注册表、采集器、暴露器),核心价值是显著降低 PD 分离部署与长稳运行的排障成本,让 KV Cache 的数值状态与行为状态从"运行时黑盒"变为"可观测白盒"。监控默认关闭、按需开启,对在线推理引入的开销可控可量化。
1.2 动机
使用场景:PD 分离部署是长上下文与大模型推理提升吞吐、优化 TTFT 的常见形态。P 实例计算密集(产出 KV Cache),D 实例访存密集(消费 KV Cache),两者之间通过 KV transfer 连接器(PyNcclConnector / P2pNcclConnector + RDMA/共享显存,
kv_transfer_config.kv_role = kv_producer/kv_consumer)批量搬运 KV block。这类集群上生产后,运维与算法人员高频提出三类问题:当前痛点:
num_requests_running、kv_cache_usage_perc等),缺少 PD 传输面与 block 行为面的观测。问题出现时只能加日志重启、靠经验与 printf 排查,一个跨实例的 KV 传输问题常常要数小时定位。必要性:上述两类能力的实现都可在插件层完成、默认关闭、开销可量化,投入可控;而缺失的代价是 PD 部署与 block 级问题持续黑盒,生产可维护性受限。
用户价值:排障时间从"小时级"降至"分钟级";为容量规划、调度策略调优提供量化依据;为长稳可靠性提供故障诊断与证据链。
不做此提案的影响:PD 分离上生产仍缺少传输面与 block 行为面的基础观测手段,相关故障依赖人工排查,SLO 维护成本居高不下。
1.3 目标
目标
/metrics暴露 + 结构化日志),覆盖 P 端、D 端与传输面;使能后对在线推理性能的影响控制在设计指标之内(见 3.3)。log/raise两种处置动作;默认关闭、配置化使能。非目标(边界说明,防止需求蔓延)
2. 用例分析
针对上述两个子需求的各类场景,用例分析如下。
action=raise时,检测到违规即锁存错误、停止返回 worker 结果,隔离故障请求3. 方案设计
3.1 总体方案
整体思路:在 vllm-ascend 插件层构建统一的可观测性框架——
KVCache Monitor,包含「指标注册表 + 采集器(Collector)+ 暴露器」三段式结构;数值类监控与行为类监控分别以独立采集器接入框架,行为类监控额外挂接共享的GuardRuntime(请求/执行校验)。所有能力 opt-in 使能,默认不改变任何调度与执行语义。系统架构布局:
核心逻辑:
/metrics,同时可按需输出结构化日志(JSON)。采集走独立轻量线程/异步路径,不阻塞推理线程。allocation / release / schedule三个钩子按引擎实例从配置使能,记录「请求 ↔ 被分配 block」的绑定关系与生命周期。log记录违规上下文;raise锁存违规并停止返回 worker 结果,worker 需重启才能复用。平台与依赖:运行于华为昇腾 NPU(如 910B 系列)平台,依赖 CANN、torch_npu 与 vllm-ascend 插件环境,不引入新硬件依赖;数值监控可选依赖 Prometheus 客户端库(或自实现文本暴露端点)。
限制与约束说明:
3.2 技术选型
数值类监控实现方式:
/metrics+ 日志)行为类监控元数据方案:
Guard 运行时实现结构:
kv_guard_v2.py模块已因冗余被删除)集成落点:监控全部落在 vllm-ascend 插件层与
additional_config配置面,不 fork、不修改上游 vllm 核心,随上游演进可平滑升级。3.3 功能与性能设计
3.3.1 需求一:PD 分离 KV Cache 数值类监控
指标设计(以下为设计建议表,最终指标命名与口径以参考实现 msprobe 评审确认后固化进入《指标字典》):
vllm_ascend_)kv_cache_usage_percentkv_block_alloc_totalkv_block_free_totalprefix_cache_hits_totalprefix_cache_hit_ratiopd_transfer_tokens_totalpd_transfer_latency_secondspd_transfer_queue_depthpd_transfer_in_flight运行核心流程(文字描述):
/metrics,同时按日志级别关联打印(可选)。性能设计与影响范围:
3.3.2 需求二:KV Cache 行为类监控(block 级)
检查项设计(与参考实现 PR #17833 校验维度一致):
数据模型(核心元数据结构):
block_idgenerationowner_requestinit_prefix_lenlogical_orderstatus执行流程(文字描述):
BlockState元数据;action=log:记录违规上下文到结构化日志;action=raise:锁存错误并停止返回 worker 结果,worker 需重启才可复用;生命周期状态在 clear/copy 边界及 Mooncake receive 完成边界更新,确保比对语义与运行时一致。限制与约束:Guard 不保存 KV 快照/内容哈希/token 历史;不支持的缓存/执行语义在使能时被拒绝并提示;不阻断已提交写入(仅事后诊断)。
3.4 安全隐私与DFX设计
安全隐私:
/metrics端点默认仅监听本地/受控网段,建议由运维统一做访问控制与加密网关代理;日志输出遵循现有日志脱敏规范;enabled、未知action)一律拒绝,避免配置面被注入。兼容性:
additional_config.kv_guard_config,不引入新环境变量,移除的旧变量不回退(与参考实现一致);数值监控的指标端点为标准 Prometheus 文本协议,可平滑接入既有观测系统。可维护性:
release_notes/fragments/<PR>.yaml)说明行为变更;可测试性:
可靠性:
3.5 编程与调用设计
3.5.1 编程模型基本设计
开发环境:
torch_npu;vllm + vllm-ascend 对应版本(建议同版本配套);NPU_LOG_LEVEL与结构化日志采样;KVCache Monitor)为 out-of-tree 插件模块随 vllm-ascend 发布,无需用户自建。开发约束:
vllm_ascend_前缀,注册前查重;可验收设计:
3.5.2 接口定义与设计
3.5.2.1 KV Guard 行为监控配置接口(
additional_config.kv_guard_config)--additional-config以 JSON 结构使能 block 级行为监控(KV Cache Guard)并指定违规处置动作。不可用环境变量回退,仅当配置存在且合法时生效。{ "kv_guard_config": { "enabled": true, "action": "raise" } }kv_guard_configenabledtrue/false,非布尔值拒绝action"log"(默认)/"raise"enabled非布尔、action值未知时,拒绝启动并打印拒绝原因;不静默忽略。raise模式下触发违规后 worker 结果停止返回,需重启 worker 恢复。# log 模式(默认): 违规仅记录日志 vllm serve MODEL \ --additional-config '{"kv_guard_config":{"enabled":true}}' # raise 模式: 违规即锁存并停止返回结果 vllm serve MODEL \ --additional-config '{"kv_guard_config":{"enabled":true,"action":"raise"}}'3.5.2.2 数值监控指标暴露接口(Prometheus
/metrics)/metrics,供 Prometheus/Grafana 等系统拉取;同时兼容结构化日志输出。GET /metrics(HTTP),Accept: text/plain; version=0.0.4; charset=utf-8;日志输出为既有log_struct通道。metrics_path"/metrics"(默认,可配置)scrape_intervalvllm_ascend_前缀与《指标字典》。/metrics与既有 vllm 指标。scrape_configs: - job_name: "vllm_ascend_kv" static_configs: - targets: ["<P 实例 IP>:8000", "<D 实例 IP>:8000"] metrics_path: /metrics3.5.2.3 自定义采集器扩展点(二次开发)
KVCache Monitor注册自定义采集器或订阅 Guard 违规事件,便于接入自有观测/告警系统。参考实现为纯函数式注册回调。from vllm_ascend.monitor import register_collector, subscribe_guard_events @register_collector(name="my_kv_custom_metric", metric_type="gauge") def my_collector(ctx) -> float: """返回当前快照值, 由框架按周期拉取并纳入 /metrics 输出。""" ... def on_guard_violation(event: GuardViolationEvent) -> None: """收到违规事件时回调; 实现方自行处理幂等与限流。""" ... subscribe_guard_events(on_guard_violation)namevllm_ascend_前缀metric_typegauge/counter/histogramGuardViolationEvent3.5.3 编程手册设计
在既有 vllm-ascend 文档体系内更新——新增/扩展 《user_guide / feature_guide》 中的 KV Cache 监控章节(数值监控 + Block 级行为监控),采用随版本更新、单独成章方式输出,建议包含:
--additional-config配置示例(数值监控开关、KV Guardenabled/action);vllm_ascend_*指标定义、口径(含命中率按 token/block 口径说明)、单位;action=raise锁存)的处理步骤;4. 测试设计
单元测试(Unit):
BlockState流转);集成测试(Integration):
raise且零违规);同矩阵加做使能前后性能对比(吞吐、TTFT/TPOT、峰值显存),验证 3.3.1 设计指标(衰减 ≤ 3%);端到端测试(E2E):
/metrics中pd_transfer_*指标与真实传输请求量、时延统计、池水位一致,且与 D 实例接收侧计数对齐;性能/资源测试:
5. 缺点和风险
说明潜在风险(Breaking Change、性能回退、复杂度提升、引入的安全问题)、负面影响(对现有功能/用户的冲击)、实现成本(代码量/维护成本/人力投入)、是否有API或版本兼容性、旧版本迁移方案问题等,给出应对措施。
6. 现有技术
参考其他项目/社区的类似设计,说明借鉴与差异。
7. 未解决问题
待社区讨论/决策的开放问题,如硬件适配范围、参数默认值等(需在RFC通过前解决)。
附录