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@1
与train-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.0
或0.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 的高级功能,还可通过以下方式增强评估:
- 奖励分解分析:若启用了多来源奖励(如规则奖励 + RM 奖励),可在 TensorBoard 查看
train/core/reward/rule_based
和train/core/reward/rm_based
,判断哪种奖励贡献更大; - 策略可视化:通过
verl.utils.policy_visualizer
工具,输出策略在 “关键动作” 上的概率分布(如 GSM8k 中 “选择正确推理步骤” 的概率是否逐步提升); - 错误案例分析:在验证日志中筛选
score<0.5
的样本,总结 “模型常犯的错误类型”(如计算错误、步骤遗漏),针对性优化训练数据或奖励函数。
五、总结:评估流程 Checklist
无论是训练过程还是结尾,可按以下流程标准化评估:
- 过程评估(每 10 步):
✅ 奖励是否正向且上升 → ✅ 策略损失是否负向为主 → ✅ 熵值是否逐步下降 → ✅ 单步耗时是否稳定; - 中间验证(每 10 步):
✅ 验证集奖励是否与训练集同步 → ✅ 无过拟合(差距 < 20%); - 结尾评估(训练后):
✅ 最终验证集奖励达标 → ✅ 定性样本生成效果良好 → ✅ 稳定性指标(损失、熵、梯度)健康 → ✅ 资源效率符合预期。
通过这套评估体系,可全面判断 Verl 的 RL 训练是否 “有效、稳定、高效”,并快速定位问题(如奖励卡住、耗时波动),确保训练结果可靠。
本文来自博客园,作者:limingqi,转载请注明原文链接:https://www.cnblogs.com/limingqi/p/19086233