Prhub

#44629 [PD][Bugfix] Fix KV Cache sharing with HMA

原始 PR 作者 NickLucche 合并时间 2026-06-09 21:10 文件变更 3 提交数 4 评论 3 代码增减 +38 / -12

执行摘要

修复 PD 模式下 HMA 的 KV 缓存共享崩溃

HMA 成为默认后端(PR #41847)后,PD 部署中遇到 shared KV cache layers 时崩溃。PR body 指出 'layers that share the same KV cache tensor currently crashes on main when attempting to fetch the corresponding layer_spec',修复可让 google/gemma-4-E2B-it 等模型在 PD 模式下正常运行。

值得精读和 merge,修复明确且测试完善。对于维护者,可作为 PD 连接器中处理 KV cache 共享的标准参考模式。

讨论亮点

无实质性 review 讨论。只有 Mergify 机器人重复提醒 pre-commit 失败(共 3 次),以及 Claude 机器人自动评论(因从 fork 发起,未执行 review)。mgoin 直接批准。

实现拆解

  1. 核心修复:在 vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.pyregister_kv_caches 方法中,将 self._layer_specs[layer_name] 改为 self._layer_specs.get(layer_name),当返回 None 时跳过该层,因为共享 KV 缓存的层没有独立 spec。
  2. 测试配套:在 tests/v1/kv_connector/nixl_integration/test_accuracy.py 中添加 google/gemma-4-E2B-it 的预期准确率(0.485),并为 Gemma-4 模型特殊处理:使用 chat completions 端点和 chat 模板进行 lm_eval 评估,因为该模型对 prompt 格式敏感。
  3. 测试配置:在 tests/v1/kv_connector/nixl_integration/config_sweep_accuracy_test.shsw_attn_configs 中添加 Gemma-4 的测试参数,验证跨层 KV 共享场景。
文件 模块 状态 重要度
vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py 分布式 modified 5.8
tests/v1/kv_connector/nixl_integration/test_accuracy.py 测试 modified 5.48
tests/v1/kv_connector/nixl_integration/config_sweep_accuracy_test.sh 测试 modified 3.7

关键符号

register_kv_caches test_accuracy

关键源码片段

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

核心修复文件,修改了 register_kv_caches 方法以防止缺失 layer_spec 时崩溃

# 在 register_kv_caches 方法中,原有代码直接索引 layer_spec,
# 但 HMA 下共享 KV 缓存的层没有对应的 spec,导致 KeyError。
# 修复后使用 .get() 并跳过无 spec 的层。
for layer_name, cache_or_caches in xfer_buffers.items():
    # 关键变更:改用 .get() 代替直接索引
    # 之前:layer_spec = self._layer_specs[layer_name]
    # 之后:
    layer_spec = self._layer_specs.get(layer_name)
    if layer_spec is None:
        # 跳过没有 KV cache spec 的层,这通常是共享 KV 缓存张量的层
        logger.debug(
            "Skipping layer %s as no KVCache spec is present. "
            "This is likely because the layer is sharing its KV cache",
            layer_name,
        )
        continue
    # 后续逻辑不变 ...
tests/v1/kv_connector/nixl_integration/test_accuracy.py test-coverage

新增 Gemma-4 模型准确性测试,并为 chat 模型调整评估方式

# test_accuracy 函数关键变更:为 Gemma-4 模型使用 chat completions 端点
EXPECTED_VALUES = {
    # ... 其他模型 ...
    "google/gemma-4-E2B-it": 0.485, # 新增 Gemma-4 预期准确率
}def test_accuracy():
    """Run the end to end accuracy test."""
    run_simple_prompt()
​
    if "gemma-4" in MODEL_NAME:
        # Gemma4 对 chat 模板敏感,因此使用 chat completions 端点评估
        model_args = (
            f"model={MODEL_NAME},"
            f"base_url={BASE_URL}/chat/completions,"
            f"num_concurrent={NUM_CONCURRENT},"
            "tokenizer_backend=huggingface"
        )
        results = lm_eval.simple_evaluate(
            model="local-chat-completions",
            model_args=model_args,
            tasks=TASK,
            num_fewshot=5,
            apply_chat_template=True,
        )
    else:
        # 原有评估路径不变
        model_args = (
            f"model={MODEL_NAME},"
            f"base_url={BASE_URL}/completions,"
            f"num_concurrent={NUM_CONCURRENT},tokenized_requests=False"
        )
        results = lm_eval.simple_evaluate(
            model="local-completions",
            model_args=model_args,
            tasks=TASK,
        )
    # 后续断言逻辑不变 ...
tests/v1/kv_connector/nixl_integration/config_sweep_accuracy_test.sh test-coverage

在 sw_attn_configs 中添加 Gemma-4 测试配置,验证跨层 KV 共享场景

# sw_attn_configs 数组新增 Gemma-4 测试配置
sw_attn_configs=(
  # ... 其他配置 ...
  # Gemma4: SW + cross-layer KV sharing
  "GPU_MEMORY_UTILIZATION=0.8 MODEL_NAMES=google/gemma-4-E2B-it VLLM_SERVE_EXTRA_ARGS=--max-model-len,8192"
)

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

修复范围极小(+8/-1 行),仅修改了一层防御性检查。回归风险很低,因为原有逻辑只在没有 layer_spec 时触发,而此前所有层都有 spec。新增的 Gemma-4 测试和配置进一步降低风险。

直接影响:支持 google/gemma-4-E2B-it 等共享 KV 缓存张量模型在 PD + HMA 模式下运行。间接影响:未来类似架构的模型(如某些多模态模型)也能受益。测试覆盖扩展到混合 SSM 模型之外,提升了 PD 测试套件的全面性。

核心路径变更

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论