Prhub

#2185 Support routed_experts_start_len

原始 PR 作者 zhuzilin 合并时间 2026-07-07 16:14 文件变更 2 提交数 1 评论 0 代码增减 +30 / -4

执行摘要

支持 routed_experts_start_len 处理部分专家路由

为了支持分块解码场景(如 speculative decoding 或分步 rollout),引擎可能分多次发送 routed experts 元数据,需要根据 routed_experts_start_len 将新接收的 experts 信息拼接到已有数据后部。

此 PR 改动虽小,但涉及对 routed experts 数据拼接逻辑的扩展,对于理解分块解码场景下的数据流有帮助。建议阅读 slime/utils/types.py 中的新增拼接逻辑;actor.py 中的单行改动可视为对 routing replay 的完善。

实现拆解

  1. 数据引入与校验:在 slime/utils/types.py_apply_meta_info 方法中,从 meta_info 读取 routed_experts_start_len(默认为 0),并校验其为非负整数。
  2. 行数计算调整:将 expected_rows 的计算由 len(self.tokens) - 1 改为 max(0, len(self.tokens) - 1 - routed_experts_start_len),表明新接收的 routed experts 只对应从 routed_experts_start_len 开始的后缀 tokens。
  3. 数据拼接逻辑:当 routed_experts_start_len == 0 时直接覆盖 self.rollout_routed_experts;否则从已有的 self.rollout_routed_experts 中取前 routed_experts_start_len 行,与新数据拼接,并补充类型检查与异常处理。
  4. 条件放宽:在 slime/backends/megatron_utils/actor.py 中,can_reuse_log_probs_in_loss 条件中原本为 not self.args.use_routing_replay,现改为 not self.args.use_routing_replay or self.args.use_rollout_routing_replay,允许在启用 rollout routing replay 时复用 log probs。
文件 模块 状态 重要度
slime/utils/types.py 数据模型 modified 7.04
slime/backends/megatron_utils/actor.py Actor modified 4.32

关键符号

_apply_meta_info train_actor

关键源码片段

slime/utils/types.py core-logic

核心数据模型变更,添加 routed_experts_start_len 解析与拼接逻辑。

# slime/utils/types.py 中 _apply_meta_info 方法片段
routed_experts = decode_int32_meta_array(meta_info, "routed_experts")
if routed_experts is not None:
    if args is None:
        raise ValueError("args is required to decode routed experts metadata.")
    # 新增:从 meta_info 中读取 routed_experts_start_len,默认为 0
    routed_experts_start_len = int(meta_info.get("routed_experts_start_len", 0) or 0)
    if routed_experts_start_len < 0:
        raise ValueError(
            f"SGLang routed_experts_start_len must be non-negative, got {routed_experts_start_len}."
        )
    # 计算新数据应覆盖的 token 行数(排除 start_len 之前的旧行)
    expected_rows = max(0, len(self.tokens) - 1 - routed_experts_start_len)
    expected_numel = expected_rows * args.num_layers * args.moe_router_topk
    if routed_experts.numel() != expected_numel:
        raise ValueError(
            "SGLang routed_experts element count does not match sample tokens: "
            f"got={routed_experts.numel()}, expected={expected_numel} "
            f"(tokens={len(self.tokens)}, routed_experts_start_len={routed_experts_start_len}, "
            f"num_layers={args.num_layers}, moe_router_topk={args.moe_router_topk})."
        )
    # 先 reshape
    routed_experts = routed_experts.reshape(
        expected_rows, args.num_layers, args.moe_router_topk,
    )
    if routed_experts_start_len == 0:
        # 无偏移时直接覆盖
        self.rollout_routed_experts = routed_experts
    else:
        # 有偏移时:取已有数据的前 start_len 行,与新的 routed_experts 拼接
        existing = self.rollout_routed_experts
        if existing is None:
            raise ValueError(
                "Cannot append partial routed experts without existing routed experts "
                f"(routed_experts_start_len={routed_experts_start_len})."
            )
        if not torch.is_tensor(existing):
            existing = torch.as_tensor(existing, dtype=routed_experts.dtype)
        if existing.shape[0] < routed_experts_start_len:
            raise ValueError(
                "Existing routed experts shorter than routed_experts_start_len: "
                f"existing_rows={existing.shape[0]}, routed_experts_start_len={routed_experts_start_len}."
            )
        self.rollout_routed_experts = torch.cat(
            [existing[:routed_experts_start_len], routed_experts],
            dim=0,
        )

评论区精华

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

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

风险与影响

  1. 数据一致性:如果 routed_experts_start_len 与上游引擎发送的 experts 行数不匹配(如 existing.shape[0] < routed_experts_start_len),会触发 ValueError,属于防御性设计,但可能导致训练中断。
  2. 性能影响:当 routed_experts_start_len > 0 时,每次调用 _apply_meta_info 都会执行 torch.cat,若频繁小批量调用可能增加内存分配开销。
  3. 无测试配套:本次改动未包含测试文件,可能遗漏了边界条件(如 routed_experts_start_len 恰好等于现有行数、existing 为空等)的验证。

影响范围:仅影响使用 routed experts 的 MoE 模型在分块解码场景下的数据拼接行为,正常解码(routed_experts_start_len=0)无变化。can_reuse_log_probs_in_loss 的放宽可提升部分场景的性能。
影响程度:中等。核心数据路径变更(Sample._apply_meta_info)可能影响所有 rollout 样本处理,但非默认路径。

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

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论