OpenClaw-RL 源码阅读笔记 --- (4)--- 架构
是一个整体所以有些概念的解读/学习会在不同的文章中出现还请大家谅解。OpenClaw-RL 是一个用于在线强化学习Online RL的框架专门针对智能体工具使用场景。它通过从环境反馈中提取过程奖励信号来训练语言模型支持三种主要模式openclaw-rl基于二元奖励的强化学习Binary RL / GRPOopenclaw-opd基于后见之明提示的在线策略蒸馏On-Policy Distillation, OPDopenclaw-combine联合方法在同一 PPO 更新中同时利用 RL reward 和 OPD teacher signal0x01 架构OpenClaw 的 RL 训练 一套统一的 PPO 框架 三种不同的 advantage 注入方式┌────────────┬──────────────────────────────┬─────────────────────────────────────┐ │ 方法 │ Advantage 来源 │ 适用场景 │ ├────────────┼──────────────────────────────┼─────────────────────────────────────┤ │ Binary RL │ A R (raw broadcast) │ 简单场景只有 ±1 reward │ │ │ reward 标量广播到全序列 │ │ ├────────────┼──────────────────────────────┼─────────────────────────────────────┤ │ OPD │ A_t teacher_lp_t - old_lp_t│ 有 teacher model 提供 per-token 信号 │ │ │ teacher 的 per-token log-probs │ 需要精细引导如 hint 机制 │ ├────────────┼──────────────────────────────┼─────────────────────────────────────┤ │ Combine │ A_t w_rl·R w_opd·(teacher│ 同时需要 reward 和 teacher 信号 │ │ │ _lp_t - old_lp_t) │ 最灵活可调权重 │ └────────────┴──────────────────────────────┴─────────────────────────────────────┘关键设计原则统一 PPO clip 框架三种方法共享同一套 ratio-based clipped loss数据驱动分流Combine 通过设置 teacher_lprollout_lp 或 reward0 自动区分 OPD/RL 样本无额外模型GRPO 替代 Criticteacher 只做 forward pass不训练异步架构Proxy 实时拦截用户对话Trainer 后台持续更新1.1 架构图OpenClaw-RL 的系统架构图如下1.2 File StructureOpenClaw-RL 的的文件结构如下。OpenClaw-RL-main/ │ ├── 核心 RL 框架 │ ├── slime/ # Ray Megatron-LM 分布式训练 │ └── Megatron-LM/ # NVIDIA 模型并行后端 │ ├── 个性化 Agent 优化 (Track 1) │ ├── openclaw-rl/ # Binary RL (GRPO) │ ├── openclaw-opd/ # On-Policy Distillation │ ├── openclaw-combine/ # RL OPD 联合方法 │ └── openclaw-tinker/ # Tinker 云端零 GPU 方案 │ ├── 通用 Agent RL (Track 2) │ ├── gui-rl/ # GUI Agent (OSWorld) │ ├── swe-rl/ # SWE Agent (mini-swe-agent) │ ├── terminal-rl/ # Terminal Agent (SETA) │ └── toolcall-rl/ # Tool-Call Agent (ReTool) │ ├── 评估 │ └── openclaw-test/ # GSM8K 多轮对话评估 │ ├── 前端 │ └── openclaw/ # OpenClaw 聊天应用 (TS/Node) │ └── 配置 ├── requirements.txt # 301 个 Python 依赖 └── instructions/ # 环境搭建指南模块职责划分如下。OpenClaw-RL/ ├─ openclaw-rl/ │ ├─ openclaw_api_server.py ← FastAPI 代理 PRM 评分 样本提交 │ └─ openclaw_rollout.py ← AsyncRolloutWorker: 桥接 API Server ↔ Slime ├─ openclaw-opd/ ← OPD 变体(hint 提取 teacher log-probs) ├─ openclaw-combine/ ← Combined 变体(RL OPD 并行) ├─ openclaw-tinker/ ← 无 GPU 云端版(Tinker API) ├─ slime/ │ └─ train_async.py ← 基础 RL 框架(Megatron SGLang) │ ← 入口异步训练主循环 ├─ terminal-rl/ gui-rl/ │ swe-rl/ toolcall-rl/ ← Track 2通用智能体 RL └─ openclaw/ └─ src/ ← OpenClaw TypeScript 应用1.3 四大组件OpenClaw-RL 的系统设计是四个异步解耦的循环——policy serving、environment hosting、reward judging、policy training 同时运行、互不阻塞因此模型可以一边持续服务一边从刚刚发生的真实交互中在线学习。在这种模块化设计中各组件既保持功能独立性又实现数据互通。OpenClaw-RL四大组件 vs 标准RL的区别四个阶段的模块归属Policy Serving定义运行策略模型、生成response、提供推理能力。功能定位用户交互入口接收外部环境的请求并返回响应模型推理服务转发请求至SGLang推理引擎获取模型响应会话状态管理维护多轮对话的上下文状态技术实现Web 框架基于 FastAPI 实现OpenAI 兼容的 /v1/chat/completions接口核心文件openclaw_api_server.py/ openclaw_opd_api_server.py具体如下模块角色位置SGLang Rollout Engine真正的 PolicyLLM 推理GPU 4-5Slime 启动Ray PlacementGroup 管理OpenClawAPIServer._handle_request()HTTP 转发代理openclaw_api_server.pyhttpx.post(sglang_chat_url)向 SGLang 发送推理请求_handle_request() 内_extract_logprobs_from_chat_response()采集 rollout log-probsopenclaw_api_server.pyFastAPI /v1/chat/completions对外暴露的推理接口PORT30000_build_app()Megatron ActorGPU 0-3保存最新策略权重定期同步给 SGLangSlime 内部Environment定义产生观测next_state、定义任务边界。环境托管模块Environment Hosting Subsystem构建智能体操作的真实/模拟环境个人智能体场景集成用户终端设备手机/电脑的会话系统通用智能体场景支持云端并行终端、图形界面交互、软件工程开发环境及工具调用沙盒环境模块通过事件驱动机制实时反馈状态变化包括用户追问、代码执行结果stdout/stderr或界面元素变更等信号。具体如下模块角色位置真实用户发消息动作 看 response观测外部无代码HTTP 请求中的 messages用户发出的 observation sequenceFastAPI 请求体messages[-1]新消息next_state上一轮 turn 的环境反馈_handle_request() 第 504 行X-Session-Id header标识同一个 environment episode会话FastAPI headerX-Turn-Type: main/side区分训练轨迹与非训练交互FastAPI headerX-Session-Done headerepisode 终止信号FastAPI headerEnvironment在OpenClaw中没有代码实体它就是“真实用户HTTP协议“本身。Reward Judging定义评估当前response的质量产生reward 信号 Binary RL 的 Reward Judge。效果评估模块Reward Judging Component采用双轨制评估机制量化评估层PRM Judge基于预设指标体系生成即时评分1/-1等质性指导层OPD Hint Extractor通过自然语言理解技术提取改进建议。该模块将评估结果与指导信号整合为结构化反馈构建教师上下文用于模型微调。评估过程采用异步批处理模式支持每秒千级交互的评估吞吐量。功能定位质量评估对代理响应进行质量评分评估逻辑基于下一状态判断助手响应质量评分规则1(好)/-1(差)/0(中性)多数投票多次独立评估取多数结果奖励信号生成生成用于策略优化的奖励信号过程监督提供细粒度的过程反馈而非仅结果反馈技术实现过程奖励模型通过下一状态评估当前响应质量多数投票机制执行多次独立评估取多数结果提高可靠性异步评估在后台线程中执行耗时的LLM评估核心文件集成在openclaw_api_server.py中的PRM相关逻辑具体如下模块角色位置_fire_prm_scoring()触发 PRM 评分任务异步openclaw_api_server.py_prm_evaluate()PRM 评估主逻辑m3 并行openclaw_api_server.py_query_prm_once()单次调用 Judge LLMGPU 6-7openclaw_api_server.py_majority_vote()多数投票 → final scoreopenclaw_api_server.py_build_prm_judge_prompt()构造 judge promptopenclaw_api_server.pySGLang PRM EngineGPU 6-7运行 Judge LLM 推理Slime 启动OPD / Combine 额外的 Reward Judge如下模块角色位置_fire_opd_task()触发 OPD 评估任务异步openclaw_opd_api_server.py_opd_evaluate()Hint Judge Teacher LP Evalopenclaw_opd_api_server.py_query_judge_once()Hint Judge 单次调用GPU 6-7openclaw_opd_api_server.py_select_best_hint()选最优 hintopenclaw_opd_api_server.py_compute_teacher_log_probs()教师前向传播max_new_tokens0openclaw_opd_api_server.py_query_prm_eval_once()Eval Judge仅 Combineopenclaw_opd_api_server.py_prm_eval_majority_vote()Eval 多数投票仅 Combineopenclaw_opd_api_server.pyPolicy Training定义利用reward信号更新策略参数策略训练模块Policy Training Pipeline基于Megatron等分布式训练框架构建采用PPO等强化学习算法实现模型优化。其创新点在于独立数据队列机制隔离在线服务与训练数据流增量学习架构支持动态权重更新而不中断服务功能定位模型优化基于收集的样本和奖励信号更新策略模型分布式训练支持多GPU和多节点分布式训练技术实现训练框架基于Slime和Megatron-LM实现算法支持GRPO、PPO、KL正则化等多种RL算法核心文件slime/train_async.py及相关训练脚本具体如下模块角色位置_maybe_submit_ready_samples()等 PRM 完成后触发 sample 提交各 api_server.py_submit_turn_sample()构造 Sample 对象loss_mask, reward各 api_server.py_submit_rl_turn_sample()RL-only 样本Combineopenclaw_combine_api_server.pyoutput_queue.put(...)跨线程传递 Sample各 api_server.pySlime训练主循环模块角色位置generate_rollout_openclaw()Slime rollout 入口被动收集openclaw_rollout.py_drain_output_queue()等待 N 个样本积累openclaw_rollout.pyAsyncRolloutWorker.pause/resume_submission()控制 API 开关weight sync 期间暂停openclaw_rollout.pycompute_advantages_and_returns()计算 GRPO/OPD advantageslime/.../loss.pyget_grpo_returns()GRPO advantagereward 标量广播ppo_utils.pycompute_policy_loss()PPO clip 损失ppo_utils.pycombine_loss_function()Combine 自定义损失w_opd w_rlcombine_loss.pyMegatron ActorGPU 0-3执行梯度更新、weight syncSlime / Megatron-LMRolloutFnTrainOutputrollout 输出格式返回给 Slimeopenclaw_rollout.pyGPU分配4组件架构各自运行在哪些GPU上具体如下组件GPU实际进程核心代码Policy TrainingGPU 0-3Megatron ActorTP4slime/ openclaw_rollout.pyPolicy ServingGPU 4-5SGLang Rollout FastAPI Proxyopenclaw_api_server.pyReward JudgingGPU 6-7SGLang PRM/Judge同一个 openclaw_api_server.py 中的评分逻辑Environment无GPUOpenClawApp用户openclaw/ (TS app)即GPU 分配 (8卡节点, run_qwen3_4b_openclaw_rl.sh): GPU 0-3: Megatron Actor (ACTOR_GPUS4, TP4) - Policy Training GPU 4-5: SGLang Rollout (ROLLOUT_GPUS2, TP2) - Policy Serving GPU 6-7: SGLang PRM/Judge (PRM_GPUS2, TP2) - Reward Judging1.4 模型OpenClaw-RL 优化的是 Qwen3-4B Actor它同时也是serve用户的模型通过SGLang 推理引l擎的权重副本。三个角色Actor/Rollout/Judge用的都是同一个模型但只有 Actor 被训练更新。模型详情具体如下① Actor Model (GPU 0-3, Megatron TP4) 被优化的 Student模型 做 forward/backward/optimizer step 的那个 → 就是OpenClaw-RL 正在训练的模型 ② Rollout Mode1. (GPU 4-5,SGLang TP2 为用户服务的推理引擎 Actor的权重副本定期同步 → 不直接训练只是Actor 的“镜像“ ③ PRM Judge / Teacher (GPU 6-7,·SGLang) 评分生成hint计算teacher_log_probs 可以是同一模型的另一个实例OpenClawOPD → 不被训练只是工具被优化的只有 ① ActorModel② 和 ① 是同一个模型的不同副本权重周期性同步③ 是judge/teacher固定不变具体配置# run_qwen3_4b_openclaw_rl.sh 中: MODEL_PATHQwen/Qwen3-4B #所有角色都用同—个模型 # Actor训练Qwen3-4BMegatron格式做梯度更新 # Rollout推理Qwen3-4BSGLang 格式serve 用户 # PRM/Teacher 评估Qwen3-4BSGLang 格式评分/hint/teacher scoring)训练循环训练循环如下User → Rollout Qwen3-4B 生成 response → PRM JudgeQwen3-4B评分/生成hint → Teacher Qwen3-4Bhint 计算 teacher_log_probs → ActorQwen3-4B做梯度更新 ◄─── 这一步优化模型 → 权重同步回Rollout → 下次用户得到更好的response0x02 Slime 的作用Slime 在 OpenClaw-RL 中是核心的 RL 后训练框架负责高效地组织 rollout、trainer和data buffer等模块实现异步、解耦的RL训练流程。它连接了模型推理如SGLang、训练如 Megatron和数据流转支撑了 OpenClaw-RL 的所有 RL 训练范式OPDBinary RLCombine。2.1 集成机制Slime 通过以下机制与OpenClaw组件集成插件化架构通过命令行参数注入自定义函数异步数据流OpenClawAPIServer异步生产数据Slime异步消费训练资源隔离不同组件使用独立的GPU资源避免相互干扰统一接口所有OpenClaw变体(RL/OPD/Combine)都遵循相同的集成模式Slime 启动 SGLang 引擎 └── Slime 启动 SlimeRouter (分配动态端口) └── Slime 将 ip/port 写入 args └── OpenClawAPIServer 读取 args └── 对外暴露 PORT30000 给 OpenClaw App (用户流量入口) ✓ SGLang 的启动、GPU 分配、端口分配、Router 注册 全部由 Slime 控制 ① 分配 GPU (Ray Placement Group) ② 动态启动 SGLang 推理引擎 SlimeRouter (port动态分配 - args.sglang_router_port) ③ 动态启动 PRM Engine PRM Router (port动态分配 - args.prm_router_port) ④ 启动 Megatron Actor (GPU 0-3, TP4) ✓ OpenClawAPIServer 只是寄生在 Slime 的基础设施上 ◄───────────────────── 此处是关键 ✓ PORT30000 是外部可见端口, sglang_router_port 是 Slime 内部动态分配的这种设计使得 OpenClaw-RL能够充分利用 Slime强大的分布式训练能力同时保持 OpenClaw组件的灵活性和可扩展性。2.2 Slime 扩展我们来看看 Slime 扩展的机制。Slime 设计了插件化的钩子系统OpenClaw-RL 通过 shell 脚本中的参数注入不修改 Slime 核心即可完整接管整个训练流程。插件化架构RolloutManager是Slime中负责管理rollout数据收集的核心类它通过以下方式扩展点集成OpenClaw组件自定义生成函数通过--custom-generate-function-path指定自定义奖励函数通过--custom-rm-path指定自定义损失函数通过--custom-loss-function-path指定自定义 rollout 函数通过 --rollout-function-path 指定具体如下# run_qwen3_4b_openclaw_rl.sh 中的关键参数 --rollout-function-path openclaw_rollout.generate_rollout_openclaw # 扩展点1 --custom-generate-function-path openclaw_api_server.generate # 扩展点2 --custom-rm-path openclaw_api_server.reward_func # 扩展点3 # 无需 --custom-loss-function-path (RL用标准GRPO) # run_qwen3_4b_openclaw_combine.sh --custom-loss-function-path combine_loss.combine_loss_function # 扩展点4扩展点的职责每个扩展点的职责如下2.3 OpenClaw-RL 做了哪些工作OpenClaw-RL 的核心工作量集中在数据采集层 (openclaw_api_server.py)通过 4 个扩展点精准插入 Slime框架完全不需要修改 Slime/Megatron 核心代码。OpenClaw-RL 提供的工作量 Slime 框架提供的工作量 ───────────────────────────────────── ───────────────────────────────────── openclaw_api_server.py train_async.py (异步训练主循环) - FastAPI 代理 会话管理 Megatron-LM (TP/PP/CP 训练) - PRM 评分 (并发 m 次调用) SGLang (高效推理) - next_state 检测 Ray (分布式任务调度) - at-least-one guarantee GRPO 优势计算 - 样本提交到 output_queue PPO 损失函数 权重同步 (mbridge) openclaw_rollout.py checkpoint 管理 - 被动等待模式 rollout WanDB 日志 - drain_output_queue - pause/resume submission openclaw_opd_api_server.py - hint 提取 judge - teacher log-probs 计算 - top-K 蒸馏 combine_loss.py - combined_adv 计算 - 自定义 PPO loss run_*.sh (5-6个脚本) - GPU 分配配置 - Slime 参数绑定 - 环境变量设置扩展点①扩展点①: rollout_function_path - 最核心的接管。关键创新Slime 框架原本假设 rollout 是主动的 (给模型一个 prompt模型生成 response)。OpenClaw-RL 把它改成被动等待 (等真实用户对话产生样本)。函数名generate_rollout_openclaw()作用被 Slime的 RolloutManager调用负责协调OpenClawAPIServer 收集训练数据关键操作获取全局AsyncRolloutWorker 实例启用样本提交(resume_submission())从输出队列收集样本(_drain_output_queue())禁用样本提交(pause_submission())具体代码如下# openclaw_rollout.py def generate_rollout_openclaw(args, rollout_id, data_buffer, evaluationFalse): Slime 框架期望: 调用这个函数 → 返回 rollout_batch_size 个 Sample OpenClaw 实现: 不主动生成! 而是等待真实用户对话产生样本 worker get_global_worker(args, data_buffer) if evaluation: # 标准 eval rollout (用 Slime 自带) eval_output, _ run(eval_rollout(args, rollout_id)) return eval_output worker.resume_submission() # ← 开放 API 接受新会话的样本提交 completed_samples run( _drain_output_queue(args, worker) # ← 阻塞等待直到收集到 rollout_batch_size 个样本 ) worker.pause_submission() # ← 关闭提交 (权重更新期间503 所有请求) return RolloutFnTrainOutput(samplescompleted_samples, metrics...)标准 Slime 模式如下训练器 → 给我生成 rollout_batch_size 个样本 → rollout 引擎主动采样OpenClaw-RL 模式如下↓ 训练器 → 给我生成 rollout_batch_size 个样本 ↓ generate_rollout_openclaw() 打开阀门等待... ↓ 用户正常使用 OpenClaw (同时 API Server 收集并评分) ↓ output_queue 积满 rollout_batch_size 个样本 ↓ 关闭阀门 (暂停提交)返回给训练器扩展点 ②③扩展点 ②③custom_generate 和 custom_rm (评估用)。这两个函数是直通接口真正的评分逻辑已经在 _prm_evaluate() 异步完成并存入 sample.reward。生成函数openclaw_api_server.py函数名generate()作用被Slime在评估模式下调用用于生成单个样本的响应注意generate() 是模块级 async 函数不是 OpenClawAPIServer 的方法实现调用 SGLang 的 /generate 端点生成响应奖励函数openclaw_api_server.py函数名reward_func()作用被 Slime调用计算样本的奖励值注意reward_func() 是模块级函数不是 OpenClawAPIServer 的方法实现对于OpenClaw-RL直接返回样本中已有的PRM评分# openclaw-rl/openclaw_api_server.py 中的两个模块级函数 (仅用于 eval 阶段) # Ref: openclaw-rl/openclaw_api_server.py:141,149 async def generate(args, sample, sampling_params, evaluationFalse) → Sample: # 直接调用 SGLang 的 /generate 端点 # 返回带 rollout_log_probs 的 Sample ... async def reward_func(args, sample_or_samples, **kwargs): # 把 sample.reward[score] 透传回去 (实际评分在 API Server 已完成) return {score: s.reward.get(score, 0.0)}扩展点 ④扩展点 ④custom_loss_function_path (仅 Combine 使用)。# combine_loss.py def combine_loss_function(args, batch, logits, sum_of_sample_mean): # Slime 框架注入batch[advantages] → GRPO 预计算优势 # batch[teacher_log_probs] → OPD teacher 信号 # logits → Megatron 当前 forward pass 输出 combined_advantages w_opd * teacher_adv w_rl * grpo_adv loss PPO_clip_loss(combined_advantages) KL_loss return loss, metrics自定义 Advantage 如何接入 Trainer核心设计思路API Server 负责算好所有原材料(reward、teacher_lp、rollout_lp)Slime 只负责组装 advantage 算 loss。三种方法的 advantage 注入路径各不相同Binary RL 用 Slime 内置 GRPOOPD 靠字段劫持Combine 用 custom loss关键区分不是所有方法都用同一条路径注入 advantage。Binary RL — 走 Slime 内置 GRPO 路径reward_func(reward±1) → Slime 自动计算 GRPO advantage → PPO clip loss ↓ ppo_utils.py L207: advantages[i] ones_like(kl) * rewards[i] # broadcast不需要 custom-loss-function-pathAdvantage 由 Slime 内部的 get_grpo_returns() 计算OpenClaw 只负责提供 reward 值OPD — 劫持 Slime 的 advantage 字段API Server 把 teacher_log_probs 塞进 sample 字段 ↓ Slime loss.py 读到 teacher_log_probs ↓ advantages[i] teacher_log_probs[i] - rollout_log_probs[i] # per-token ↓ 正常 PPO clip loss - 也不需要 custom-loss-function-path - Slime 的 loss.py 内部已有 OPD 分支由 CLI 参数 --advantage-estimator on_policy_distillation 触发而非自动字段检测Combine — 唯一需要 custom loss 的combine_loss.py::combine_loss_function ↓ 读取 batch[advantages](GRPO 已算好的) 读取 batch[teacher_log_probs] 和 batch[rollout_log_probs] ↓ combined_adv w_rl * grpo_adv w_opd * (teacher_lp - rollout_lp) ↓ 用 combined_adv 替换原 advantage → PPO clip loss数据流全景图2.4 集成入口主训练入口slime/train_async.py这是Slime异步训练的核心文件主要功能包括初始化 Ray 集群创建 placement groups 分配 GPu资源创建 Rollout Manager初始化包含 SGLang 引l擎的 rollout 管理器创建训练模型初始化 actor 和 critic模型异步训练循环调用rollout_manager.generate.remote()获取训练数据调用actor_model.async_train()执行训练定期保存模型和更新权重关键调用点rollout_data_next_future rollout_manager.generate.remote(args.start_rollout_id)rollout_data_next_future rollout_manager.generate.remote(rollout_id 1)ray.get(actor_model.async_train(rollout_id,rollout_data_curr_ref))启动Slime的主要调用是通过 shell脚本启动的例如OpenClaw-RL:openclaw-rl/run_qwen3_4b_openclaw_rl.sh OpenClaw-OPD:openclaw-opd/run_qwen3_4b_openclaw_opd.sh OpenClaw-Combine: openclaw-combine/run_qwen3_4b_openclaw_combine.sh在这些脚本的最后部分通过 Ray Job Submit调用 Slime 的主训练文件ray job submit --addresshttp://127.0.0.1:8265 --runtime-env-json${RUNTIME_ENV_JSON}\ --python3 train_async.py\--actor-num-nodes 1\ --actor-num-gpus-per-node ${ACToR_GPUS}\ --rollout-num-gpus ${ROLLoUT_GPUS}\#...其他参数 --custom-generate-function-path openclaw_api_server.generate\--custom-rm-path openclaw_api_server.reward_func具体参见如下循环Slime 框架的循环如下可以看到 OpenClaw-RL 如何在其中运作。Slime 训练器→调用rollout_manager.generate()RolloutManager→调用自定义的generate_rollout_openclaw()函数OpenClawRolloutWorker→管理OpenClawAPIServer实例并收集样本OpenClawAPIServer→处理用户请求并生成训练样本Slime 框架 (train_async.py) │ ├── 初始化 Ray cluster Megatron Actor SGLang Rollout Engine │ ├── 训练循环 while True: │ │ │ ├── ① 调用 rollout_function_path (generate_rollout_openclaw) │ │ │ │ │ ├── 启动 OpenClawAPIServer (FastAPI on :30000) │ │ ├── resume_submission() - 开始接受对话 │ │ ├── 等待 output_queue 积满 rollout_batch_size 个 Sample │ │ │ (每个 Sample 已含 rollout_log_probs reward[score]) │ │ └── pause_submission() - 停止接受对话 │ │ │ ├── ② 调用 reward_func() → 返回已有的 score (直通) │ │ │ ├── ③ GRPO advantage 计算 (Slime 内置) │ │ grpo_adv broadcast(reward) to all tokens │ │ │ ├── ④ Megatron forward pass (TP4) │ │ │ ├── ⑤ 调用 custom_loss_function (combine_loss 或 Slime 内置) │ │ loss PPO_clip(combined_adv) β_KL * KL │ │ │ ├── ⑥ backward optimizer step (with CPU offload) │ │ │ └── ⑦ 权重同步: Megatron → SGLang (mbridge) │ └── 每 save_interval 步保存 checkpoint2.5 核心模块几大组件角色定位Slime核心训练框架提供分布式训练基础设施OpenClawAPIServerAPI代理服务器处理用户请求并生成训练样本AsyncRolloutWorker异步轨迹收集工作者协调数据收集流程TrainerSlime 训练器负责模型训练和权重更新采用生产者一消费者一协调者模式生产者OpenClawAPIServer生成训练样本协调者AsyncRolloutWorker管理收集流程消费者Slime Trainer消费样本进行训练依赖关系如下Slime核心框架 → AsyncRolloutWorker协调层通过函数调用接口AsyncRolloutWorker → OpenClawAPIServer(数据生产层通过队列和状态控制OpenClawAPIServer → SGLang推理引擎 : 通过 HTTP API 调用Slime → SGLang直接集成SGLang引擎用于评估调用逻辑详细分析Slime Trainer 调用 AsyncRolloutWorker调用入口点在 slime/train_async.py 中#创建rolloutmanager包含AsyncRolloutWorker rollout_manager, num_rollout_per_epoch create_rollout_manager(args, pgs[rollout], pgs.get(prm) #异步生成rollout数据 rollout_data_next_future rollout_manager.generate.remote(rollout_id 1) #训练actor模型 ray.get(actor_model.async_train(rollout_id, rollout_data_curr_ref))关键调用链Slime Train Loop → rollout_manager.generate.remote()RolloutManager→调用自定义的generate_rollout_openclaw(AsyncRolloutWorker→管理 OpenClawAPIServer 实例AsyncRolloutWorker 调用 OpenClawAPIServer初始化调用在AsyncRolloutWorker.init( 中#创建OpenClawAPIServer 实例 self._server OpenClawAPIServer(argsargs, output_queueself.output_queue, submission_enabledself._submission_enabled) #启动服务器线程 Self.worker_thread threading.Thread(targetself._server.run, daemonTrue) self.worker_thread.start()状态控制调用暂停提交worker.pause_submission( → self._server.purge_record_files()恢复提交worker.resume_submission(→启用_submission_enabled 标志_清理记录self._server.purge_record_files(→清空内部状态核心数据结构Sample对象来源OpenClawAPIServer._build_sample_for_turn() _字段prompt用户输入文本response助手响应文本tokens完整token序列rollout_log_probsSGLang生成的对数概率teacher_log_probs教师模型对数概率 (OPD/Combine 使用)rewardPRM评分结果loss_mask训练有效性掩码流向:output_queue → Slime Trainer内部状态字典_turn_counts会话回合计数器_pending_records待处理回合记录_pending_turn_data待评估回合数据(tokenslogprobs)eval_scoresPRM评估结果缓存output_queue类型queue.Queue()内容(group_index[sample_list])元组生产者OpenClawAPIServer消费者AsyncRolloutWorker → Slime Trainer异步任务队列_prm_tasks存储PRM评估的 asyncio.Task作用跟踪异步评估状态避免重复评估0x03 交互3.1 数据流我们来看看真实对话如何从用户流入训练系统。核心设计特点如下① 用户无感知 训练在后台异步进行不影响响应速度② Zero 标注 next_state 自动成为 reward 信号无需人工标注③ 完全私有 对话数据不离开用户服务器④ 实时持续学习 每次对话都可能成为训练数据模型持续进化总体流程如下训练数据收集路径用户请求→OpenClawAPIServer(生产样本)→output_queue→ AsyncRolloutWorker (收集样本)→generate_rollout_openclaw()→ RolloutManager → Slime Train Loop → Model Training评估数据生成路径Slime Evaluation → generate() function → OpenClawAPIServer._forward_to_sglang() → SGLang → Response奖励计算路径Slime Training → reward_func()→ Sample.reward.score (already computed by OpenClawAPIServer)关键数据流总结如下--------------------------------------------------------------------------------- | 阶段 | 核心组件 | 数据 | --------------------------------------------------------------------------------- | Policy Serving | SGLang FastAPI Proxy | token ids, logprobs, response text | | Environment | OpenClaw App (真实用户) | conversation turns, teacher hints | | Reward Judging | LLM Judge (多数投票) | score ∈ {-1, 0, 1} → loss_mask | | Policy Training | Megatron GRPO/OPD/Combine | advantages → gradient updates | ---------------------------------------------------------------------------------从正常训练循环时序来看时间轴如下时间轴 → T0用户请求到达→OpenClawAPISerVer处理→样本缓冲 T1下一状态到达→触发PRM评估→异步评分 T2: Slime 请求数据→AsyncRolloutWorker 启用提交 T3样本提交到队列→AsyncRolloutWorker收集样本 T4: Slime开始训练→消费样本→更新权重 T5权重更新完成→AsyncRolloutWorker禁用提交→清理状态 T6新请求使用新策略→循环继续但是其总体是异步进行的具体如下时间轴 (完全异步, 各组件不相互阻塞): SGLang: 服务用户 ─────────────────── 暂停(503) ─ 加载新权重 ─ 服务用户 ──► Proxy: 采集数据 ─────────────────── 暂停 ─────── 恢复 ───── 采集数据 ──► PRM: 评分 ───── 评分 ───── 评分 ─────────────────────── 评分 ───── 评分 ──► Megatron: ─ 等待数据 ───────────── 训练 ─ 同步 ─ 等待数据 ─── 训练 ─────────►3.2 模块交互关键接口 (模块间通信)如下OpenClaw App ──HTTP/JSON──► FastAPI Proxy headers: X-Session-Id/Turn-Type/Done FastAPI Proxy ──httpx──► SlimeRouter OpenAI-compatible, logprobsTrue SlimeRouter ──httpx──► SGLang Engine /v1/chat/completions FastAPI Proxy ──httpx──► PRM SlimeRouter /generate (plain text prompt) OpenClawAPIServer ──Queue──► AsyncRolloutWorker (group_id, [Sample]) AsyncRolloutWorker ──► generate_rollout_fn RolloutFnTrainOutput generate_rollout_fn ──► Slime → Megatron samples list submission_enabled Event ──► FastAPI Proxy pause(clear)/resume(set)模块交互流程如下具体展开如下

相关新闻

最新新闻

日新闻

周新闻

月新闻