Prhub

#17389 Fix remote weight info nnode>1 and dp>1

原始 PR 作者 JD-ETH 合并时间 2026-03-31 21:17 文件变更 10 提交数 39 评论 51 代码增减 +434 / -82

执行摘要

重构远程权重加载引擎信息同步机制,解决多节点和 DP>1 场景下的失败问题。

根据PR body描述,问题在于多节点启用时每个节点只知本地调度器信息,远程查询可能失败;DP>1时dp_controller未向上传播scheduler_info。目标是确保所有rank的传输引擎信息可访问,引用PR body:'In multi-node enabled setups, each node only knows about its local schedulers' transfer engine info. Remote instances querying /get_remote_instance_transfer_engine_info?rank=N could fail if rank N is on a different node. In dp>1 case, the dp_controller currently does not propagate the scheduler_info upwards.'

建议技术管理者关注此PR的设计决策,特别是引导服务器模式在分布式信息同步中的借鉴价值;工程师应精读engine_info_bootstrap_server.py的实现和model_runner.py的注册逻辑,注意端口配置管理(如避免冲突)和测试用例以验证多节点/DP场景。

讨论亮点

review中核心讨论包括:设计模式上,ShangmingCai建议采用类似PD模块的注册端点(引用评论:'I think the main goal is to make remote_instance_transfer_engine_info have all the ranks' info. ... you can impl a route entry as we did in the PD module'),最终实现引导服务器方案;性能方面,amysaq2023询问Gloo all-gather操作的时间成本,JD-ETH回应同步开销可忽略(引用:'the TCP store trip time is 0.5 sec ... and the sync is free (<10ms)');端口配置争议,JD-ETH最初提议自动派生端口,但经讨论后决定使用固定默认端口6789并明确冲突错误(引用评论:'Use 15-min TCPStore timeout instead of retry loop');安全性和清理,ShangmingCai提出使用server_args.host避免安全漏洞,并建议添加close方法。结论是采用引导服务器,端口固定,用户需显式设置以避免冲突,部分安全建议被采纳。

实现拆解

实现方案包括:1) 新增EngineInfoBootstrapServer类(python/sglang/srt/entrypoints/engine_info_bootstrap_server.py),作为轻量级HTTP服务器接收每个rank的注册信息,提供PUT /register_transfer_engine_info和GET /get_transfer_engine_info端点;2) 在ModelRunner.initialize中调用_register_to_engine_info_bootstrap方法注册传输引擎信息;3) Engine类在node_rank==0时启动引导服务器,并传递engine_info_bootstrap_server到初始化结果;4) HTTP服务器端点(如/remote_instance_transfer_engine_info)更新为从引导服务器查询,移除旧的解析逻辑;5) 完全移除scheduler.py、tp_worker.py和remote_instance_weight_loader_utils.py中的相关方法;6) 添加命令行参数--engine-info-bootstrap-port和测试用例test_cross_node_scheduler_info_sync.py。

文件 模块 状态 重要度
python/sglang/srt/entrypoints/engine_info_bootstrap_server.py entrypoints added 9.0
python/sglang/srt/entrypoints/engine.py entrypoints modified 8.0
python/sglang/srt/model_executor/model_runner.py model_executor modified 8.0
python/sglang/srt/entrypoints/http_server.py entrypoints modified 7.0
test/manual/test_cross_node_scheduler_info_sync.py test added 6.0

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

关键符号

EngineInfoBootstrapServer.__init__ _register_to_engine_info_bootstrap remote_instance_transfer_engine_info

评论区精华

设计模式选择 设计

ShangmingCai 建议使用类似 PD 模块的注册端点简化架构,避免复杂传播路径。

结论:采纳引导服务器方案,新增 EngineInfoBootstrapServer,完全移除旧管道。 · 已解决

性能疑虑 性能

amysaq2023 询问 Gloo all-gather 操作的时间成本是否影响启动延迟。

结论:JD-ETH 回应同步开销可忽略,启动时间主要由磁盘加载和 RDMA 注册决定。 · 已解决

端口配置管理 设计

争议默认端口设置,JD-ETH 提议自动派生端口,ShangmingCai 倾向于固定默认值。

结论:决定使用固定默认端口 6789,用户需显式设置不同端口以避免冲突,并在启动时检查可用性。 · 已解决

安全性与清理 安全

ShangmingCai 建议使用 server_args.host 避免安全漏洞,并添加 close 方法清理资源。

结论:部分采纳,代码中使用 server_args.host,但 clean up 方法未在 patch 中显示,可能存在未解决疑虑。 · partially resolved

风险与影响

技术风险具体包括:端口冲突风险,engine_info_bootstrap_port默认6789,多实例在同一节点运行时需显式设置不同端口,否则启动失败(在engine.py的启动逻辑中检查is_port_available);回归风险,完全移除旧传播路径(如parse_remote_instance_transfer_engine_info_from_scheduler_infos),可能影响未覆盖的边缘案例或兼容旧客户端;新增服务器增加复杂性,EngineInfoBootstrapServer运行在守护线程中,缺乏显式清理方法可能导致资源泄漏;跨节点网络依赖,HTTP查询失败(如超时或网络问题)可能导致远程权重加载中断。

影响范围:用户层面,多节点和DP>1用户受益于修复的远程权重加载功能,提升分布式推理可靠性;系统层面,简化了信息流(从多层管道到直接注册),但引入了新服务器组件,可能轻微增加启动开销和内存占用;团队层面,工程师需理解新架构,测试用例提供了验证多场景。影响程度中等,主要改进分布式场景的健壮性,不涉及核心推理路径的性能变更。

端口配置冲突 回归风险 新增组件复杂性

关联 Issue

未识别关联 Issue

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

完整报告

执行摘要

  • 一句话:重构远程权重加载引擎信息同步机制,解决多节点和DP>1场景下的失败问题。
  • 推荐动作:建议技术管理者关注此PR的设计决策,特别是引导服务器模式在分布式信息同步中的借鉴价值;工程师应精读engine_info_bootstrap_server.py的实现和model_runner.py的注册逻辑,注意端口配置管理(如避免冲突)和测试用例以验证多节点/DP场景。

功能与动机

根据PR body描述,问题在于多节点启用时每个节点只知本地调度器信息,远程查询可能失败;DP>1时dp_controller未向上传播scheduler_info。目标是确保所有rank的传输引擎信息可访问,引用PR body:'In multi-node enabled setups, each node only knows about its local schedulers' transfer engine info. Remote instances querying /get_remote_instance_transfer_engine_info?rank=N could fail if rank N is on a different node. In dp>1 case, the dp_controller currently does not propagate the scheduler_info upwards.'

实现拆解

实现方案包括:1) 新增EngineInfoBootstrapServer类(python/sglang/srt/entrypoints/engine_info_bootstrap_server.py),作为轻量级HTTP服务器接收每个rank的注册信息,提供PUT /register_transfer_engine_info和GET /get_transfer_engine_info端点;2) 在ModelRunner.initialize中调用_register_to_engine_info_bootstrap方法注册传输引擎信息;3) Engine类在node_rank==0时启动引导服务器,并传递engine_info_bootstrap_server到初始化结果;4) HTTP服务器端点(如/remote_instance_transfer_engine_info)更新为从引导服务器查询,移除旧的解析逻辑;5) 完全移除scheduler.py、tp_worker.py和remote_instance_weight_loader_utils.py中的相关方法;6) 添加命令行参数--engine-info-bootstrap-port和测试用例test_cross_node_scheduler_info_sync.py。

关键文件:

  • python/sglang/srt/entrypoints/engine_info_bootstrap_server.py(模块 entrypoints): 新增引导服务器类,核心实现信息注册和查询,是重构方案的核心组件。
  • python/sglang/srt/entrypoints/engine.py(模块 entrypoints): 集成引导服务器启动逻辑,移除旧信息传播路径,关键启动流程变更。
  • python/sglang/srt/model_executor/model_runner.py(模块 model_executor): 添加_register_to_engine_info_bootstrap方法,实现传输引擎信息注册到引导服务器。
  • python/sglang/srt/entrypoints/http_server.py(模块 entrypoints): 更新HTTP端点以从引导服务器查询,保持向后兼容,影响用户接口。
  • test/manual/test_cross_node_scheduler_info_sync.py(模块 test): 新增测试用例,验证多节点和DP场景的信息同步正确性。

关键符号:EngineInfoBootstrapServer.init, _register_to_engine_info_bootstrap, remote_instance_transfer_engine_info

评论区精华

review中核心讨论包括:设计模式上,ShangmingCai建议采用类似PD模块的注册端点(引用评论:'I think the main goal is to make remote_instance_transfer_engine_info have all the ranks' info. ... you can impl a route entry as we did in the PD module'),最终实现引导服务器方案;性能方面,amysaq2023询问Gloo all-gather操作的时间成本,JD-ETH回应同步开销可忽略(引用:'the TCP store trip time is 0.5 sec ... and the sync is free (<10ms)');端口配置争议,JD-ETH最初提议自动派生端口,但经讨论后决定使用固定默认端口6789并明确冲突错误(引用评论:'Use 15-min TCPStore timeout instead of retry loop');安全性和清理,ShangmingCai提出使用server_args.host避免安全漏洞,并建议添加close方法。结论是采用引导服务器,端口固定,用户需显式设置以避免冲突,部分安全建议被采纳。

  • 设计模式选择 (design): 采纳引导服务器方案,新增EngineInfoBootstrapServer,完全移除旧管道。
  • 性能疑虑 (performance): JD-ETH回应同步开销可忽略,启动时间主要由磁盘加载和RDMA注册决定。
  • 端口配置管理 (design): 决定使用固定默认端口6789,用户需显式设置不同端口以避免冲突,并在启动时检查可用性。
  • 安全性与清理 (security): 部分采纳,代码中使用server_args.host,但clean up方法未在patch中显示,可能存在未解决疑虑。

风险与影响

  • 风险:技术风险具体包括:端口冲突风险,engine_info_bootstrap_port默认6789,多实例在同一节点运行时需显式设置不同端口,否则启动失败(在engine.py的启动逻辑中检查is_port_available);回归风险,完全移除旧传播路径(如parse_remote_instance_transfer_engine_info_from_scheduler_infos),可能影响未覆盖的边缘案例或兼容旧客户端;新增服务器增加复杂性,EngineInfoBootstrapServer运行在守护线程中,缺乏显式清理方法可能导致资源泄漏;跨节点网络依赖,HTTP查询失败(如超时或网络问题)可能导致远程权重加载中断。
  • 影响:影响范围:用户层面,多节点和DP>1用户受益于修复的远程权重加载功能,提升分布式推理可靠性;系统层面,简化了信息流(从多层管道到直接注册),但引入了新服务器组件,可能轻微增加启动开销和内存占用;团队层面,工程师需理解新架构,测试用例提供了验证多场景。影响程度中等,主要改进分布式场景的健壮性,不涉及核心推理路径的性能变更。
  • 风险标记:端口配置冲突, 回归风险, 新增组件复杂性

关联脉络

  • 暂无明显关联 PR

参与讨论