Prhub

#52703 [Rust Frontend][RL] add routed expert prompt offset

原始 PR 作者 biswapanda 合并时间 2026-08-19 04:04 文件变更 4 提交数 3 评论 5 代码增减 +15 / -0

执行摘要

Rust 协议新增 routed_experts_prompt_start 字段

PR body 说明:此变更让 Rust 能把 routed_experts_prompt_start 发送到 Python EngineCore,从而告知 Python 已有多少 prompt 的 routing 信息被消费,并决定 routing 数据 capture 的起始位置。该字段镜像 Python 侧 SamplingParams.routed_experts_prompt_start,默认值为 0,当前只为补齐协议通道。

值得快速浏览,适合作为 Rust/Python 协议字段同步的参考样例。关注点在于:lower.rs 目前只发送默认值,后续 PR 是否会真正把用户参数透传进来;以及 python_compat.py 的 fixture 模式如何帮助提前发现两侧协议漂移。

讨论亮点

该 PR 的 review 讨论极少:claude[bot] 提示此 PR 来自 fork,自动审查被禁用,需要维护者手动触发;njhill 直接批准并回复 Thanks @biswapanda。没有出现技术争议或设计取舍讨论,变更本身简单直接。

实现拆解

实现分三步完成:

  1. 协议层扩展:在 rust/src/engine-core-client/src/protocol/sampling.rsEngineCoreSamplingParams 结构体中新增 routed_experts_prompt_start: u32 字段,并补充文档注释说明其语义;同时在 for_test() 构造函数中初始化为 0,保证既有测试路径不遗漏新字段。

  2. 前端参数映射:在 rust/src/text/src/lower.rslower_sampling_params 函数中构造 EngineCoreSamplingParams 时固定填入 routed_experts_prompt_start: 0。由于 Rust 前端目前尚未暴露该参数的用户入口,因此以默认值发送,确保协议字段存在并保持与 Python 行为一致;同步更新多处 expect_test 快照,防止字段丢失或默认值被意外改动。

  3. 双向兼容测试:在 rust/src/engine-core-client/src/tests/client.rssample_request_with_id 中设置非零值 routed_experts_prompt_start: 1,验证 Rust 侧编码能携带非默认值;在 python_compat.py 的 Python 镜像 struct 中同步新增字段并设置非零值,确保 Rust 与 Python 的 msgpack 编码 fixture 完全一致,覆盖默认值(0)与非零值(1)两种场景。

文件 模块 状态 重要度
rust/src/engine-core-client/src/protocol/sampling.rs 采样协议 modified 5.28
rust/src/text/src/lower.rs 参数映射 modified 5.23
rust/src/engine-core-client/src/tests/client.rs 协议测试 modified 4.03
rust/src/engine-core-client/src/tests/python_compat.py 兼容测试 modified 4.03

关键符号

EngineCoreSamplingParams::for_test lower_sampling_params sample_request_with_id python_msgpack_fixtures_match_rust_encoding

关键源码片段

rust/src/engine-core-client/src/protocol/sampling.rs core-logic

协议定义主文件,新增 `routed_experts_prompt_start` 字段并初始化默认值,是整个变更的核心入口。

// EngineCoreSamplingParams 是 Rust 前端发送给 Python EngineCore 的采样参数集合。
// 本次新增 `routed_experts_prompt_start` 字段,用于告知引擎端 prompt 中已有多少
// routing 信息被消费,从而决定 routed-expert 数据 capture 的起始位置。
pub struct EngineCoreSamplingParams {
    // ... 既有字段(temperature、top_p、stop_token_ids 等)省略 ...    /// Number of prompt tokens to skip from returned routed-expert data.
    /// A value of zero returns routing data for the entire prompt.
    pub routed_experts_prompt_start: u32,
}impl EngineCoreSamplingParams {
    /// 仅用于测试的默认构造:新字段默认 0,表示返回整个 prompt 的 routing 数据。
    pub fn for_test() -> Self {
        Self {
            // ... 其他字段填充默认值 ...
            // 协议要求该字段始终存在,默认 0 与 Python 侧行为一致。
            routed_experts_prompt_start: 0,
        }
    }
}
rust/src/text/src/lower.rs core-logic

前端参数降级映射所在文件,`lower_sampling_params` 构造 EngineCoreSamplingParams 时固定填充 0,并同步更新大量 expect 快照。

// `lower_sampling_params` 负责将高层的 SamplingParams 转换为 EngineCore 协议参数。
// 当前 Rust 前端尚未暴露 `routed_experts_prompt_start` 的用户入口,
// 因此这里固定发送 0(等价于“对整个 prompt 返回 routing 数据”),
// 先让协议字段对齐 Python 的 `SamplingParams.routed_experts_prompt_start`。
let params = EngineCoreSamplingParams {
    // ... 其他字段保持不变 ...
    logprob_token_ids,
    skip_reading_prefix_cache,
    extra_args: vllm_xargs,
    // TODO: 后续 PR 应从用户请求中解析真实偏移量并透传,
    // 以支持 RL 场景下跳过已消费的 routing 信息。
    routed_experts_prompt_start: 0,
};// 同步更新的 expect_test 快照会包含 `routed_experts_prompt_start: 0`,
// 用于防止字段丢失或默认值被意外改动。
validate_resolved_sampling_params(&params)?;
validate_vocab_range(&params, &sampling_limits)?;
Ok(params)

评论区精华

fork PR 自动审查被禁用 other

claude[bot] 指出该 PR 来自 fork,自动审查关闭,需要维护者手动触发 `@claude review`。

结论:没有进行自动代码审查,njhill 手动批准并致谢。 · 已解决

风险与影响

主要风险集中在三处:

  1. 协议字段为必填项routed_experts_prompt_start 是非 Optionu32 字段,Rust 侧所有构造 EngineCoreSamplingParams 的代码都必须显式提供,编译期可强制补全,但若其他未更新的分支仍使用旧构造方式会导致编译失败——本 PR 已通过 for_test()lower_sampling_params 覆盖主要路径。

  2. 前端未接入真实参数lower.rs 中硬编码 0,意味着 Rust 前端用户尚无法真正指定偏移量,RL 场景下 routed-expert capture 起点仍固定为 0,功能并不完整,后续需要把用户请求中的对应字段解析并透传。

  3. 缺少端到端行为验证:测试只验证了 msgpack 编码一致性和默认值回填,未验证 Python EngineCore 实际消费该字段后是否按预期裁剪 routed-expert 数据,存在协议通了但语义未生效的隐患。

影响面有限但具有前瞻性:

  • 对 Rust 前端:协议字段补齐,后续可在 lower_sampling_params 中接入真实用户参数,为 RL 请求提供 routed-expert 数据捕获起点控制。
  • 对 EngineCore 协议:新增字段会使 Rust、Python 两侧的采样参数结构必须保持同步,未来任何新增参数都需要遵循同样的“协议字段 + 默认值 + 兼容 fixture”模式。
  • 对用户:由于默认值 0 与原有行为完全一致,当前版本无任何用户可见行为变化,属于纯协议对齐。
协议新增必填字段 前端暂未接入真实参数 缺少端到端行为验证

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论