强化学习任务全观测

更新时间:
复制 MD 格式

强化学习(RL)训练链路长,问题往往跨越采样、环境执行和训练等多个环节。PAI-DLC提供RL任务全观测能力:启用XFuse Agent的pai-rl采集功能,您可以实时查看训练进度、轨迹流转、阶段耗时和逐轮轨迹详情,快速定位问题并优化训练。

说明

目前该功能已在上海和乌兰察布地域上线,其他地域逐步覆盖中。

一. 功能介绍

强化学习(Reinforcement Learning,RL)通过与环境持续探索和反馈优化,使模型在复杂决策、长程规划和工具使用等场景中不断提升能力。对于Agentic RL,模型还需要在多轮交互中完成推理、调用工具、执行环境操作,并基于结果迭代策略。

相较于传统训练,RL训练链路更长、数据形态更多元。RL任务全观测围绕“训练是否正常推进、轨迹是否高效流转、单条轨迹为何异常”三个核心问题,提供从训练控制流、轨迹数据流到单轨迹执行流的分层观测与诊断能力。

观测层次

主要数据

数据价值

Step级训练进度

生成吞吐、训练步速、预估剩余时间,以及训练阶段(Rollout生成、Reward计算、Actor更新等)迁移

快速定位单步训练中的耗时阶段与进度异常

Sample级轨迹流转

轨迹总数、流转状态(生成、成批、训练等)、各阶段耗时与慢样本分析

识别轨迹积压、流失及生产消费失衡问题

Trace级轨迹详情

各Step轨迹明细、Trace明细、逐轮分解耗时、流转明细

下钻定位长尾、低Reward和异常终止对应的具体交互轮与根因

查看全局训练进度

在任务详情页,单击RL监控 > 训练进度,可查看全局的训练进度。训练进度用于判断任务是否正常推进,并定位单个Step的耗时瓶颈。页面汇总当前Step、总Step、累计运行时长、平均Step耗时及预计剩余时间。阶段时间轴按实际执行链路展示Rollout、Reward、策略更新、参数同步、验证与Checkpoint的状态和耗时。

image

分析样本流转

在任务详情页,单击RL监控 > 流转分析,可查看样本流转。样本流转分析用于判断Rollout生产与Trainer消费是否匹配。页面汇总轨迹总数、已训练数、采样入批数、在途数量、端到端耗时及Buffer停留时间,并通过流转图展示轨迹从生成到训练完成的转化情况。

image

该页面同时展示阶段耗时分布,阶段耗时分布以P50、P90、P99标识慢样本,支持下钻至Trace详情,帮助定位轨迹积压、流失或训练等待等问题。

下钻分析样本与轨迹

在样本流转分析页面选择目标慢样本,进入Trace详情页,下钻分析样本与轨迹情况。

image

里程碑链路按执行顺序展示轨迹生成、Worker下发、Agent执行、Reward打分、采样入批及训练更新等关键节点,并标记各阶段耗时。结合Reward、交互轮数、Token分布和阶段时间轴,可快速识别长耗时或异常阶段。

image

Trace记录以事件明细还原轨迹的完整执行链路,展示事件时间、所属阶段、交互轮、源模块、目标模块及事件详情。您可以关联查看模型生成、工具调用、环境执行、Reward计算和训练更新等事件,定位跨组件调用中的延迟、失败或异常中断位置。

在Trajectory详情中,可查看该轨迹的Reward、交互轮数、总耗时、关联训练Step和提交时间。展开单个交互轮后,可进一步查看模型推理与环境执行耗时、Token用量、模型输出、工具调用及环境反馈。该视图用于复盘Agent的决策过程,分析低Reward、工具执行失败或长程任务不收敛等问题。

二. 功能启用

完成以下配置后,即可在DLC任务详情页查看RL训练进度、样本流转和单轨迹执行详情。

步骤一:集成RL Trace埋点

PAI-DLC提供两种RL Trace埋点方式,请根据使用的训练框架选择。

方式一:通过patch接入(强烈推荐)

如果您使用Verl框架,强烈建议通过patch接入。一条git apply命令即可完成Progress、Sample-flow和Trajectory三类埋点,格式已按规范对齐,无需改动框架代码。

单击下载patch文件,verl-tracing-v1-squash-eeca5b74.patch

进入Verl目录,执行如下命令。

git apply verl-tracing-v1-squash-eeca5b74.patch
说明

当前patch适用于Verl v0.8.0和v0.9.0。如需支持其他版本,请联系技术支持。

方式二:手动添加埋点

如果patch不支持您的框架版本,按照下文埋点数据规范,在Verl v1代码中集成Progress、Sample-flow和Trajectory埋点,确保训练进程能够生成三类观测数据。

步骤二:启动XFuse Agent

在任务启动脚本中设置RL采集场景,并启动XFuse Agent。

export XFUSE_AGENT_SCENARIO="pai-rl"
bash /etc/sysconfig/xfuse-agent/start.sh
重要

请使用已预装XFuse Agent的训练镜像。

步骤三:配置Trace输出目录

设置VERL_TRACE_DIR环境变量。该变量控制Sample-flow、Trajectory和Progress三类数据的落盘路径。

export VERL_TRACE_DIR=<trace_dir>

<trace_dir>为Trace输出目录,例如挂载到训练容器中的共享存储路径。未设置该变量时,不会生成Sample-flow CSV、Trajectory JSONL和Progress文件,Progress信息仍会输出到标准输出。

Trace文件按照以下目录组织:

<VERL_TRACE_DIR>/
├── progress/
├── sample/
└── trajectory/

步骤四:启动训练任务

按照常规方式提交DLC训练任务。将XFuse Agent启动命令和VERL_TRACE_DIR环境变量加入任务启动脚本,并确保所有训练节点均生效。

步骤五:验证Trace数据

训练开始后,执行以下命令检查Trace目录:

find <trace_dir> -maxdepth 2 -type f

正常情况下,目录中包含以下文件:

<trace_dir>/sample/<hostname>-pid<pid>.csv
<trace_dir>/trajectory/trajectory_<pid>_<timestamp>.jsonl
<trace_dir>/progress/<YYYYMMDD-HH>.log

如未生成文件,请依次检查:

  1. 所有Worker进程均已接收VERL_TRACE_DIR。

  2. 训练进程具有目标目录的写入权限。

  3. RL Trace埋点已加载,并与当前Verl v1代码兼容。

  4. 多机训练的各节点均可访问对应输出路径。

步骤六:查看观测结果

进入DLC并打开目标训练任务详情页面,查看训练进度、训练阶段、轨迹流转和Stage分布。发现异常阶段后,可在阶段耗时分布中选择最慢样本,并下钻至轨迹详情和Trajectory详情。

说明

Trace文件已生成但页面无数据时,请检查XFuse Agent的运行状态和pai-rl采集场景。

推荐的排查路径如下:

训练进度异常
  └─> 定位异常Step和训练阶段
      └─> 检查轨迹流转与Stage分布
          └─> 比较阶段耗时P50/P90/P99/Max
              └─> 打开最慢样本Trace
                  └─> 下钻逐Turn推理、工具和环境耗时

三. 埋点数据规范

RL任务全观测使用三类Trace数据:

  • Progress:描述Step级训练控制流,用于还原训练进度和阶段状态。

  • Sample-flow:描述Sample级状态迁移,用于还原轨迹生产、缓存和训练消费链路。

  • Trajectory:描述Trace级交互明细,用于分析Reward、Token、工具调用和逐Turn耗时。

Sample-flow数据

Sample-flow使用CSV格式记录样本或轨迹的状态迁移事件。文件不包含表头,采集器需要按以下顺序配置列名:

job_id,cat,sample_id,sample_status,timestamp,content

字段

说明

job_id

DLC任务ID,建议读取环境变量DLC_JOB_ID。

cat

固定为sample。

sample_id

样本或轨迹标识,格式为<uid>/sample或<uid>/<traj_uid>。SYNC_PARAMS为Step级事件,固定使用*/sample。

sample_status

TRAIN_UPDATE阶段为COMPLETE,其他阶段为RUNNING。

timestamp

事件发生时间,单位为毫秒。

content

流转详情,格式为from=<module>|to=<module>|stage=<stage>[|global_step=<N>][|detail=<detail>]。其中global_step和detail按事件可选。

建议覆盖以下阶段:

阶段

技术语义

DATA_PREPROCESS

生成样本标识并执行轨迹扩增。

DATA_DISPATCH

将样本下发到Agent Loop Manager和Worker。

AGENT_LOOP

标记Agent任务开始和结束。

LLM_GENERATE

标记逐Turn生成请求和响应。

AGENT_TOOL

记录已完成的工具执行及工具名称,适用于Tool Agent Loop。

ROLLOUT_REWARD

计算Rollout侧轨迹奖励。

TRAIN_SAMPLE

从ReplayBuffer取出并组装训练批次,适用于Verl v1。

TRAIN_REWARD

处理训练侧Reward。

TRAIN_LOGPROB

计算行为策略旧对数概率。

TRAIN_REF_LOGPROB

计算参考策略对数概率,可选。

TRAIN_ADVANTAGE

估计Advantage。

TRAIN_UPDATE

完成Actor策略更新,并将状态设置为COMPLETE。

SYNC_PARAMS

将更新后的权重同步到Rollout侧,使用sample_id=*/sample和sample_status=RUNNING。

示例如下:

dlc-job-example,sample,prompt-001/sample,RUNNING,1787215029000,from=DataLoader|to=PPOTrainerV1|stage=DATA_PREPROCESS|global_step=1|detail=uid_generated
dlc-job-example,sample,prompt-001/0,RUNNING,1787215030700,from=RewardLoopWorker|to=AgentLoopWorker|stage=ROLLOUT_REWARD|global_step=1|detail=reward_score_computed_score=1.0
dlc-job-example,sample,prompt-001/0,COMPLETE,1787215060000,from=ActorRolloutWorker|to=PPOTrainerV1|stage=TRAIN_UPDATE|global_step=1|detail=actor_parameters_updated
dlc-job-example,sample,*/sample,RUNNING,1787215061000,from=CheckpointEngineManager|to=RolloutReplica|stage=SYNC_PARAMS|global_step=1|detail=weights_synced_global_step=1

Trajectory数据

Trajectory使用JSONL格式记录轨迹明细,每行对应一条已完成轨迹。顶层仅保留索引字段,完整轨迹序列化为raw_message JSON字符串:

{
  "prompt_uid": "<uid>",
  "sample_index": 0,
  "raw_message": "<trajectory_json_string>"
}

解析raw_message后,可获得以下轨迹字段:

字段

说明

request_id

轨迹标识,对应当前轨迹的traj_uid。

n_samples

同一Prompt生成的轨迹数量。

global_step

轨迹所属训练Step。

created_at_ts、completed_at_ts

轨迹创建和完成时间,单位为秒。

total_time_ms

轨迹总耗时,单位为毫秒。

initial_prompt_text

首轮Prompt的解码文本。

turns[]

逐Turn生成、环境反馈和耗时明细。

agent_metrics

Agent侧生成与工具调用耗时、抢占次数,以及启用Rollout侧评分时的reward_score。

turns[]中每个元素表示一轮“模型生成Action → 工具或环境执行 → 返回Observation”,主要字段如下:

字段

说明

turn_index

Turn序号,从0开始。

prompt_token_count、completion_token_count

当前轮输入和输出Token数。

completion_text、observation_text

模型输出和环境反馈文本。

finish_reason

当前轮生成结束原因。

start_ts、end_ts

当前轮开始和结束时间,单位为秒。

turn_total_time_ms

当前轮总耗时,单位为毫秒。

completion_time_ms、observation_time_ms

模型生成和环境执行耗时,单位为毫秒。

sglang_queue_time_ms、sglang_ttft_ms

推理排队和首Token耗时,单位为毫秒。

sglang_prefill_ms、sglang_decode_time_ms

Prefill和Decode耗时,单位为毫秒。

template_overhead_tokens、template_overhead_text

多轮模板引入的额外Token数和文本。

示例如下。raw_message在实际JSONL文件中以转义后的单行JSON字符串保存:

{"prompt_uid":"prompt-001","sample_index":0,"raw_message":"{\"request_id\":\"0\",\"n_samples\":4,\"global_step\":1,\"created_at_ts\":1787215072.088,\"completed_at_ts\":1787215073.421,\"total_time_ms\":1332.52,\"turns\":[{\"turn_index\":0,\"prompt_token_count\":87,\"completion_text\":\"Call the search tool.\",\"completion_token_count\":6,\"finish_reason\":\"stop\",\"observation_text\":\"Search completed.\",\"start_ts\":1787215072.120,\"end_ts\":1787215073.321,\"turn_total_time_ms\":1201.45,\"completion_time_ms\":891.30,\"observation_time_ms\":310.15,\"sglang_queue_time_ms\":12.40,\"sglang_ttft_ms\":35.20,\"sglang_prefill_ms\":18.60,\"sglang_decode_time_ms\":825.10,\"template_overhead_tokens\":null,\"template_overhead_text\":null}],\"initial_prompt_text\":\"Complete the task with available tools.\",\"agent_metrics\":{\"generate_sequences\":0.891,\"tool_calls\":0.310,\"reward_score\":1.0,\"num_preempted\":0}}"}
说明

为控制数据量,落盘前会删除initial_prompt_token_ids、Turn级completion_token_ids和observation_token_ids等大字段。单轮轨迹中的Observation和模板开销字段可以为null。Validation轨迹不落盘。

Progress数据

Progress使用按小时轮转的文本日志记录训练控制流,每行记录一条完整事件,不添加时间、日志级别等结构化前缀。文件路径为<VERL_TRACE_DIR>/progress/<YYYYMMDD-HH>.log,同一内容同时输出到标准输出。

Progress日志包括以下行类型:

类别

行格式

初始化

Total training steps: <N>

Step标识

==================== Step <N> ====================

阶段事件

[disagg: ]start <stage>、[disagg: ]end <stage>

训练Batch

Trainer: try to load global batch@<N>, chunk[0/0] from replay_queue、Trainer: successfully load global batch@<N>, ...

Rollout窗口

Step <N> rollout started、Step <N> rollout finished

训练窗口

Step <N> train started、Step <N> train finished

轨迹完成

Task <uid>/<traj_uid> is completed, score=<X> status=Finished

生成吞吐

gen throughput (token/s): <X>

阶段名称包括generation、compute reward、compute log prob、compute ref log prob、compute values、compute adv、update actor、save checkpoint、eval、record metrics和sync params。未启用的阶段无需输出。其中,generation仅用于Colocate或Sync模式。

separate_async模式示例如下:

Total training steps: 100
==================== Step 1 ====================
Step 1 rollout started
Trainer: try to load global batch@1, chunk[0/0] from replay_queue
Trainer: successfully load global batch@1, chunk[0/0] from replay_queue
Step 1 rollout finished
Task prompt-001/0 is completed, score=1.0 status=Finished
disagg: start compute reward
disagg: end compute reward
disagg: start compute log prob
disagg: end compute log prob
disagg: start compute adv
disagg: end compute adv
Step 1 train started
disagg: start update actor
disagg: end update actor
Step 1 train finished
disagg: start sync params
disagg: end sync params

separate_async模式下,训练阶段的开始和结束日志带有disagg:前缀,Batch加载日志使用固定的Trainer:前缀,Step窗口和轨迹完成日志不带上述前缀。该模式不输出generation阶段和生成吞吐。Colocate或Sync模式的阶段日志不带disagg:前缀,使用generation阶段记录ReplayBuffer取样窗口,并可在Step标识中包含Epoch和已消费Batch数。

四. 使用限制

  • Validation样本不写入Sample-flow和Trajectory数据,也不产生已完成Rollout日志,因此不会进入轨迹流转、长尾统计和Trace分析。

  • Sample-flow的timestamp单位为毫秒。Trajectory的created_at_ts、completed_at_ts等时间戳单位为秒,total_time_ms、completion_time_ms等耗时字段单位为毫秒。自定义消费程序需要按字段分别处理。

  • Sample-flow CSV不包含表头,采集器必须显式配置列名。

  • SYNC_PARAMS为Step级事件,sample_id固定为*/sample,sample_status为RUNNING,不应按单条轨迹解读。

  • 分位数反映统计窗口内的数据分布。调整时间窗口后,样本数和P50、P90、P99结果会随之变化。

  • 跨节点耗时分析依赖时钟同步。存在时钟偏差时,部分相邻事件间隔可能失真。