十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

slime 外部 Rollout 引擎接入指南:跨集群权重同步与训练/推理解耦实践

slime 外部 Rollout 引擎接入指南:跨集群权重同步与训练/推理解耦实践 slime 外部 Rollout 引擎接入指南跨集群权重同步与训练/推理解耦实践【免费下载链接】slimeslime is an LLM post-training framework for RL Scaling.项目地址: https://gitcode.com/GitHub_Trending/slime12/slime在 LLM 后训练RL 训练中当推理服务由训练作业之外的系统负责部署与生命周期管理时slime 需要一种只接入、不接管的模式连接已启动的 SGLang 引擎、注册路由器并在需要时同步更新后的 Actor 权重。本文以 external-rollout-engines.md 为骨架结合 slime 源码中的发现机制、权重同步参数与校验逻辑系统讲解外部 Rollout 引擎的使用场景、配置方式、磁盘全量/增量权重更新方案以及部署时的注意事项。读完本文你将能够独立判断何时使用--rollout-external-engine-addrs、何时继续使用--sglang-config并为跨集群、跨数据中心的训练/推理拆分场景选择正确的权重同步路径。什么是外部 Rollout 引擎外部 Rollout 引擎external rollout engine是指不是由 slime 训练作业启动的 SGLang 引擎。在这种部署形态下另一个系统负责部署引擎并拥有其生命周期slime 在训练期间只负责连接这些引擎slime 为这些引擎注册路由器router需要时slime 将更新后的 Actor 权重同步到引擎侧。这一路径天然适合推理服务归属于训练作业之外的部署形态例如独立的推理集群、独立的 Ray 集群、预先手动预热的 SGLang 引擎或由其他编排系统托管的 rollout 服务。何时使用外部引擎决策表原文档给出的选择矩阵是判断接入方式的首要依据先明确你的目标与对应入口目标推荐入口引擎已由外部启动slime 只需连接做 rollout--rollout-external-engine-addrsslime 仍需自己启动引擎但需要 PD 分离、多模型服务、异构服务器组或按组覆盖配置SGLang Config训练器与外部引擎可以组成 NCCL 组默认--update-weight-mode full --update-weight-transport nccl训练器与外部引擎无法组成 NCCL 组但能看到同一文件系统路径--update-weight-mode full --update-weight-transport disk大模型跨集群或跨数据中心同步时全量 checkpoint 太重--update-weight-mode delta --update-weight-transport diskrollout 服务使用独立的 SGLang 环境甚至不同的 GPU 型号/厂商外部引擎 disk 传输需要冻结的参考模型、奖励模型或工具侧模型优先在 SGLang Config 中设置update_weights: false需要特别记住一条硬约束Delta 模式只支持磁盘传输。需要在 NCCL 上同步权重时请使用全量模式。快速上手连接已启动的外部引擎首先独立启动 SGLang 服务器这部分完全由外部系统负责slime 不参与启动python -m sglang.launch_server --model-path /path/to/model --port 10090 ... python -m sglang.launch_server --model-path /path/to/model --port 10091 ...然后将这些地址传给训练作业python train.py \ --rollout-external-engine-addrs host1:10090 host2:10091 \ ...--rollout-external-engine-addrs参数在 slime/utils/arguments.py 中定义为可接受多个值的参数nargs因此可以一次性传入多个host:port。slime 会依次查询每个引擎的/server_info或/get_server_info端点推断出 GPU 数量、TP/PP 信息以及 worker 类型regular、prefill或decode。如果未提供--sglang-router-ip/--sglang-router-portslime 会自己启动一个路由器并将这些外部引擎注册到其中。地址归一化规则在 slime/backends/sglang_utils/external.py 中normalize_external_engine_addr会统一处理地址格式支持host:port与http://host:port两种写法统一归一化为 HTTP base URL若地址缺少协议前缀自动补上http://若地址不含端口或 scheme 不是http会抛出ValueErrorIPv6 地址必须加方括号。引擎信息发现机制discover_external_enginesexternal.py遍历所有地址逐个请求/server_info失败时回退到/get_server_info见get_server_info并从返回的 JSON 中解析出pp_size/pipeline_parallel_size流水线并行度tp_size/tensor_parallel_size张量并行度num_gpus/num_gpus_per_engine引擎占用的 GPU 数缺省时按tp_size * pp_size推算ep_size/expert_parallel_size专家并行度moe_dp_size/moe_data_parallel_sizeMoE 数据并行度disaggregation_mode用于判断 worker 类型prefill/decode/nulldisaggregation_bootstrap_portPD 分离场景下 prefill 引擎的引导端口encoder_only编码器专用引擎标记。_infer_worker_typeexternal.py根据这些字段决定 worker 类型encoder_only为encoderdisaggregation_mode为prefill/decode时取对应值其余为regular。这些信息随后被封装为ExternalEngineInfoexternal.py其is_pd_worker属性可判断是否为 PD 分离 workerparallel_config属性则汇总出完整的 TP/PP/EP/MoE-DP 配置用于后续训练侧拓扑推导。参数填充与拓扑推导apply_external_engine_info_to_argsexternal.py将发现结果写回参数对象args.rollout_external_engine_infos引擎信息字典列表args.rollout_num_engines外部引擎总数args.rollout_num_gpus所有引擎 GPU 数量之和。test_external_sglang_engines.py 中test_apply_external_engine_info_handles_pd展示了 PD 分离场景的完整链路传入prefill:10090与decode:10091两个地址后rollout_num_gpus会被正确推导为2 4 6且 worker 类型分别为prefill与decodeprefill 引擎的disaggregation_bootstrap_port也被保留。同文件中test_discover_external_engines_reads_server_info则验证了tp_size4, pp_size2的引擎会被推导为 8 块 GPU。服务组与路由器接线start_external_rollout_serversexternal.py完成最终接线调用start_router启动或复用路由器并传入has_pd_disaggregation标记为每个外部引擎创建一个SGLangEngineRay Actornum_cpus0.2、num_gpus0不占用训练作业的 GPU 配额按引擎 GPU 数累积engine_gpu_counts与engine_gpu_offsets用于后续的全局 GPU 编号编排将(router_ip, router_port)写入args.sglang_router_ip/args.sglang_router_port并以default为模型名注册sglang_model_routers返回以default为键的ExternalRolloutServer其engine_parallel_configs保留了每个引擎的完整并行配置。值得注意的是ExternalRolloutServer.recover()只记录一条警告日志——外部引擎不参与 slime 的容错恢复因为它们的生命周期属于外部部署系统详见下文部署清单。与--sglang-config的关系互斥的边界划分--rollout-external-engine-addrs与--sglang-config是互斥的因为它们拥有不同的所有权边界--sglang-configslime 拥有引擎生命周期。YAML 描述拓扑slime 负责启动服务器组、路由器、多模型服务并做选择性权重更新。--rollout-external-engine-addrs外部系统拥有引擎生命周期。slime 只发现已运行的引擎、将其挂接到路由器上并把它们当作默认的 rollout 模型。如果核心需求是多模型服务、冻结的参考/奖励模型、PD 分离或异构组配置优先选择--sglang-config只有当引擎已经部署在训练作业之外时才使用外部引擎模式。这一互斥关系在 slime/backends/sglang_utils/arguments.py 的参数校验中也有体现当设置了rollout_external外部引擎模式时若同时配置了prefill_num_servers或sglang_config会触发冲突校验。环境与硬件解耦外部引擎的核心收益外部引擎模式最重要的隐含能力是环境解耦SGLang 服务侧不需要使用 slime 训练作业的 Python 环境、Megatron 环境或 Ray 运行时。它可以在独立的 SGLang 容器、独立集群或其他编排系统中运行。slime 只依赖三样东西HTTP 端点本身/server_info发现接口所选权重同步传输方式所需的通信路径。磁盘传输允许异构 GPU 硬件使用磁盘传输时权重通过共享文件系统上的 HF checkpoint 或 safetensors delta 流动SGLang 通过update_weights_from_disk热加载。这条路径不要求训练 GPU 与 rollout GPU 是同一型号甚至不要求同一厂商——只要 SGLang 支持目标硬件后端、模型格式与精度配置即可。例如训练跑在一个 GPU 集群上rollout 服务跑在另一个 GPU 型号或厂商的集群上。NCCL 传输保持传统约束使用 NCCL 传输时NCCL 通信与硬件兼容性的常规要求仍然适用。对于跨厂商、网络不互通或跨数据中心的部署优先选择--update-weight-transport disk。权重更新路径总览权重同步的两种策略由 slime/utils/arguments.py 中的两个参数共同决定参数取值含义--update-weight-modefull默认/deltafull每次同步广播所有参数delta对上一次同步的 CPU 快照做 diff只传输变化字节仅磁盘传输--update-weight-transportnccl默认/disk权重同步的载体full模式下 NCCL 广播分块、磁盘写入完整 HF checkpoint 后由引擎重载delta模式仅支持磁盘参数校验逻辑arguments.py进一步约束了组合方式--update-weight-transportdisk必须配合--update-weight-disk-dir指向训练器与 rollout 引擎共享的文件系统否则报错--update-weight-modedelta必须搭配--update-weight-transportdisk--update-weight-modedelta与--colocate互斥——colocate 场景通过 CUDA IPC 句柄跨进程传输权重delta 的记账快照 diff 编码是纯开销--update-weight-modedelta必须配置--update-weight-local-checkpoint-dir详见下文。更新方式一从磁盘全量更新Update From Disk全量 checkpoint 磁盘更新是外部部署最简单、最稳妥的回退路径--update-weight-mode full --update-weight-transport disk --update-weight-disk-dir /shared/fs/full-updates工作流程每次权重同步时训练器在--update-weight-disk-dir下写入一个完整的 HF checkpoint 目录例如weight_v000123/然后通过 HTTP 调用每个 SGLang 引擎的update_weights_from_disk端点让引擎在不重启进程的情况下重新加载 checkpoint。该流程的实现位于 slime/backends/megatron_utils/update_weight/update_weight_from_disk.py 中的UpdateWeightFromDisk类——从源码看它通过save_hf_model_to_path落盘 checkpoint并为每次同步维护weight_version递增版本号。该实现还支持--custom-update-weight-post-write-path钩子arguments.py对对象存储等非 POSIX 文件系统而言跨主机读后写一致性无法自动保证训练器各 rank 写完文件后需要显式发布例如上传到后端对象存储引擎才能看到写入。本地缓存从每 rank 一次读到每主机一次读增加--update-weight-local-checkpoint-dir后每个引擎会先把已发布的 checkpoint 拉取到其覆盖的每一台主机的本地磁盘例如 NVMe再从本地加载拉取动作通过/pull_weights端点完成该端点由 slime 的 sglang patch 提供收益是每个主机只做一次共享文件系统读取而不是每个 rank 读一次当共享目录由对象存储支撑、或引擎横跨多个节点时这一差异非常关键。--update-weight-local-checkpoint-dir的完整语义在 arguments.py 中有详细说明对 delta 模式必需对全量磁盘同步可选配置后引擎改为先拉取到本地再加载而不是直接读共享目录。调试辅助--update-weight-disk-keep-files该参数arguments.py会跳过全量 checkpoint 目录的清理在引擎确认加载完成之后仍保留这些目录便于排查加载异常或做离线校验。该模式的定位控制面简单——不需要训练器与引擎之间的 NCCL 组双方只需看到同一个共享文件系统路径。代价是体积每次同步都写入完整的 Actor 权重对大型模型或高频更新而言开销较大。更新方式二Delta 增量更新Update With DeltaDelta 更新面向大型模型跨集群、跨数据中心的训练/推理拆分场景。与每次同步都写全量 checkpoint 不同训练器维护上一轮同步的CPU 快照对每个参数与快照做 diff只发布变化字节每个引擎的/pull_weights端点slime 的 sglang patch 提供在其覆盖的每台主机上把 delta 应用进主机本地 checkpoint随后引擎通过原生的update_weights_from_disk端点重载。slime 只调用引擎的 HTTP 端点因此多节点外部引擎与 slime 自启动引擎在权重同步上的行为完全一致。--update-weight-mode delta --update-weight-transport disk --update-weight-disk-dir /shared/fs/delta-updates --update-weight-local-checkpoint-dir /local/nvme/rollout-ckptdelta 模式的实现位于 slime/backends/megatron_utils/update_weight/update_weight_from_disk_delta.py其机制、编码、完整性校验与共享文件系统可见性钩子详见 Delta Weight Sync。两个可选的底层调优参数在 arguments.py 中delta 模式还暴露了两个底层参数引擎会从每个版本的 index 元数据中读取选择--update-weight-delta-encodingxor默认 /overwritexor新值 ^ 旧值线缆体积最小、速度最快但它是自逆操作必须基于正确基线恰好应用一次应用两次会还原回去overwrite只写变化位置 新的绝对值体积更大但幂等可任意次数重放。两者都是字节级、与 dtype 无关。--update-weight-delta-checksumxxh3-128默认 /blake3/adler32每个张量的完整性校验和由于应用过程受解压 XOR 主导这不是速度选择而是摘要属性选择xxh3-128最快的非加密摘要意外损坏碰撞概率可忽略blake3加密摘要适用于不可信存储adler3232 位用于与期望该格式的系统互通。部署检查清单外部引擎部署是否就绪逐项核对以下要点源自原文档并补充源码验证网络可达外部引擎的 HTTP 地址必须能从训练作业所在节点访问get_server_info默认超时 30 秒见 external.py。环境独立外部引擎可以使用独立的 SGLang 环境不需要 slime 或 Megatron 训练环境。硬件异构可行磁盘传输支持训练与 rollout 使用不同 GPU 型号或厂商前提是 SGLang 支持目标硬件与模型格式。共享路径是硬前提磁盘传输要求训练器与 SGLang 引擎看到同一个--update-weight-disk-dir路径只对训练器可见的路径是不够的参数校验会直接报错arguments.py。容错边界外部引擎不会被 slime 的故障恢复机制接管ExternalRolloutServer.recover()仅记录警告并跳过见 external.py其生命周期属于外部部署系统。参数互斥--sglang-config与--rollout-external-engine-addrs互斥不可同时使用。delta 与 colocate 互斥delta 模式不支持--colocate因为 colocate 同步走 CUDA IPC 句柄delta 编码并不能减少实际传输量校验逻辑见 arguments.py。相关背景训练/推理拆分下的权重同步趋势值得留意的是外部引擎、磁盘全量更新与 delta 磁盘传输所解决的问题也是业界在大规模 RL 推理基础设施中普遍面临的课题一旦训练与推理解耦权重同步就必须跨进程、跨集群乃至跨数据中心工作同时不能让全量模型传输主导训练循环。slime 提供的这条外部引擎 disk 传输路径正是对这一基础设施问题的工程化回答训练侧只依赖 HTTP 端点与共享文件系统权重以全量 checkpoint 或增量 delta 两种粒度流动配合/pull_weights本地缓存与自定义发布钩子适配从单集群到对象存储支撑的跨数据中心场景。总结外部 Rollout 引擎模式是 slime 在训练/推理拆分架构下的关键连接能力通过--rollout-external-engine-addrs只接入不接管通过磁盘传输实现环境与硬件解耦通过全量/增量两种权重更新模式在简单可靠与跨集群高效之间取得平衡。选择路径时可遵循三条主线引擎生命周期归属决定用--sglang-config还是外部引擎NCCL 组是否可建立决定传输方式模型规模与同步频率决定用全量还是 delta。结合本文的源码分析与部署清单你可以为独立推理集群、跨厂商 GPU 或跨数据中心等真实部署场景快速落地一套可运行的权重同步方案。【免费下载链接】slimeslime is an LLM post-training framework for RL Scaling.项目地址: https://gitcode.com/GitHub_Trending/slime12/slime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表