verl中的RL训练过程中评估指标

在 Verl 框架的 RL 训练中,评估训练过程与结尾的核心指标需围绕 “训练稳定性”“策略收敛性”“任务效果”“资源效率” 四大维度展开,结合框架内置的日志、TensorBoard 监控及自定义验证逻辑实现。以下是具体的评估方法、关键指标解读及操作步骤:

一、核心评估维度与关键指标(过程 + 结尾通用)

Verl 的 RL 训练(如 PPO/GRPO)本质是 “策略迭代优化”,需从 “过程指标”(判断训练是否健康)和 “结尾指标”(判断任务是否达成)两方面评估,具体指标及意义如下表:

评估维度关键指标过程评估意义(训练中监控)结尾评估意义(训练后总结)
1. 任务效果 奖励相关(reward) - 单步奖励(reward):是否从负向→正向波动,正向占比是否逐步提升(如从 0%→100%);
- 奖励均值(如train-core/reward/mean):是否持续上升(如从 - 0.1→0.5)。
- 最终训练集奖励均值:是否达到任务阈值(如 GSM8k 需≥0.55);
- 验证集奖励均值(val-core/.../reward/mean@1):是否与训练集同步(差距 < 10%,无过拟合)。
2. 策略收敛性 损失相关(loss) - 策略损失(policy_loss/pg_loss):是否从大幅波动→稳定在接近 0 的区间(如从 ±0.5→±0.05),负向占比高说明更新方向正确;
- KL 损失(kl_loss):是否稳定在 0.005~0.02(无骤升,说明策略更新可控)。
- 最终策略损失:是否稳定在 ±0.05 以内;
- KL 损失均值:是否全程无超过 0.03(无更新崩溃风险)。
  熵值(entropy) - 是否从高(1.0+)→低(0.2~0.5)逐步下降,无骤降(如从 1.0→0.1)。 - 最终熵值:是否稳定在 0.2~0.5(探索 - 利用平衡,无过度探索 / 利用)。
3. 训练稳定性 梯度相关(grad_norm) - 是否全程 < 1.0(无梯度爆炸),无骤升(如从 0.5→2.0)。 - 梯度范数均值:是否 < 0.8(训练全程稳定)。
  优势函数(adv_mean) - 是否从 0→非 0 波动(如 ±0.0001→±0.001),无恒为 0(说明价值估计有效)。 - 优势函数均值:是否非 0 且稳定(如 ±0.0005,说明策略能区分动作价值)。
4. 资源效率 单步耗时(s/it) - 是否无 3 倍以上波动(如从 50s→200s),无持续上升(说明硬件资源无泄漏)。 - 平均单步耗时:是否在合理范围(如单卡 Qwen3-4B 约 30~60s/it),总训练时长是否符合预期。
  显存 / 算力占用 - 单卡显存占用是否稳定(如无从 20GB→30GB 骤升),GPU 利用率是否 > 50%(资源无浪费)。 - 全程显存峰值:是否低于硬件上限(如 24GB 卡 < 20GB),无 OOM 风险。

二、训练过程中的评估方法(实时监控)

Verl 框架通过 “日志输出”“TensorBoard 可视化”“中间验证” 三种方式实时暴露指标,操作步骤如下:

1. 基础:从训练日志中提取关键指标

训练时通过tee grpo.log将日志保存到文件,可实时查看或事后分析:

bash
# 实时查看日志中的关键指标(过滤核心字段)
tail -f grpo.log | grep -E "Training Progress|reward|policy_loss|entropy|kl_loss|grad_norm"

# 示例输出解读(step 49):
# Training Progress:  15%|█▌        | 49/320 [1:06:07<4:11:40, 55.72s/it, policy_loss=-0.1249, pg_loss=-0.1250, entropy=0.0321, kl_loss=0.00780, adv_mean=-0.0000, reward=0.3531, grad_norm=0.10]
# 解读:step 49,奖励0.3531(正向),策略损失-0.1249(更新方向正确),熵值0.0321(利用为主),单步耗时55.72s(正常)

过程评估关键点:
  • 每 10 步记录一次 “奖励均值”“损失趋势”,若奖励连续 3 步不升反降、损失骤升(如从 - 0.1→0.5),需暂停训练排查(如学习率过高、奖励函数异常);
  • 单步耗时若持续翻倍(如从 50s→100s),需检查 VLLM 缓存或分布式负载(参考前文 “耗时优化” 方案)。

2. 进阶:TensorBoard 可视化(推荐)

Verl 支持将指标写入 TensorBoard,可直观观察趋势(避免日志碎片化),操作步骤:
(1)训练前配置 TensorBoard
在训练脚本中确保trainer.logger包含tensorboard,并指定日志目录:

bash
# 脚本中的TensorBoard配置(已在之前脚本中包含)
export TENSORBOARD_DIR="/data/${trainer_project_name}/${trainer_experiment_name}"
trainer.logger=['console','tensorboard']  # 同时输出到控制台和TensorBoard 
(2)启动 TensorBoard 查看指标
训练启动后,在本地或服务器上启动 TensorBoard(需端口开放):

bash
# 启动TensorBoard,指定日志目录
tensorboard --logdir=/data/verl_grpo_example_gsm8k/qwen3_4b_grpo_8ka --port=6006

通过浏览器访问 http://服务器IP:6006,可查看以下核心图表:
  • Scalars(标量指标):重点关注
    • train/core/reward/mean:训练集奖励均值(应持续上升);
    • train/core/policy_loss:策略损失(应逐步趋近于 0,负向为主);
    • train/core/entropy:熵值(应逐步下降至 0.2~0.5);
    • val/core/reward/mean@1:验证集奖励均值(应与训练集同步上升)。
  • Histograms(分布图表):辅助查看
    • train/core/reward/distribution:奖励分布(从 “集中在负向”→“集中在正向”);
    • train/core/grad_norm/distribution:梯度范数分布(无异常峰值)。

过程评估优势:
  • 可直观发现 “日志中不易察觉的趋势”,如 “奖励均值上升但方差增大”(说明策略不稳定)、“验证集奖励停滞但训练集上升”(过拟合)。

3. 关键:中间验证(每 N 步评估泛化能力)

Verl 通过trainer.test_freq配置 “每 N 步执行一次验证”,避免训练集过拟合,核心是评估 “模型在未见过的样本上的表现”:
(1)配置验证参数
在脚本中已包含验证相关配置:

bash
trainer.test_freq=10  # 每10步验证一次
data.val_files=$DATA_DIR/test.parquet  # 验证集路径
(2)解读验证日志
验证后日志会输出类似以下内容:

bash
# 示例验证日志(step 290):
(TaskRunner pid=371299) step:290 - val-core/openai/gsm8k/reward/mean@1:0.7338893100833965
过程评估关键点:
  • val-core/reward/mean@1train-core/reward/mean差距 > 20%(如训练集 0.5,验证集 0.3),说明过拟合,需提高kl_loss_coef(从 0.001→0.005)或降低学习率;
  • 若验证集奖励持续下降(如从 0.7→0.5),需检查验证集数据是否异常(如ground_truth路径错误)。

三、训练结尾的评估方法(总结性评估)

训练结束后(达到total_epochs或早停阈值),需从 “任务效果”“训练稳定性”“资源效率” 三方面做总结性评估,形成报告:

1. 核心:任务效果评估(是否达成目标)

  • 关键指标:最终验证集奖励均值(val-core/.../reward/mean@1)、正向奖励占比
    • 示例(GSM8k 任务):若目标是 “验证集奖励≥0.55”,最终达到 0.62,且正向奖励占比 95%,说明任务达成;
    • 若未达标(如仅 0.4),需回溯日志:是 “奖励卡在 0.4 不上升”(策略收敛停滞)还是 “正向占比低”(模型仍需探索),针对性调整(如增加训练轮次、优化奖励函数)。
  • 定性评估:随机抽取 10~20 条验证集样本,查看模型生成结果
    例如 GSM8k 任务,检查 “推理步骤正确性” 和 “最终答案匹配度”:
    bash
    # 从验证集日志中提取样本(如step 290的验证日志)
    grep -A 5 "\[prompt\]" grpo.log | grep -E "\[prompt\]|\[response\]|\[ground_truth\]|\[score\]"
    # 示例输出:
    # [prompt] user: Janet’s ducks lay 16 eggs...
    # [response] Janet eats 3 eggs... #### 18
    # [ground_truth] 18
    # [score] 1.0  # 完全正确,达标
    若多数样本score=1.00.8+,说明模型实际效果与指标一致;若score高但生成结果错误(如答案正确但推理步骤错误),需优化奖励函数(如增加 “推理步骤正确性权重”)。

2. 辅助:训练稳定性总结

整理以下指标的 “全程均值” 和 “最终值”,判断训练是否健康:

指标健康标准(示例)异常情况及原因
policy_loss 均值 -0.05~0.05 均值 > 0.1:策略更新方向混乱(优势函数计算错误);均值 <-0.2:更新过保守(学习率过低)。
entropy 最终值 0.2~0.5 <0.1:过度利用(策略固化,泛化差);>1.0:过度探索(未收敛)。
kl_loss 均值 0.005~0.02 >0.03:策略更新激进(KL 系数过低);<0.001:更新保守(KL 系数过高)。
grad_norm 均值 <0.8 >1.0:梯度爆炸(学习率过高,需裁剪)。

3. 补充:资源效率总结

评估训练的 “性价比”,为后续任务调优提供参考:

  • 总训练时长:是否符合预期(如 320 步预期 5 小时,实际 7 小时→需优化耗时);
  • 显存峰值:单卡最高显存占用(如 24GB 卡占用 20GB→合理;占用 23GB→需降低批大小);
  • GPU 利用率:全程平均利用率(如 > 70%→资源利用充分;<30%→需提高批大小或启用混合精度)。

四、Verl 框架特有的评估工具(可选)

若使用 Verl 的高级功能,还可通过以下方式增强评估:
  1. 奖励分解分析:若启用了多来源奖励(如规则奖励 + RM 奖励),可在 TensorBoard 查看train/core/reward/rule_basedtrain/core/reward/rm_based,判断哪种奖励贡献更大;
  2. 策略可视化:通过verl.utils.policy_visualizer工具,输出策略在 “关键动作” 上的概率分布(如 GSM8k 中 “选择正确推理步骤” 的概率是否逐步提升);
  3. 错误案例分析:在验证日志中筛选score<0.5的样本,总结 “模型常犯的错误类型”(如计算错误、步骤遗漏),针对性优化训练数据或奖励函数。

五、总结:评估流程 Checklist

无论是训练过程还是结尾,可按以下流程标准化评估:
  1. 过程评估(每 10 步):
    ✅ 奖励是否正向且上升 → ✅ 策略损失是否负向为主 → ✅ 熵值是否逐步下降 → ✅ 单步耗时是否稳定;
  2. 中间验证(每 10 步):
    ✅ 验证集奖励是否与训练集同步 → ✅ 无过拟合(差距 < 20%);
  3. 结尾评估(训练后):
    ✅ 最终验证集奖励达标 → ✅ 定性样本生成效果良好 → ✅ 稳定性指标(损失、熵、梯度)健康 → ✅ 资源效率符合预期。

通过这套评估体系,可全面判断 Verl 的 RL 训练是否 “有效、稳定、高效”,并快速定位问题(如奖励卡住、耗时波动),确保训练结果可靠。

image

 

image

 

posted on 2025-09-11 16:30  limingqi  阅读(243)  评论(0)    收藏  举报

导航