【Agentic RL / 强化学习框架】Miles 项目技术分析---(1)--- 总体 0x00 概要Miles 将 Slime 的研究级 RL 框架升级为Agentic-first 的企业级生产系统核心创新在于用 Session/TITO 解决多轮 tokenization 正确性用全异步 staleness 解决性能用 R3 True On-Policy 解决稳定性。Miles 的技术特色总结如下特色核心理念实现Agentic-FirstAgent 开发像写普通应用Session Server TITO agentic_tool_call正确性优先消除所有训推不一致源R3 FP8 统一 True On-Policy TIS/MIS性能极致GPU 永不空闲全异步 投机解码 零拷贝 部分 rollout渐进式保证从宽松到严格可选Staleness(宽) → TIS(中) → True On-Policy(严)工程纪律静默错误 → 显式断言Chat template 验证 运行时 prefix 校验插件化扩展新模型零改核心代码miles_plugins/ middleware_hubMulti-Agent从轻量到生产级内置示例 → MrlX 完整框架下图可以看到Miles的工作Miles 的工作 利用Slime扩展点 底层内核 / 精度改造 ◄─── 非扩展点 RDMA 权重同步基础设施 ◄─── 非扩展点 训练后端深度改造 (FSDP/CP) ◄─── 非扩展点 Chat Template 正确性工程 ◄─── 非扩展点 可观测性 / 调试系统 ◄─── 非扩展点 20 场景示例生态 ◄─── 非扩展点 ......注在本文撰写时朱小霖大神 已经发布了最新版本 slime v0.3.0: 面向 Agent 时代 因此本文涉及的 slime 都是旧版本的表现不代表 slime 的最新能力。另因为本文为从源码反推涉及且编写仓促所以肯定有错误还请读者不吝指出谢谢。0x01 基础1.1 Agentic RL 的需求与难点在传统 RLHF 中模型根据一个 prompt 生成一段回答reward model 对该回答打分完成一轮训练。而在 Agentic RL 场景下AgentLLM在一个有状态的环境中通过多轮交互来完成任务——调用工具、搜索信息、执行代码、与外部 API 交互。模型需要从交互的最终结果而非中间回答的评分中学习。1.1.1 传统 RLHF vs Agentic RL 范式对比以下数值不是精确值。维度传统 RLHF单轮Agentic RL多轮交互轮次1 轮10-50 轮序列长度4K tokens8K-64K tokens单次 Rollout 时长10s60-600sToken 归属全部归模型混合model token (loss_mask1) env token (loss_mask0)环境依赖无强依赖外部环境Docker/API/沙箱失败模式少超时/环境崩溃/格式错误/上下文满/沙箱死亡Reward 来源固定 Reward Model环境结果test pass, task completeCredit Assignment短序列信号直接长序列Reward 在末尾Off-policy 风险低高生成慢模型可能已更新多次1.1.2 核心难点Agentic RL 的需要是框架可以处理 推理编排、长程训练、外部环境和工程维护方式等功能其核心难点具体举例如下难点具体表现影响多轮状态管理50 轮 × 200 token 10K token 需要在 session server 中累积追踪内存和 tokenization 一致性压力Token 混合属性env token工具返回/用户输入mask0model token mask1错标一个 梯度噪声一个 token 错标 → 该样本梯度方向偏移Tokenization 一致性Jinjaloop.last导致 10% prefix 变化首轮 tokenization 被后续轮覆盖10% token 不一致 → 训练数据质量下降训推不一致 (log prob)推理用 SGLangFP8/int4训练用 MegatronBF16log prob 不一致KL 估计失真 → 优势函数偏差MoE 路由翻转~5-15% token 在训练和推理时路由到不同 expert精度差异导致 expert 选择不同 → 梯度计算在错误 expert 上前向 log prob 和反向梯度路径不一致 → 训练崩溃长尾延迟一个慢 Agent 会话阻塞整个 batchGPU 利用率暴跌GPU 利用率断崖下降On-Policy 过期120s 推理窗口内模型已更新 2-3 步但 rollout 仍使用旧模型权重重要性采样权重偏离Credit Assignment50 轮后 reward1不知道哪步贡献最大策略梯度信号极稀疏异构 Agent 协同不同 agent 用不同模型、不同训练循环、消息队列通信数据结构不统一、reward 非对称规模可扩展性1TB MoE 模型数十 GB 参数同步RDMA 带宽成为瓶颈1.2 系统架构Miles fork 自 slime继承其核心的 RL 流水线架构Miles 的系统架构如下1.3 组件边界说明Miles 由多个可独立启停的进程/服务组成以下标准明各组件的职责边界组件职责何时需要SGLang Engine模型推理 rollout 生成每个实例管理一组 GPU始终需要无推理则无 rolloutSGLang Router(sglang_router)Round-robin / cache-aware 推理请求路由多 GPU 推理默认搭配 SGLang engineMiles Router(miles/router/)最少连接负载均衡 健康检查 故障隔离 radix tree 缓存中间件高级路由需求--use-miles-router--miles-router-middleware-pathsSession Server多轮会话管理 TITO 增量 tokenization OpenAI 格式代理Agentic RL多轮交互--use-session-serverMegatron Actor分布式训练前向/反向/optimizer step始终需要--train-backend megatron默认FSDP Actor分布式训练实验性后端--train-backend fsdp小规模/非 MoE 模型Ray分布式进程编排、Placement Group、Actor 生命周期始终需要框架基础设施mooncake TransferEngineRDMA 零拷贝权重传输P2P 模式默认--update-weight-transfer-mode p2p1.4 数据流miles 的 6 步完整流程如下1.4.1 步骤 1Prompt 输入路径JSONL 文件 → Dataset 加载 → tokenizer/processor 预处理 → RolloutDataSource.get_samples(batch_size) → 每个 prompt 复制 n_samples_per_prompt 份 → list[list[Sample]]每个Sample的初始字段—prompt,tokens,response,response_length,loss_mask,rollout_log_probs,rollout_routed_experts,reward,status,metadata等。1.4.2 步骤 2Agent 交互多轮场景路径Sample → generate(Sample) → OpenAIEndpointTracer.create() → POST /sessions → session_id → custom_agent_function(base_url, prompt, kwargs, metadata) → Agent 内部多次 POST /sessions/{id}/v1/chat/completions → Session Server 代理到 SGLang Router → SGLang Engine 推理 → collect_records() → GET /sessions/{id} → compute_samples_from_openai_records() → TITO trailing token trim → list[Sample] (每轮一个) → merge_samples() / 保持多轮1.4.3 步骤 3训练数据转换路径_convert_samples_to_train_data()Sample[] → { tokens: [...], # prompt response 完整 token response_lengths: [...], # 每样本 response 长度 rewards: [...], # 归一化后的奖励 raw_reward: [...], # 原始奖励 loss_masks: [...], # 每 token 是否参与 loss truncated: [...], # 是否被截断 rollout_log_probs: [...], # SGLang 推理时的 log prob用于 TIS rollout_routed_experts: [...], # R3 路由数据 weight_versions: [...], # 推理时的权重版本用于 staleness 检测 }1.4.4 步骤 4训练路径train_actor()rollout_data → get_data_iterator() → micro-batches → [if R3] _fill_replay_data() → 解析 routed_experts 到 Replay 对象 → [if KL] _switch_model(ref) → compute_log_prob(ref_log_probs) → _switch_model(actor) → compute_log_prob(log_probs) → compute_advantages_and_returns() → GRPO/PPO/REINFORCE → train() → Megatron 前向 反向 optimizer step优势函数计算的核心逻辑见支持6 种优势估计器估计器机制GRPO组内 reward 减去均值 可选 std 归一化GSPO组内 reward 归一化 序列级 KL 约束PPOGAE value function clippingREINFORCE逐 token 折扣累积 rewardREINFORCE Baseline同上 baseline 减方差On-Policy Distillationteacher - student log prob 差1.4.5 步骤 5权重同步路径[actor.py] → [mixin.py] → [p2p.py]Megatron GPU params → TP all_gather (收集 tensor parallel 分片) → EP all_gather (收集 expert parallel 分片) → Megatron→HF 格式转换 → ParameterMapper.map() (HF name → SGLang name) → load_weights() → shared CPU buffer → mooncake RDMA write → SGLang GPU memory → post_load_weights() (FP8 重量化) → weight_version1.4.6 步骤 6循环全异步变体路径[train_async.py]rollout_data_next generate(rollout_id 1) ← 提前启动 rollout_data_curr await rollout_data_next ← 等待本次 train(rollout_id, rollout_data_curr) ← 训练与下次 rollout 重叠0x02 从 Slime 说起在 Slime 基础上Miles 将 Slime 的 支持 Agentic升级为 Agentic-first提供开箱即用的 Agent 训练工具链。维度SlimeMiles (fork)设计初衷通用 LLM RL 后训练框架企业级大规模 Agentic RLAgentic 支持通过异步解耦架构支持继承 增强 (多智能体 MrlX)核心用户GLM 系列模型训练更广泛的企业场景2.1 Slime 的职责定位Slime 是 分布式 RL/LLM 训练底座 - 负责把 Ray Megatron SGLang 组织成可训练、可 rollout、可评估的闭环系统。Slime 的核心职责不是定义具体 agent 玩法而是提供训练主循环(train.py,train_async.py):rollout-train-save-eval-update weightsRay 资源编排(Placement Group, Train Actor, Rollout Manager 生命周期)Megatron 训练后端(模型初始化, train/save, loss/value/log prob 计算)SGLang rollout 基础设施(启动推理引擎, router, generate/eval, 健康检查)插件 / 扩展点(25 个--xxx-path动态导入接口)Slime 不负责复杂 agent/session/tool/多轮语义、训推精确一致性治理、多后端。2.2 Slime 端到端做了什么在train.py里Slime 负责完整训练编排分配 GPU - 启动 rollout manager - 创建 actor/critic - 每轮generate rollout - train - save - eval - update rollout weights在 rollout 层面启动 / 恢复 SGLang engineRouter 地址与端口管理Offload/onload健康监控多 server group 组织在训练后端Megatron 初始化Tokenizer/config 加载Model/optimizer/scheduler 初始化Rollout 数据转训练 batchPolicy/value/log prob/loss 计算Actor - rollout 权重同步2.3 Slime 的扩展点体系Slime 明确把以下内容(举例)设计成可插拔这样开发者可以定制类别扩展点机制Rollout--rollout-function-path/--custom-generate-function-path/--eval-function-pathimport path数据--data-source-path/--buffer-filter-pathimport path过滤--dynamic-sampling-filter-path/--rollout-sample-filter-pathimport pathReward--custom-rm-path/--custom-reward-post-process-pathimport pathLoss--custom-loss-function-path/--custom-tis-function-path/--custom-pg-loss-reducer-function-pathimport path训练--custom-convert-samples-to-train-data-path/--custom-advantage-function-pathimport pathMegatron Hooks--custom-megatron-init-path/before-log-prob-hook/before-train-step-hookimport path模型args.spec/register_model/MegatronModelBridge.register_bridgeimport 注册日志--custom-rollout-log-function-path/--custom-eval-rollout-log-function-pathimport pathABCDataSource/TrainRayActor/HfWeightIteratorBase/HuggingfaceAttention继承0x03 Miles 的升级Miles 将 Slime 的研究级 RL 框架升级为Agentic-first 的企业级生产系统核心创新在于用 Session/TITO 解决多轮 tokenization 正确性用全异步 staleness 解决性能用 R3 True On-Policy当前支持 dense 模型解决稳定性。3.1 升级思路 --- 三层利用策略虽然 Slime 提供了扩展点但是 Miles 并没有简单的利用扩展点而是“利用扩展点 新增架构层 深度改造核心” 三者并行。具体可以分为三层Layer C: 新增架构层 (Miles 独创)Session Server / TITO / Miles Router / Agent Hook → Slime 完全没有预见Layer B: 深度改造 (修改 Slime 核心 扩展点)改默认 rollout/data-source / 删 advantage hook 类 / 优化 rollout 合约 / bridge 路径切换Layer A: 直接利用扩展点 (Slime 设计的 path hooks)custom-generate / custom-rm / dynamic-filter Miles 用户进一步通过这些接口接入自己的逻辑3.2 分工边界Slime 做 能跑起来Miles 做 跑得正确 跑得快 跑复杂场景。因此两者分工边界如下维度Slime 负责Miles 负责训练主循环基本闭环 (同步/异步骨架)异步化增强 / AsyncRolloutWorker / StalenessRay 编排PG / Actor Group / Rollout Manager在上面加 runtime 语义不改编排层Rollout单次 generate eval 基础 routerSession 多轮 tool call agent loop 统一编排训练后端Megatron onlyMegatron 增强 FSDP 跨后端公共抽象权重同步基础 HTTP 传输broadcast P2P RDMA 多并行布局MoE 支持基础 R3 路由重放, 解决训推不一致算法一致性无系统治理频谱Staleness - TIS - R3 - True On-PolicyToken 正确性无验证TITO template 验证 append-only 校验可观测性基础 logging4 后端 Tracking debug dump profiling模型生态GLM 为主的支持10 模型族 bridge megatron_bridge patch3.3 Miles工作全景下表为Miles工作全景对于主要工作领域进行分类看看属于三层中哪一层。其中Layer A. 利用扩展点通过 Slime 预设的--xxx-path接口注入实现Layer B. 新增架构层Slime 完全没有的模块Miles 从零建设Layer C. 深度改造/修改核心对 Slime 原有代码的深度改造 / 重写工作领域Layer A. 利用扩展点Layer B. 新增架构层Layer C. 深度改造/修改核心① Rollout 生成agentic_tool_call/multi_turn/single_turngenerate_utils/(token对齐/loss_mask/prefill log prob)inference_rollout/重构调度架构② Session 多轮-Session Server / Linear Trajectory / TITO / Template 验证 /--custom-agent-function-path-③ Reward 体系8 内置 RMrm_hub/异步框架-④ 样本过滤check_reward_nonzero_std/check_no_abortedfilter_hub/协议抽象-⑤ 数据源RolloutDataSourceWithBuffer-默认数据源切换⑥ 训练 Loss保留 loss/tis 扩展点training_utils/loss.py跨后端公共层Loss 重构 (TIS/OPD/true-on-policy/CP)⑦ 训练一致性-True On-Policy 契约 / FP8 统一内核训练侧可直接用 rollout log prob⑧ MoE 路由--R3 路由重放注入 MoE 层⑨ 权重同步-P2P RDMA 零拷贝多并行布局支持 broadcast 增强⑩ Router 中间件-Miles Router / RadixTree 中间件-⑪ 训练后端args.spec保留FSDB 后端 /training_utils/抽象Megatron actor 增强 (LoRA/CP/P2P/debug)⑫ SGLang 集成-sglang_utils/引擎管理rollout 启动改造⑬ 模型插件10 模型 bridgemegatron_bridge/Core patchbridge 加载路径切换⑭ 可观测性保留 log 扩展点Tracking 4 后端 / Debug EngineTracking 生命周期改造⑮ 训练主循环--全异步 / Staleness 过滤 / AsyncRolloutWorker⑯ 参数系统-200 新参数 / 插件自注册 args删除 advantage hook; 默认值调整具体统计改造方式涉及领域数工作量占比A. 利用扩展点Layer A5~15%B. 新增架构层Layer B12~45%C. 修改核心Layer C10~40%