Prhub

#24344 [Fix] NGRAMWorker.update_weights_from_tensor — delegate to target worker

原始 PR 作者 stargazerZJ 合并时间 2026-05-05 07:23 文件变更 1 提交数 1 评论 3 代码增减 +9 / -0

执行摘要

为 NGRAMWorker 添加 update_weights_from_tensor 委托方法

当 SGLang 以 --speculative-algorithm NGRAM 启动时,任何调用 update_weights_from_tensor 的代码(如 RL 框架的在线权重同步)都会崩溃,错误为 AttributeError: 'NGRAMWorker' object has no attribute 'update_weights_from_tensor'。调度器混入类 scheduler_update_weights_mixin.py 通过 self.draft_worker or self.tp_worker 分发此方法,而 EAGLEWorker 实现了它,但 NGRAMWorker 没有,导致首次调用即失败。关联 Issue #24343 记录了此问题。

该 PR 是一个正确且简洁的修复,值得纳入。虽然变动很小,但修复了一个影响 NGRAM 可用性的关键 bug。开发者可以快速合并。

讨论亮点

审阅者均快速批准了该 PR,无深入技术争议。PR 作者在 body 中详细解释了为什么委托是正确的修复方式,并讨论了是否需要对 n-gram corpus 进行失效处理,但认为 corpus 会自然更新,无需显式重置。

实现拆解

  1. python/sglang/srt/speculative/ngram_worker.pyclear_cache_pool 方法之后、add_external_corpus 方法之前,新增 update_weights_from_tensor 方法。
  2. 该方法仅一行:return self.target_worker.update_weights_from_tensor(recv_req),将调用委托给目标 worker。
  3. 语义分析:NGRAM 没有可学习的权重,其 NgramCorpus 是基于请求 token 流构建的 CPU 查找结构;NGRAMWorker.model_runner 就是 target_worker.model_runner,因此委托是正确且高效的。
文件 模块 状态 重要度
python/sglang/srt/speculative/ngram_worker.py 投机解码 modified 5.9

关键符号

update_weights_from_tensor

关键源码片段

python/sglang/srt/speculative/ngram_worker.py core-logic

新增了 `update_weights_from_tensor` 方法,委托给 `target_worker`,修复了 NGRAM 模式下 RL 框架调用崩溃的 bug。

# python/sglang/srt/speculative/ngram_worker.py
# 新增于 clear_cache_pool 方法之后,add_external_corpus 方法之前def update_weights_from_tensor(self, recv_req):
    # NGRAM 没有自己的可学习权重,其 n-gram 语料库是基于请求 token 流
    # 构建的 CPU 查找结构。model_runner 实际上与 target worker 共享。
    # 调度器混入类通过 `self.draft_worker or self.tp_worker` 分发此方法,
    # 因此没有此方法时调用会抛出 AttributeError。
    return self.target_worker.update_weights_from_tensor(recv_req)

评论区精华

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

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

风险与影响

风险极低。变更仅添加了一行委托方法,不影响 NGRAMWorker 的其他逻辑(clear_cache_pool, add_external_corpus 等)。update_weights_from_tensor 不被热路径调用,因此对推理性能无影响。委托路径与 EAGLEWorker 的实现模式一致,经过了 TpModelWorker 的验证。

修复了 NGRAM 模式下 RL 权重同步的阻塞 bug,使得 --speculative-algorithm NGRAM 可以与在线学习框架(如 slime、OpenRLHF、verl)配合使用。内部评测显示 NGRAM 在 Qwen2.5-32B SFT 上相比非推测解码基线带来了约 3.2 倍的吞吐量提升。

关联 Issue

#24343 [Bug] NGRAMWorker missing update_weights_from_tensor — RL weight sync crashes with AttributeError

完整报告

参与讨论