强化学习训练输出
每次 RL 训练运行都会把文件写入
log_path。所有文件 I/O 都经过 Storage 协议,因此 log_path 可以是本地路径,也可以是云端 URI(例如 gs://bucket/run)。本页介绍每个文件以及如何从中提取数据。
写入 log_path 的文件
文件 | 格式 | 内容 |
metrics.jsonl | JSONL | 每次训练迭代一个 JSON 对象,包含全部标量指标 |
config.json | JSON | 序列化后的训练配置(超参数、模型、数据集等) |
checkpoints.jsonl | JSONL | 检查点元数据(路径、用于续训的循环状态) |
train_iteration_NNNNNN.html | HTML | 训练 rollout 的可读 logtree 报告 |
train_iteration_NNNNNN_logtree.json | JSON | 同一份 logtree trace 的机器可读导出 |
train_iteration_NNNNNN_rollout_summaries.jsonl | JSONL | 每条轨迹一个 JSON 对象,含奖励、指标与步级数据 |
eval_<name>_iteration_NNNNNN.html | HTML | 评测 rollout 的 logtree 报告 |
eval_<name>_iteration_NNNNNN_logtree.json | JSON | 评测 logtree trace 的机器可读导出 |
eval_<name>_iteration_NNNNNN_rollout_summaries.jsonl | JSONL | 逐条轨迹的评测数据(用于 RLTestSetEvaluator) |
code.diff | text | 训练开始时的 git diff |
<name> 是评测器名称(已针对文件名做净化处理);迭代编号补零到 6 位。metrics.jsonl
每一行都是一个以指标名为键的 JSON 对象。常见键(随环境与配置而异):
progress/batch、progress/done_frac — 迭代序号与完成比例env/all/reward/total — 所有轨迹的总奖励均值env/all/<metric> — 环境发出的指标(例如 format_parse、correct)ac_tokens_per_turn — 每回合生成的 token 数均值entropy — 逐 token 熵kl_sample_train_v1、kl_sample_train_v2 — KL 散度估计量optim/lr — 学习率time/... — 各阶段的墙钟耗时df = pd.read_json("path/to/metrics.jsonl", lines=True)df.plot(x="progress/batch", y="env/all/reward/total")
*_rollout_summaries.jsonl
每条轨迹一行。最适合做聚合分析(奖励分布、逐步指标)。
with open("train_iteration_000010_rollout_summaries.jsonl") as f:trajectories = [json.loads(line) for line in f]# Each trajectory has:# - metadata: schema_version, split, iteration, group_idx, traj_idx, tags, sampling_client_step# - episode totals: total_reward, final_reward, trajectory_metrics, final_ob_len# - steps: list of {step_idx, ob_len, ac_len, reward, episode_done, metrics, logs}
*_logtree.json
logtree JSON 包含完整的 rollout 记录:提示词、模型回复、评分细节与奖励拆解。当你需要 rollout 的实际文本内容时使用它。
顶层字段:
title、started_at、path、root。root 是一棵节点树,每个节点含 tag、attrs 和 children(可以是文本字符串,也可以是嵌套节点)。部分节点带有
data 字段,内含结构化内容。用 data 可以提取诸如对话消息这类带类型的数据:def find_conversations(node):"""Recursively find all nodes with conversation data."""results = []if isinstance(node, dict):if node.get("data", {}).get("type") == "conversation":results.append(node["data"])for child in node.get("children", []):if isinstance(child, dict):results.extend(find_conversations(child))return resultswith open("eval_test_iteration_000020_logtree.json") as f:trace = json.load(f)for conv in find_conversations(trace["root"]):for msg in conv["messages"]:print(f"{msg['role']}: {msg['content'][:100] if isinstance(msg['content'], str) else '...'}")
注意:
num_groups_to_log(默认:4)控制有多少个轨迹组会获得详细的环境级日志。超出该上限的组在 logtree 中没有 rollout 内容——只有 Trajectory Details 部分(回合级统计)始终存在。config.json
序列化后的
chz 配置,记录了全部训练超参数。便于复现某次运行或跨实验比较配置。checkpoints.jsonl
每行记录一个已保存的检查点,包含其路径以及保存时的循环状态。续训逻辑用它来从上次中断处继续。