Prhub

#42945 [Bugfix][KV Offload] count appended GPU blocks in store group_sizes

原始 PR 作者 kfirtoledo 合并时间 2026-05-18 19:36 文件变更 1 提交数 2 评论 0 代码增减 +1 / -1

执行摘要

修复 KV Offload 计数 bug,1 行代码变动

修复 when a block straddles the sliding-window edge, the count of appended GPU blocks in group_sizes exceeded the actual number in src_block_ids, triggering a sum(group_sizes) == len(block_ids) assertion failure in GPULoadStoreSpec.

建议快速合并。该 PR 虽小但精准,修复了一个真实触发断言的 bug,值得关注其背后的窗口跨越边界场景设计约束。

讨论亮点

gemini-code-assist[bot] 的自动审查确认 bug 根因并说明修复正确,但未发现人工讨论。orozery 快速批准。

实现拆解

  1. _build_store_jobs 的 for 循环复制块时,将 num_group_blocks 从一次性加 block_size_factor(第713行 base)改为每次成功追加一个子块后自增 1(第722行 head)。

  2. 同时移除旧的 num_group_blocks += block_size_factor 语句(第713行 base)。

  3. 该变更仅影响 vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py 中的 _build_store_jobs 方法,未涉及测试、配置或部署。

文件 模块 状态 重要度
vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py KV 卸载调度器 modified 5.62

关键源码片段

vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py core-logic

修复了 `_build_store_jobs` 中 `num_group_blocks` 计数逻辑,确保与 `src_block_ids` 长度一致。

def _build_store_jobs(self):
    # ... 前面的逻辑不变 ...
    for idx, offload_key in ...:
        if offload_key not in keys_to_store:
            continue
        offloaded_block_idx = start_block_idx + idx
        gpu_block_idx = offloaded_block_idx * block_size_factor
        # 修复前:num_group_blocks += block_size_factor // 即使有块被跳过也全量加
        for i in range(block_size_factor):
            block_id = block_ids[gpu_block_idx + i]
            if block_id == 0:
                # 滑动窗口外,跳过,不计数
                assert start_gpu_block_idx is None
                continue
            elif start_gpu_block_idx is None:
                start_gpu_block_idx = gpu_block_idx + i
            src_block_ids.append(block_id)
            num_group_blocks += 1 # 修复后:每追加一个块加一次,保证与实际计数一致
            if is_sliding_window:
                sliding_window_block_ids.append(block_id)
            else:
                non_sliding_window_block_ids.append(block_id)
    group_sizes.append(num_group_blocks)
    # ... 后续不变 ...

评论区精华

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

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

风险与影响

风险极低:只有 1 行删除 + 1 行添加,核心逻辑明确是计数方式修正,回退也简单。影响范围仅限于 _build_store_jobsgroup_sizes 的构造,不会影响其他路径。

修复了 KV Offload 在 hybrid-attention + sliding window 场景下的断言崩溃,使该特性可正常使用。影响仅作用于 KV 卸载调度器,不涉及用户 API、模型推理结果或性能。

无测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论