Prhub

#48218 Encoder cache extension hooks

原始 PR 作者 hotTea123 合并时间 2026-07-24 17:52 文件变更 8 提交数 6 评论 29 代码增减 +106 / -15

执行摘要

添加编码器缓存扩展钩子和配置

为了支持 Ascend 等平台的评分式双层编码器缓存(NPU+CPU),避免下游需要复制整个 Scheduler 和 GPUModelRunner 代码,故在关键生命周期点添加扩展钩子和元数据通道,以最小侵入方式提供标准化扩展接口。

推荐阅读,尤其是需要了解在 vLLM 中如何以最小侵入添加平台级扩展点的工程师。设计模式(配置注入 + 保护钩子 + 元数据通道)值得在其他自定义组件中借鉴。

讨论亮点
  • Isotr0py 指出调度器中自定义管理器构造时参数不统一(现有管理器仅接收 cache_size,而插件可能需要 vllm_config),作者通过将实例化逻辑改为调用 get_encoder_cache_manager_obj() 并传入 cache_size 解决。
  • Isotr0py 建议在 _cache_encoder_output 中不应传递整个 SchedulerOutput,而只传必要字段(free_encoder_mm_hashesec_manager_metadata),作者采纳并修改了接口。
  • Isotr0py 提及最好添加抽象基类来标准化编码器缓存管理器实现,项目中虽已定义元数据基类,但管理器类本身未强约束,可作为后续改进。

实现拆解

  1. 配置与抽象层:在 vllm/config/ec_manager_config.py 中新增 EncoderCacheManagerConfig(使用 @config 装饰器),包含 encoder_cache_manager_cls 字段和 get_encoder_cache_manager_obj 方法。同时定义 EncoderCacheManagerMetadata 抽象基类作为调度器-工作器通信的元数据类型。

  2. 集成到 VllmConfig:在 vllm/config/vllm.py 中为 VllmConfig 增加 ec_manager_config: EncoderCacheManagerConfig 字段(默认工厂构造),使全流程可访问。

  3. 调度器改造:在 vllm/v1/core/sched/scheduler.py__init__ 中,从 vllm_config.ec_manager_config 获取自定义管理器类并实例化,替代原有硬编码的 EncoderCacheManager/EncoderDecoderCacheManager 选择逻辑。在 schedule 方法中调用 encoder_cache_manager.get_manager_metadata() 将元数据写入 SchedulerOutput

  4. SchedulerOutput 扩展:在 vllm/v1/core/sched/output.py 中为 SchedulerOutput 新增 ec_manager_metadata: EncoderCacheManagerMetadata | None 字段。

  5. 基础管理器扩展:在 vllm/v1/core/encoder_cache_manager.py 中为 EncoderCacheManager 增加 get_manager_metadata() 方法,默认返回 None,便于子类重写。

  6. GPUModelRunner 钩子:在 vllm/v1/worker/gpu_model_runner.py 中新增四个可被覆盖的保护钩子方法:_on_request_state_removed_process_encoder_cache_scheduler_output_cache_encoder_output_get_encoder_output_from_cache。将现有 _update_states_execute_mm_encoder 中的内联编码器缓存操作改为调用这些钩子。

  7. 测试调整:在 tests/v1/worker/test_gpu_model_runner_mm_gather.py 中添加一行导入,确保基本测试通过。

文件 模块 状态 重要度
vllm/config/ec_manager_config.py 配置 added 7.93
vllm/v1/worker/gpu_model_runner.py 模型执行器 modified 8.07
vllm/v1/core/sched/scheduler.py 调度器 modified 6.27
vllm/v1/core/encoder_cache_manager.py 缓存管理器 modified 5.67
vllm/v1/core/sched/output.py 数据结构 modified 5.11
vllm/config/vllm.py 主配置 modified 4.9
tests/v1/worker/test_gpu_model_runner_mm_gather.py 测试 modified 3.09

关键符号

EncoderCacheManagerConfig.__init__ EncoderCacheManagerConfig.get_encoder_cache_manager_obj EncoderCacheManagerMetadata EncoderCacheManager.get_manager_metadata GPUModelRunner._on_request_state_removed GPUModelRunner._process_encoder_cache_scheduler_output GPUModelRunner._cache_encoder_output GPUModelRunner._get_encoder_output_from_cache

关键源码片段

vllm/config/ec_manager_config.py core-logic

新增核心配置类与抽象元数据基类,是扩展点的入口。

# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM projectfrom abc import ABCfrom vllm.config.utils import config
from vllm.utils.import_utils import resolve_obj_by_qualname
​
​
@config
class EncoderCacheManagerConfig:
    # 可自定义的编码器缓存管理器类的完整限定类名,None 表示使用默认
    encoder_cache_manager_cls: str | None = None
​
    def get_encoder_cache_manager_obj(self):
        """根据该配置返回缓存管理器类对象,None 表示不启用自定义"""
        cls_path = self.encoder_cache_manager_cls
        if cls_path is None:
            return None
        return resolve_obj_by_qualname(cls_path)
​
​
class EncoderCacheManagerMetadata(ABC):
    """
    抽象元数据基类,用于调度器端与工作器端编码器缓存管理器之间的通信。
    具体子类应包含缓存操作所需的信息,如评分、层级等。
    """
    pass

评论区精华

自定义管理器构造函数参数不统一 设计

Isotr0py 指出 vLLM 自带管理器只接受 cache_size,而插件可能需要 vllm_config,希望统一接口。

结论:作者通过调整调度器中实例化逻辑,统一使用 get_encoder_cache_manager_obj 并传入 cache_size,参数兼容性由子类自行处理。 · 已解决

_cache_encoder_output 参数过多 设计

Isotr0py 建议只传必要字段(free_encoder_mm_hashes 和 ec_manager_metadata)而非整个 SchedulerOutput。

结论:作者接受建议,将参数改为单独传递这两个字段。 · 已解决

是否需要抽象基类标准化管理器接口 设计

Isotr0py 建议添加抽象基类确保所有管理器实现一致。

结论:当前已定义元数据基类,但管理器类本身未强制抽象;可作为后续增强。 · unresolved

风险与影响

较低风险。所有新增扩展点默认行为与原逻辑一致,不影响现有功能。潜在风险包括:下游重写钩子时可能破坏状态机;SchedulerOutput 新增字段可能被序列化工具或分布式组件误处理;自定义管理器的性能表现取决于实现实现。建议在 CI 中增加简单的包装测试验证自定义管理器集成。

对用户透明,无 API 或行为变化。对树外平台(如 Ascend)提供了标准化的编码器缓存扩展入口,可显著减少代码复制和维护成本。团队需维护钩子稳定性和文档。影响范围限于 V1 引擎,V0 不受影响。

扩展点稳定性风险 缺少自定义管理器测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论