数据截至 (上游 commit 352f1bd7c1a0)
01 · Rollout 与事件:中央账本
本章讲什么: v1.0 把旧版那套庞大的
LightningStore(带 SQLite/Mongo 后端、心跳、重试状态机)砍成了一个纯内存的 FastAPI 服务。它只记三样东西——rollout(任务)、event(事件)、model(模型端点)。搞懂这三本账和 Rollout 的状态机,你就抓住了整个框架的骨架。
1. 为什么账本长这么「穷」
先看背景。学习侧(Trainer,GPU 集群)和执行侧(Controller + agent,CPU 机器或 K8s 集群)可能完全不在一起。它们要交换两样东西:
- 执行侧要往学习侧送遥测(这趟 agent 干了啥、得了多少分)。
- 学习侧要往执行侧送任务和模型端点(跑哪些题、模型在哪)。
旧版 v0.x 的解法是自研一套多后端 store(内存/SQLite/Mongo 三种实现),v1.0 的解法是把这笔账砍到最小(依据:README.md:15 “simplicity as the first principle”):
| 设计选择 | 落点 |
|---|---|
| 状态全放进程内存,三本模块级字典,无锁 | agentlightning/server/store.py:13-18 |
| 单进程单事件循环,天然串行、不加锁 | agentlightning/server/__main__.py:17-22(uvicorn.run(..., workers=1)) |
| 对外只有 REST API,客户端只认 HTTP | agentlightning/server/routes/ |
| 状态一变即终局,没有重试/心跳/租约这些概念 | agentlightning/schemas.py:87-100 |
store.py 的模块 docstring 直说了这是刻意的:“single-threaded, no locks, plain dict/list”(依据:agentlightning/server/store.py:3)。代价也明确:重启即丢——所以学习侧用「完成即删」来控制账本体积(见第 04 章),长期持久化不是这个框架的目标。
2. Rollout:一道题的执行单元
2.1 字段一览
Rollout(依据:agentlightning/schemas.py:175-183)是账本的主实体,一次「agent 在一个输入上跑一趟」:
rollout_id:全局唯一 id,创建时可由调用方预指定(幂等的关键,见 §4)。input:任务载荷,Any类型——一道数学题、一个 GitHub issue 都行。is_train:训练/验证标记,决定代理走哪套采样参数(见第 02 章)。config:执行配置(RolloutConfig,agentlightning/schemas.py:118-123),含超时秒数、local/k8s 专属配置。metadata:算法侧的批上下文(RolloutMetadata,agentlightning/schemas.py:126-132,字段batch_idx、sample_idx_in_batch,且extra="allow"可扩展)。status:生命周期状态(见 §3)。
执行配置按执行环境分两支:local 模式指定 agent_class(Python 类路径)和 env_map(环境变量映射,agentlightning/schemas.py:105-110);k8s 模式指定一整份 job_template(Jinja2 模板字符串,agentlightning/schemas.py:112-115)。