先弄清每个部分做什么、输入输出是什么、需求应该接在哪里,再按问题深入实现。以一个 Coding Agent 任务为例,把模型调用、工具与环境、上下文、轨迹、评测和训练的交接串起来。

当前先完成 4.1:沿 generate 走完一次 Agent 任务。 以完整任务为主线,进入组件读清职责后返回调用处,再继续下一步。

第 2 章的深入阅读已设立专用入口:Trajectory Management 专题笔记。 读过 generate()/_run_turn() 后,按“历史接续与分叉 → assistant 改写 → token 对齐和 Sample 导出”继续。它属于现有第 2 章,不新增执行阶段,也不表示已完成学习。

第一遍:认识每个部分

顺序阅读单元图文对照第一遍的目标首个源码入口
00全局职责与三种运行粒度1.1、4、7.1先认识各模块做什么、在哪里运行,以及任务、请求、训练的包含关系。train.py · main
01完整任务、Harness 与执行环境4.1 的动作 4、5、6、7;7.1掌握任务执行的责任划分、环境接口、成功和失败的清理位置。examples/coding_agent_rl/generate.py · generate
02模型协议、上下文与训练轨迹4.1 的动作 2、3、3.5;补读会话结束掌握模型调用封装、工具消息处理、上下文变化和轨迹导出的接口。slime/agent/adapters/common.py · BaseAdapter._run_turn
03策略接入、数据生成与评测合同4.5、3.4、3.3、3.2、3.1;7.5/7.6/7.10 作为对照掌握单样本生成、整批 rollout、评分、hook、过滤和评测配置的区别。slime/rollout/sglang_rollout.py · generate_and_rm
04Trace、结果分析、测试与复现9、8.2、3.5;源码 tests/ 和复现文档掌握 Trace 与日志的区别、结果分析、接口测试、实验配置和可复现性边界。slime/observability/trace_utils.py · trace_span
05并发、任务数据、背压与恢复7.7、4.5、4.6;6.2 为独立服务对照掌握 Asyncio 调度、并发预算、任务队列、传输、持久化、取消和恢复的职责。slime/rollout/fully_async_rollout.py · AsyncRolloutWorker
06模型服务、Ray 资源与容器边界4.3、4.4、2.1;Kubernetes 为独立实践掌握运行位置、服务生命周期和资源治理,能定位 Kubernetes 需要补充的适配。slime/ray/placement_group.py · create_placement_groups
07训练交接、策略版本与权重更新4.2、5.1、7.8;7.9 与 SFT 作为第二遍掌握生成与训练的工程合同、基本 RL/SFT 区别、checkpoint 与策略版本边界。train.py · train

本轮源码固定在 22a89f96835969a47055a659c588f46151f8b07a。核心包是 slime/,任务组装和策略示例还在 examples/,训练入口在 train.py,验证材料在 tests/。现有 4.1 动作讲解使用早期固定版本,辅助定位时需核对当前源码。

第二遍:优先读通三个单元

  1. 完整任务与环境: generate() → Harness → Sandbox → CLI 启动与等待 → API 回连 → diff 与独立评估 → 清理。对应 4.1 的动作 4、5、6、7 和 7.1。
  2. 模型与上下文: _run_turn() → 协议转换 → 模型输入 → SGLang 生成 → 响应与轨迹 → finish_session() → Sample。对应动作 2、3、3.5。
  3. 策略与评测接入: generate_and_rm() → 自定义生成/评分 → 样本 hook/过滤 → 评测配置 → 批次结果合同。对应 4.5 和 3.1–3.4。

随后结合 Trace 与行为测试深入并发、恢复、资源和训练交接。每个单元读完应能说明调用者、输入输出、可替换接口,以及失败后由谁处理和清理。

最终代码阅读清单

这是基于本轮确认源码的文件/函数顺序,依附原有 00–07 单元;路径均相对于源码仓库根目录,链接固定在 22a89f96835969a47055a659c588f46151f8b07a。

当前先用 4.1 连续导览走通一份任务,再用 01–26 条目回查和扩展;各条目先看职责、输入输出与停止点,随后按问题深入。 Trace 与契约测试的意识从第一条任务链就开始使用,配套测试先看 fixture/断言,不把源码阅读当作运行通过。

起步:扫 README 架构段与 train.main 的角色,再从 01 的 Sample 字段和 02 的 generate 骨架进入。当前 4.1 连续导览先选 Claude/Anthropic,沿用现有图文;下表中的 Codex/OpenAI 是同一职责的实现对照,完整链读通后再比较,避免同时展开两套协议。

00 全局职责

顺序阅读入口第一遍读到这里第二遍与边界配套验证材料(先读)
01 · 样本数据合同slime/utils/types.py · Sample只读主要字段到 SpecInfo 前:任务身份、prompt、tokens、reward、mask、logprob、状态和 Session。先能说明一次任务、一次请求、一份训练样本的区别;完整序列化与所有方法后置。tests/test_sample.py

01 完整任务与环境

顺序阅读入口第一遍读到这里第二遍与边界配套验证材料(先读)
02 · 一个任务的调用骨架examples/coding_agent_rl/generate.py · generate读完 generate 的准备、Harness、diff、独立评分、训练/评测返回和 finally;boot 重试实现暂不展开。解释 CLI 退出码与 reward 的区别;第二遍追超时、空轨迹和失败。tests/test_agent/test_agent_rollout_cpu.py
03 · 可替换的 Agent 启动骨架slime/agent/harness/common.py · BaseHarness.run
slime/agent/harness/common.py · run_agent
读 user/config/launch/wait 的交接;安装 Node/npm 的辅助函数先停住。能指出新增 CLI 要实现的步骤;测试 fixture 和调用顺序断言随读。tests/test_agent/test_harness.py
04 · 先选一种 CLI:Codexslime/agent/harness/codex.py · CodexHarness.write_config
slime/agent/harness/codex.py · CodexHarness.launch_and_wait
看配置模板、模型地址、session 与启动环境;到外部 CLI 边界停止。能把 CLI 配置与 OpenAI Adapter 路由接起来;Claude 分支放在完整链读通后的实现对照。tests/test_agent/test_harness.py
05 · 执行环境和长命令slime/agent/sandbox.py · Sandbox
slime/agent/sandbox.py · exec_and_wait
读环境操作合同和等待函数;区分 detached spawn、退出标记、重复调用与等待预算。第二遍展开 E2B RPC、超时和重放;Kubernetes 后端需另外实现与验证。tests/test_agent/test_sandbox_exec_and_wait.py
06 · 任务产物与独立评分examples/coding_agent_rl/swe.py · git_diff
examples/coding_agent_rl/swe.py · run_evaluation
examples/coding_agent_rl/swe.py · _grade_scaleswe
选 eval_cmd 评分分支,追 diff 如何在新的评估环境中应用;swepro/SWE-bench 的全部实现后置。说明工作环境和评分环境分别由谁创建与清理;fake 测试不能证明真实 E2B/数据集评分。tests/test_agent/test_agent_rollout_cpu.py

02 模型、上下文与轨迹

顺序阅读入口第一遍读到这里第二遍与边界配套验证材料(先读)
07 · 先选一种模型协议:OpenAIslime/agent/adapters/openai.py · OpenAIAdapter._register_routes
slime/agent/adapters/openai.py · OpenAIAdapter._translate
slime/agent/adapters/openai.py · OpenAIAdapter._respond
用一份包含 tool_calls/tool 结果的请求,读路由、翻译和非流式响应;SSE 后置。说明请求直接来自 CLI,协议名不是实际模型供应商;对照 Anthropic 时共享流程不用重读。tests/test_agent/test_adapters.py
08 · 一轮共享模型处理slime/agent/adapters/common.py · BaseAdapter._run_turn
slime/agent/adapters/common.py · call_sglang_generate
读完两个函数,标出 sid/inflight/rid、模板 token、SGLang /generate、logprob、响应与记录。当前实际顺序为 parse → respond → record_turn;第二遍再读取消与预算分支。tests/test_agent/test_adapters.py
09 · 输出和工具调用解析slime/agent/parsing.py · parse_model_output
slime/agent/parsing.py · parse_tool_uses
读 reasoning/text/tool_uses/ill_formed 的返回形状;外部 parser 内部实现先停住。分清解析工具调用与实际执行工具的责任;配套测试部分依赖 SGLang。tests/test_agent/test_adapters.py
10 · 上下文记录到训练 Sampleslime/agent/trajectory.py · TurnRecord
slime/agent/trajectory.py · TrajectoryManager.record_turn
slime/agent/trajectory.py · TrajectoryManager.get_trajectory
slime/agent/trajectory.py · _SampleBuilder.to_sample
只追一条正常工具多轮链,核对 tokens、mask、logprob 与 reward 的导出。每个输出 Sample 当前赋完整 reward;第二遍选一种分叉/压缩/token drift,不通读全部消息树辅助实现。tests/test_agent/test_trajectory_manager_branching.py
11 · 会话完成、导出与清理slime/agent/adapters/common.py · BaseAdapter.finish_session
slime/agent/adapters/common.py · BaseAdapter.drop_session
slime/agent/adapters/common.py · BaseAdapter.shutdown_session
看在途请求等待、样本导出/解码与 cleanup-only;线程 drain 细节留到并发问题。能区分本轮 HTTP 请求结束、Session 结束与任务结束。tests/test_agent/test_agent_rollout_cpu.py

03 策略与评测接入

顺序阅读入口第一遍读到这里第二遍与边界配套验证材料(先读)
12 · 策略如何接回生成流水线slime/rollout/sglang_rollout.py · generate_and_rm
slime/rollout/sglang_rollout.py · generate_and_rm_group
slime/rollout/base_types.py · call_rollout_fn
定位 custom generate → hook → RM,组级并发/评分,以及整批 rollout 包装的不同返回合同。说明单样本扩展和替换整批 rollout 的区别;queue identity 继承细节留到 22。tests/plugin_contracts/test_plugin_generate_contracts.py
tests/plugin_contracts/test_plugin_rollout_contracts.py
13 · 可替换评分器slime/rollout/rm_hub/init.py · async_rm
slime/rollout/rm_hub/init.py · batched_async_rm
读分发顺序和单样本/批次函数签名;数学 grader 与远端重试后置。能说明新增评分器与组级评分怎样接入。tests/plugin_contracts/test_plugin_path_loading_contracts.py
14 · 样本处理与 hookslime/rollout/sample_hooks.py · apply_rollout_sample_hooks
slime/rollout/sample_hooks.py · _apply_to_sample
读 sync/async、Sample/None、嵌套形状和 rollout_id 上下文;批次过滤的确认过程后置。能指出错误返回、样本扇出与身份保持需要哪些断言。tests/test_rollout_sample_hooks.py
15 · 评测配置与实际消费slime/utils/eval_config.py · EvalDatasetConfig
slime/utils/eval_config.py · build_eval_dataset_configs
slime/rollout/sglang_rollout.py · eval_rollout_single_dataset
配置后立即对照 runner:样本注入、sampling 和 rewards/truncated/samples 返回合同。当前默认 runner 未消费 eval_task_timeout、early-stop、app_service 字段;配置合并测试不能证明运行时能力生效。tests/test_eval_config.py
16 · 另一种策略:Multi-Agentexamples/multi_agent/rollout_with_multi_agents.py · generate_with_multi_agents
examples/multi_agent/agent_system.py · run_agent_system
画 solver → rewriter → selector 和早退,定位 _emit 如何统一兄弟样本 rollout_id。对照 Coding Agent,确认通用接入合同;prompt、模型生成与奖励缩放细节第二遍再读。tests/plugin_contracts/test_plugin_generate_contracts.py

04 Trace、验证与复现

顺序阅读入口第一遍读到这里第二遍与边界配套验证材料(先读)
17 · Trace 与真实埋点位置slime/observability/trace_utils.py · bind_trace
slime/observability/trace_utils.py · trace_span
slime/observability/trace_utils.py · trace_function
先看身份、父子 span、耗时和错误,再回 sglang_rollout 的真实调用点;此步的思想也用于 02–16 的测试。第二遍看 export/import 与重试关联;Coding Agent/CLI/环境/评分的端到端传播仍需补覆盖和验证。tests/observability/test_trace_utils.py
18 · 结果分析与实验复现tools/trace_timeline_viewer.py · _build_items_from_trace
tools/trace_timeline_viewer.py · _build_cache_data
tools/trace_timeline_viewer.py · main
slime/observability/metric_utils.py · compute_pass_rate
docs/zh/advanced/reproducibility.md
只读 Trace 到离线时间线的输入/缓存/入口,以及 pass@k 的分组假设;不通读 Viewer。保存代码/模型/tokenizer/数据/采样/依赖/资源配置;固定 seed 不保证所有实现行为完全一致。tests/observability/test_trace_utils.py

05 并发、队列与恢复

顺序阅读入口第一遍读到这里第二遍与边界配套验证材料(先读)
19 · 并发上限与请求节奏slime/rollout/sglang_rollout.py · GenerateState.init
slime/utils/async_utils.py · AsyncPacer
slime/rollout/sglang_rollout.py · generate_rollout_async
先辨认 semaphore、pacer 和 FIRST_COMPLETED 收集/补任务;abort 与过滤分支第二遍追。说明并发上限、启动节奏、线程事件循环和任务取消的不同职责。tests/test_fully_async_rollout.py
20 · 持续生成:先看分支,再读本地池slime/rollout/fully_async_rollout.py · _get_worker
slime/rollout/fully_async_rollout.py · AsyncRolloutWorker._loop
slime/rollout/fully_async_rollout.py · AsyncRolloutWorker.pause
看本地 worker 的 active pool、完成队列、ABORTED 重入与暂停;reader_config 分支接下一步。本地输出 queue 无界,背压由补任务条件承担;不能写成有界输出队列。tests/test_fully_async_rollout.py
21 · 持久化模式:分布式生成池slime/rollout/fully_async_distributed.py · DistributedRollout.init
slime/rollout/fully_async_distributed.py · RolloutScheduler._run
slime/rollout/fully_async_distributed.py · RolloutScheduler.generate
slime/rollout/fully_async_distributed.py · _GenerationActor._produce
从 _get_worker 的 reader_config 分支进入,辨认每节点 worker、局部 pool、输出队列与全局 demand/prefetch。第二遍追 pause、worker 失败与结果恢复;只读本地 AsyncRolloutWorker 不覆盖这条主链。tests/test_distributed_rollout.py
22 · 任务租约、结果引用与确认slime/data/queue_data_source.py · QueueReader.get_samples
slime/data/queue_data_source.py · RolloutQueueController.take
slime/data/queue_data_source.py · RolloutQueueController.complete
slime/data/transport.py · pack_rollout_group
slime/data/transport.py · accept_raw_rollout
只追 task → lease → result_ref → receipt → accepted;QueueDataSource 主要是 reader/checkpoint 包装。第二遍再读 heartbeat/add_samples、ready_batch/finish_batch 与 save/load;外部 straw/WAL 保证另行核对。tests/test_distributed_rollout.py
tests/test_straw_fully_async_recovery.py

06 服务、资源与部署

顺序阅读入口第一遍读到这里第二遍与边界配套验证材料(先读)
23 · 服务和资源的真正拥有者slime/ray/placement_group.py · create_placement_groups
slime/ray/serving.py · ServingCluster.init
slime/backends/sglang_utils/deployment.py · start_rollout_servers
slime/backends/sglang_utils/external.py · discover_external_engines
画 PG、router、Ray engine actor 和 HTTP 模型进程的运行位置,定位它们的创建者。当前服务所有者在 ray/serving.py;第二遍读 engine_group/sglang_engine 与容器;Kubernetes 并行实践。tests/test_placement_group.py
tests/test_external_sglang_engines.py
24 · 健康、恢复与退出策略slime/ray/serving.py · ServingCluster.finish_rollout
slime/ray/serving.py · ServingCluster.recover_updatable_engines
slime/ray/serving.py · ServingCluster.dispose
slime/ray/rollout.py · RolloutManager.dispose
slime/utils/health_monitor.py · RolloutHealthMonitor.check_once
slime/utils/cleanup.py · Cleanup
区分 rollout 结束、故障引擎退役、更新前恢复、训练失败保留 serving 和成功完整回收。RolloutManager 只清理自己拥有的资源;第二遍沿 health checks、engine recover/shutdown;部分测试启动 CPU Ray。tests/test_rollout_manager_recovery.py

07 训练交接

顺序阅读入口第一遍读到这里第二遍与边界配套验证材料(先读)
25 · 生成数据怎样进入训练train.py · main
train.py · train
slime/data/batch_builder.py · BatchBuilder.convert
slime/backends/megatron_utils/actor.py · MegatronTrainRayActor._get_rollout_data
slime/backends/megatron_utils/actor.py · MegatronTrainRayActor.train_actor
只追 tokens/mask/reward/rollout_log_probs 到 advantage 与 train;主循环第一遍可在全局地图中先扫角色。第二遍选 compute_advantages_and_returns、policy_loss_function 或 sft_loss_function;不从 loss.py 开头逐行读。tests/test_process_rollout_data.py
tests/test_policy_loss.py
26 · 数据完成、共同 checkpoint 与权重发布slime/data/batch_builder.py · BatchBuilder.training_completed
slime/data/checkpoint.py · save_checkpoint
slime/data/checkpoint.py · commit_checkpoint
slime/backends/megatron_utils/actor.py · MegatronTrainRayActor.update_weights
slime/backends/megatron_utils/update_weight/init.py · create_weight_updater
接回 train 的 admission pause/update/resume,区分 accepted、training completed、checkpoint committed 与模型版本。第二遍只按实际配置选一种权重 updater 与恢复路径;数值校正、全部传输后端和训练并行后置。tests/test_rollout_straw_transport.py
tests/test_megatron_checkpoint.py
tests/test_update_weight_factory.py

实现对照与后置范围

首条 CLI/协议链读通后,比较 ClaudeCodeHarness 的 write_config/launch_and_wait 与 AnthropicAdapter 的路由/_translate/_respond;共享处理与轨迹流程不用重读。

Search-R1、Tau-bench 和独立 Rollout Buffer 作为策略/环境/服务对照;模型结构、MLA、量化内核、NPU/GB10、全部 Megatron 并行实现和所有权重传输后端按实际需求后置。Kubernetes、外部 CLI 工具循环、端到端 Trace 和吞吐/恢复/训练实验需要独立实践,不能只靠阅读数量证明。

当前证据:文件、符号、行号与本地 Git blob 已静态核对;配套测试在本轮只作为阅读材料,未执行源码仓库的测试、模型服务、Ray、训练或 Kubernetes。

需要单独实践的边界

CLI 的完整工具循环来自外部实现;OpenAI/Anthropic 在当前示例中是协议形状,实际模型生成交给 SGLang。独立 Rollout Buffer 服务、会话轨迹与主链任务队列也分别承担不同职责。

Kubernetes 环境操作、容器网络与存储、资源限制、取消和清理需要独立集群实践。Ray 调度和 Docker 镜像提供参考,但不能代替这部分经验。

生成与训练交接要分清任务、请求与训练样本三个粒度,并保留所选训练方法依赖的 token、mask、reward、logprob 和策略版本信息。模型内部算子、量化和特殊硬件实现可后置。

查看各模块的代码复用与项目路线 · 返回 Slime 目录