【Agentic RL / 强化学习框架】Miles 项目技术分析---(1)--- 总体
0x00 概要
Miles 将 Slime 的"研究级 RL 框架"升级为"Agentic-first 的企业级生产系统",核心创新在于用 Session/TITO 解决多轮 tokenization 正确性,用全异步 + staleness 解决性能,用 R3 + True On-Policy 解决稳定性。
Miles 的技术特色总结如下:
| 特色 | 核心理念 | 实现 |
|---|---|---|
| Agentic-First | Agent 开发像写普通应用 | 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_hub |
| Multi-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 场景下,Agent(LLM)在一个有状态的环境中通过多轮交互来完成任务——调用工具、搜索信息、执行代码、与外部 API 交互。模型需要从交互的最终结果(而非中间回答的评分)中学习。
1.1.1 传统 RLHF vs Agentic RL 范式对比
以下数值不是精确值。
| 维度 | 传统 RLHF(单轮) | Agentic RL(多轮) |
|---|---|---|
| 交互轮次 | 1 轮 | 10-50+ 轮 |
| 序列长度 | <4K tokens | 8K-64K+ tokens |
| 单次 Rollout 时长 | <10s | 60-600s |
| Token 归属 | 全部归模型 | 混合:model token (loss_mask=1) + env token (loss_mask=0) |
| 环境依赖 | 无 | 强依赖外部环境(Docker/API/沙箱) |
| 失败模式 | 少 | 超时/环境崩溃/格式错误/上下文满/沙箱死亡 |
| Reward 来源 | 固定 Reward Model | 环境结果(test pass, task complete) |
| Credit Assignment | 短序列,信号直接 | 长序列,Reward 在末尾 |
| Off-policy 风险 | 低 | 高(生成慢,模型可能已更新多次) |
1.1.2 核心难点
Agentic RL 的需要是:框架可以处理 推理编排、长程训练、外部环境和工程维护方式等功能,其核心难点具体举例如下:
| 难点 | 具体表现 | 影响 |
|---|---|---|
| 多轮状态管理 | 50 轮 × 200 token = 10K+ token 需要在 session server 中累积追踪 | 内存和 tokenization 一致性压力 |
| Token 混合属性 | env token(工具返回/用户输入)mask=0,model token mask=1;错标一个 = 梯度噪声 | 一个 token 错标 → 该样本梯度方向偏移 |
| Tokenization 一致性 | Jinjaloop.last导致 10% prefix 变化,首轮 tokenization 被后续轮覆盖 | 10% token 不一致 → 训练数据质量下降 |
| 训推不一致 (log prob) | 推理用 SGLang(FP8/int4),训练用 Megatron(BF16),log prob 不一致 | KL 估计失真 → 优势函数偏差 |
| MoE 路由翻转 | ~5-15% token 在训练和推理时路由到不同 expert;精度差异导致 expert 选择不同 → 梯度计算在错误 expert 上 | 前向 log prob 和反向梯度路径不一致 → 训练崩溃 |
| 长尾延迟 | 一个慢 Agent 会话阻塞整个 batch,GPU 利用率暴跌 | GPU 利用率断崖下降 |
| On-Policy 过期 | 120s 推理窗口内模型已更新 2-3 步,但 rollout 仍使用旧模型权重 | 重要性采样权重偏离 |
| Credit Assignment | 50 轮后 reward=1,不知道哪步贡献最大 | 策略梯度信号极稀疏 |
| 异构 Agent 协同 | 不同 agent 用不同模型、不同训练循环、消息队列通信 | 数据结构不统一、reward 非对称 |
| 规模可扩展性 | 1TB+ MoE 模型数十 GB 参数同步 | RDMA 带宽成为瓶颈 |
1.2 系统架构
Miles fork 自 slime,继承其核心的 RL 流水线架构:
Miles 的系统架构如下:
1.3 组件边界说明
Miles 由多个可独立启停的进程/服务组成,以下标准明各组件的职责边界:
| 组件 | 职责 | 何时需要 |
|---|---|---|
| SGLang Engine | 模型推理( rollout 生成),每个实例管理一组 GPU | 始终需要(无推理则无 rollout) |
| SGLang Router(sglang_router) | Round-robin / cache-aware 推理请求路由 | 多 GPU 推理(默认搭配 SGLang engine) |
Miles Router(miles/router/) | 最少连接负载均衡 + 健康检查 + 故障隔离 + radix tree 缓存中间件 | 高级路由需求:--use-miles-router+--miles-router-middleware-paths |
| Session Server | 多轮会话管理 + TITO 增量 tokenization + OpenAI 格式代理 | Agentic RL(多轮交互):--use-session-server |
| Megatron Actor | 分布式训练(前向/反向/optimizer step) | 始终需要(--train-backend megatron,默认) |
| FSDP Actor | 分布式训练(实验性后端) | --train-backend fsdp(小规模/非 MoE 模型) |
| Ray | 分布式进程编排、Placement Group、Actor 生命周期 | 始终需要(框架基础设施) |
| mooncake TransferEngine | RDMA 零拷贝权重传输 | P2P 模式(默认,--update-weight-transfer-mode p2p) |
1.4 数据流
miles 的 6 步完整流程如下:
1.4.1 步骤 1:Prompt 输入
路径:
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 步骤 2:Agent 交互(多轮场景)
路径:
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 约束 |
| PPO | GAE + value function clipping |
| REINFORCE++ | 逐 token 折扣累积 reward |
| REINFORCE++ Baseline | 同上 + baseline 减方差 |
| On-Policy Distillation | teacher - 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_version++1.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 训练工具链。
| 维度 | Slime | Miles (fork) |
|---|---|---|
| 设计初衷 | 通用 LLM RL 后训练框架 | 企业级大规模 Agentic RL |
| Agentic 支持 | 通过异步解耦架构支持 | 继承 + 增强 (多智能体 MrlX) |
| 核心用户 | GLM 系列模型训练 | 更广泛的企业场景 |
2.1 Slime 的职责定位
Slime 是 "分布式 RL/LLM 训练底座" - 负责把 Ray + Megatron + SGLang 组织成可训练、可 rollout、可评估的闭环系统。Slime 的核心职责不是定义具体 agent 玩法,而是提供:
- 训练主循环(
train.py,train_async.py):rollout->train->save->eval->update weights - Ray 资源编排(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 engine
- Router 地址与端口管理
- Offload/onload
- 健康监控
- 多 server group 组织
在训练后端:
- Megatron 初始化
- Tokenizer/config 加载
- Model/optimizer/scheduler 初始化
- Rollout 数据转训练 batch
- Policy/value/log prob/loss 计算
- Actor -> rollout 权重同步
2.3 Slime 的扩展点体系
Slime 明确把以下内容(举例)设计成可插拔,这样开发者可以定制:
| 类别 | 扩展点 | 机制 |
|---|---|---|
| Rollout | --rollout-function-path/--custom-generate-function-path/--eval-function-path | import path |
| 数据 | --data-source-path/--buffer-filter-path | import path |
| 过滤 | --dynamic-sampling-filter-path/--rollout-sample-filter-path | import path |
| Reward | --custom-rm-path/--custom-reward-post-process-path | import path |
| Loss | --custom-loss-function-path/--custom-tis-function-path/--custom-pg-loss-reducer-function-path | import path |
| 训练 | --custom-convert-samples-to-train-data-path/--custom-advantage-function-path | import path |
| Megatron Hooks | --custom-megatron-init-path/before-log-prob-hook/before-train-step-hook | import path |
| 模型 | args.spec/@register_model/@MegatronModelBridge.register_bridge | import + 注册 |
| 日志 | --custom-rollout-log-function-path/--custom-eval-rollout-log-function-path | import path |
| ABC | DataSource/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 / Staleness |
| Ray 编排 | PG / Actor Group / Rollout Manager | 在上面加 runtime 语义,不改编排层 |
| Rollout | 单次 generate + eval + 基础 router | Session 多轮 + tool call + agent loop + 统一编排 |
| 训练后端 | Megatron only | Megatron 增强 + FSDP + 跨后端公共抽象 |
| 权重同步 | 基础 HTTP 传输 | broadcast + P2P RDMA + 多并行布局 |
| MoE 支持 | 基础 | + R3 路由重放, 解决训推不一致 |
| 算法一致性 | 无系统治理 | 频谱:Staleness -> TIS -> R3 -> True On-Policy |
| Token 正确性 | 无验证 | TITO + template 验证 + append-only 校验 |
| 可观测性 | 基础 logging | 4 后端 Tracking + debug dump + profiling |
| 模型生态 | GLM 为主的支持 | 10+ 模型族 bridge + megatron_bridge patch |
3.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_turn | generate_utils/(token对齐/loss_mask/prefill log prob) | inference_rollout/重构调度架构 |
| ② Session & 多轮 | - | Session Server / Linear Trajectory / TITO / Template 验证 /--custom-agent-function-path | - |
| ③ Reward 体系 | 8+ 内置 RM | rm_hub/异步框架 | - |
| ④ 样本过滤 | check_reward_nonzero_std/check_no_aborted | filter_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+ 模型 bridge | megatron_bridge/Core patch | bridge 加载路径切换 |
| ⑭ 可观测性 | 保留 log 扩展点 | Tracking 4 后端 / Debug Engine | Tracking 生命周期改造 |
| ⑮ 训练主循环 | - | - | 全异步 / Staleness 过滤 / AsyncRolloutWorker |
| ⑯ 参数系统 | - | 200+ 新参数 / 插件自注册 args | 删除 advantage hook; 默认值调整 |
具体统计
| 改造方式 | 涉及领域数 | 工作量占比 |
|---|---|---|
| A. 利用扩展点(Layer A) | 5 | ~15% |
| B. 新增架构层(Layer B) | 12 | ~45% |
| C. 修改核心(Layer C) | 10 | ~40% |
