Prhub

#25750 fix(dsv4): make pool configurator PP-aware

原始 PR 作者 whybeyoung 合并时间 2026-05-20 10:58 文件变更 1 提交数 1 评论 2 代码增减 +8 / -1

执行摘要

修复 DSV4 PP 下内存池配置 over-counting

DSV4 模型在 Pipeline Parallelism 下,每个 PP rank 的 DSV4PoolConfigurator 使用全局的 compress_ratios 计算内存池大小,导致 bytes_per_full_token 被重复计算(乘了 pp_size),内存分配严重 over-count,可能引发 OOM 或性能下降。

值得精读,可作为 Pipeline Parallelism 下按层分配资源的典型修复案例。改动虽小,但体现了对分布式系统中 rank 局部性理解的重要性,以及与 TokenToKVPool 保持一致的契约意识。

讨论亮点

PR 没有显著的讨论,仅由作者发起并说明需要等待 PR #25729 合并。两位 reviewer(yhyang201 和 ShangmingCai)直接 approve。

实现拆解

  1. DSV4PoolConfigurator.__init__python/sglang/srt/model_executor/pool_configurator.py,第 322-329 行)中,将原来的 self.compression_ratios = cfg.compress_ratios 改为 self.compression_ratios = cfg.compress_ratios[mr.start_layer : mr.end_layer],只截取当前 PP rank 负责的层切片。
  2. mr.pp_size > 1 时,增加一条日志输出,记录当前 rank 编号、层范围以及局部层数与全局层数的对比,便于调试和监控。
  3. 后续依赖该切片进行的算层数(num_layers_total/num_layers_ca4/num_layers_ca128)以及推测解码的放大因子计算自动修正,无需额外改动。
文件 模块 状态 重要度
python/sglang/srt/model_executor/pool_configurator.py 池配置器 modified 6.38

关键符号

DSV4PoolConfigurator.__init__

关键源码片段

python/sglang/srt/model_executor/pool_configurator.py data-contract

唯一变更文件,在 DSV4PoolConfigurator 初始化中截取 compress_ratios 为 PP rank 局部切片,修复 over-counting。

# python/sglang/srt/model_executor/pool_configurator.py, DSV4PoolConfigurator.__init__class DSV4PoolConfigurator(MemoryPoolConfigurator):
    """Configurator for DSV4 compressed-attention models."""
​
    def __init__(self, mr: ModelRunner):
        cfg = mr.model_config
        self.qk_nope_head_dim = cfg.qk_nope_head_dim
        self.qk_rope_head_dim = cfg.qk_rope_head_dim
        self.indexer_head_dim = cfg.index_head_dim
        # PP-local slice; matches DeepSeekV4TokenToKVPool's stage_ratios.
        self.compression_ratios = cfg.compress_ratios[mr.start_layer : mr.end_layer]
        if mr.pp_size > 1:
            logger.info(
                f"DSV4 pool PP slice: rank={mr.pp_group.rank_in_group} "
                f"layers=[{mr.start_layer},{mr.end_layer}) "
                f"local={len(self.compression_ratios)}/{len(cfg.compress_ratios)}"
            )
        self.swa_page_size = cfg.window_size
        self.swa_ratio = mr.server_args.swa_full_tokens_ratio
        self.is_speculative = mr.server_args.speculative_algorithm is not None
        # ... 后续逻辑依赖 self.compression_ratios 自动修正

评论区精华

PR 依赖关系 other

作者在 PR body 中注明需要等待 PR #25729 合并后再合入本 PR。

结论:PR #25729(修复 DSV4 大 PP 下 forward metadata 竞态)已合并,本 PR 可安全合入。 · 已解决

风险与影响

风险较低。变更仅对 PP 场景生效,且与 DeepSeekV4TokenToKVPool 的 stage_ratios 逻辑对齐;非 PP 场景下 mr.start_layer=0mr.end_layer=len(cfg.compress_ratios),行为完全不变。但也意味着非 PP 场景未经充分测试。

影响范围:DSV4 模型启用 Pipeline Parallelism(PP>1)后的内存池配置。修复了对 bytes_per_full_token 的 over-counting,理论上会显著降低每个 PP rank 分配的内存池大小,避免 OOM。对非 PP 用户无影响。

核心路径变更 缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论