# PR #5899 完整报告

- 仓库：`verl-project/verl`
- 标题：[trainer] fix: return NaN for empty tensors in compute_data_metrics
- 合并时间：2026-04-13 17:32
- 原文链接：http://prhub.com.cn/verl-project/verl/pull/5899

---

# 执行摘要

- 一句话：修复 PPO 训练器指标计算中空张量导致的崩溃，返回 NaN 以优雅处理边缘情况。
- 推荐动作：建议工程师阅读此 PR 以学习如何优雅处理空张量情况，特别关注 review 中讨论的设计决策，如对 `critic/values` 的双重检查和 Agentic RL 场景的解释。

# 功能与动机

修复 Issue #5894 中报告的崩溃问题。PR body 说明："When all samples are aborted or `response_mask` is all `False`, `compute_data_metrics` crashes with RuntimeError"，并指出在系统调试或独特采样策略等边缘情况下，崩溃会阻塞训练迭代。

# 实现拆解

修改了 `verl/trainer/ppo/metric_utils.py` 中的 `compute_data_metrics` 函数。关键改动包括：引入日志记录器；对 `non_aborted_sequence_score`、`non_aborted_sequence_reward`、`valid_adv`、`valid_returns` 和 `valid_values` 添加 `numel() > 0` 检查，若为空则返回 `float("nan")` 并记录警告；修复 `non_aborted_response_length` 中的 `ValueError`，改为返回 NaN。

关键文件：
- `verl/trainer/ppo/metric_utils.py`（模块 trainer/ppo）: 核心修复文件，修改了 `compute_data_metrics` 函数以处理空张量，防止训练崩溃。

关键符号：compute_data_metrics


# 评论区精华

Review 中，gemini-code-assist[bot] 指出 `critic/values` 指标未受保护，可能导致相同错误；boundless-future 确认已通过检查 `valid_returns.numel() > 0 and valid_values.numel() > 0` 修复。此外，bot 提到 `non_aborted_response_length` 中的 `raise ValueError` 仍需处理，后续提交已解决。wuxibin89 询问所有样本中止的场景，boundless-future 解释这包括 Agentic RL 等复杂情况，强调检查的必要性。

- Critic/values 指标的空张量保护 (correctness): boundless-future 确认已通过检查 valid_returns.numel() > 0 and valid_values.numel() > 0 修复，防止错误。
- non_aborted_response_length 中的 ValueError (correctness): 在提交 c053a443 中修复，改为返回 NaN 和警告，与其它指标处理一致。
- 所有样本中止的场景解释 (design): 澄清修复的实用价值，确保在真实业务逻辑中防止不必要崩溃。

# 风险与影响

- 风险：技术风险较低。修复针对特定边缘情况，可能引入 NaN 值到指标中，但指标仅用于日志 / 监控，不影响损失计算。回归风险：如果空张量检查逻辑错误，可能导致指标计算不正确或静默失败。性能影响：额外条件检查开销可忽略。兼容性无问题。
- 影响：对用户影响：训练在边缘情况下不再崩溃，提升稳定性和调试便利性。系统影响：指标可能包含 NaN，但训练继续，损失梯度为零，无参数更新。团队影响：减少调试中断，支持复杂训练场景如 Agentic RL，提升生产环境鲁棒性。
- 风险标记：边缘情况处理 , 缺少测试覆盖

# 关联脉络

- PR #5860 [misc] fix: similar issue in calculate_debug_metrics: PR body 提及此 PR 作为参考，采用相同模式处理空张量，体现代码复用和一致性。
- PR #5894 [Bug] RuntimeError when computing metrics on empty tensors in compute_data_metrics: 关联 Issue，描述了崩溃问题和复现步骤，驱动此修复。