From acad5e019fcede939bdc0be4c52cdd5fe25b4d59 Mon Sep 17 00:00:00 2001 From: Ali Roshan Ghias Date: Mon, 23 Feb 2026 13:17:05 -0800 Subject: [PATCH] fix: use smoothed reward metric for VLM GRPO CLEVR convergence tests The nightly GB200 test vlm_grpo-qwen2.5-vl-3b-instruct-clevr-1n4g-dtensor2tp1.v1 was failing because the metric check evaluated train/reward at a single step (200), which is subject to per-step noise (std ~0.04 in the converged region). The GB200 run actually converged well (mean=0.954, std=0.043 over steps 151-200) but happened to land on a noise dip at step 200 (reward=0.9000, failing > 0.9), while step 199 was 0.9813. Replace single-step checks with smoothed mean over the last 20 steps (181-200) for all four VLM GRPO CLEVR test variants (dtensor and megatron, 4g and 8g). Fixes #1996 Signed-off-by: Ali Roshan Ghias --- ...m_grpo-qwen2.5-vl-3b-instruct-clevr-1n4g-dtensor2tp1.v1.sh | 2 +- ...m_grpo-qwen2.5-vl-3b-instruct-clevr-1n4g-megatrontp1.v1.sh | 4 ++-- ...m_grpo-qwen2.5-vl-3b-instruct-clevr-1n8g-dtensor2tp1.v1.sh | 2 +- ...m_grpo-qwen2.5-vl-3b-instruct-clevr-1n8g-megatrontp2.v1.sh | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/test_suites/vlm/vlm_grpo-qwen2.5-vl-3b-instruct-clevr-1n4g-dtensor2tp1.v1.sh b/tests/test_suites/vlm/vlm_grpo-qwen2.5-vl-3b-instruct-clevr-1n4g-dtensor2tp1.v1.sh index 842bfc9fa5..e4eeb2ded8 100755 --- a/tests/test_suites/vlm/vlm_grpo-qwen2.5-vl-3b-instruct-clevr-1n4g-dtensor2tp1.v1.sh +++ b/tests/test_suites/vlm/vlm_grpo-qwen2.5-vl-3b-instruct-clevr-1n4g-dtensor2tp1.v1.sh @@ -35,7 +35,7 @@ uv run tests/json_dump_tb_logs.py $LOG_DIR --output_path $JSON_METRICS # Only run metrics if the target step is reached if [[ $(jq 'to_entries | .[] | select(.key == "train/loss") | .value | keys | map(tonumber) | max' $JSON_METRICS) -ge $MAX_STEPS ]]; then uv run tests/check_metrics.py $JSON_METRICS \ - 'data["train/reward"]["200"] > 0.9' + 'mean(data["train/reward"], range_start=181) > 0.9' # Clean up checkpoint directory after successful run to save space. rm -rf "$CKPT_DIR" diff --git a/tests/test_suites/vlm/vlm_grpo-qwen2.5-vl-3b-instruct-clevr-1n4g-megatrontp1.v1.sh b/tests/test_suites/vlm/vlm_grpo-qwen2.5-vl-3b-instruct-clevr-1n4g-megatrontp1.v1.sh index 7b15555457..2b915518ee 100755 --- a/tests/test_suites/vlm/vlm_grpo-qwen2.5-vl-3b-instruct-clevr-1n4g-megatrontp1.v1.sh +++ b/tests/test_suites/vlm/vlm_grpo-qwen2.5-vl-3b-instruct-clevr-1n4g-megatrontp1.v1.sh @@ -35,8 +35,8 @@ uv run tests/json_dump_tb_logs.py $LOG_DIR --output_path $JSON_METRICS # Only run metrics if the target step is reached if [[ $(jq 'to_entries | .[] | select(.key == "train/loss") | .value | keys | map(tonumber) | max' $JSON_METRICS) -ge $MAX_STEPS ]]; then uv run tests/check_metrics.py $JSON_METRICS \ - 'data["train/loss"]["200"] < 0.1' \ - 'data["train/reward"]["200"] > 0.9' + 'mean(data["train/loss"], range_start=181) < 0.1' \ + 'mean(data["train/reward"], range_start=181) > 0.9' # Clean up checkpoint directory after successful run to save space. rm -rf "$CKPT_DIR" diff --git a/tests/test_suites/vlm/vlm_grpo-qwen2.5-vl-3b-instruct-clevr-1n8g-dtensor2tp1.v1.sh b/tests/test_suites/vlm/vlm_grpo-qwen2.5-vl-3b-instruct-clevr-1n8g-dtensor2tp1.v1.sh index 386263ba3d..b1b50b3c46 100755 --- a/tests/test_suites/vlm/vlm_grpo-qwen2.5-vl-3b-instruct-clevr-1n8g-dtensor2tp1.v1.sh +++ b/tests/test_suites/vlm/vlm_grpo-qwen2.5-vl-3b-instruct-clevr-1n8g-dtensor2tp1.v1.sh @@ -34,7 +34,7 @@ uv run tests/json_dump_tb_logs.py $LOG_DIR --output_path $JSON_METRICS # Only run metrics if the target step is reached if [[ $(jq 'to_entries | .[] | select(.key == "train/loss") | .value | keys | map(tonumber) | max' $JSON_METRICS) -ge $MAX_STEPS ]]; then uv run tests/check_metrics.py $JSON_METRICS \ - 'data["train/reward"]["200"] > 0.9' + 'mean(data["train/reward"], range_start=181) > 0.9' # Clean up checkpoint directory after successful run to save space. rm -rf "$CKPT_DIR" diff --git a/tests/test_suites/vlm/vlm_grpo-qwen2.5-vl-3b-instruct-clevr-1n8g-megatrontp2.v1.sh b/tests/test_suites/vlm/vlm_grpo-qwen2.5-vl-3b-instruct-clevr-1n8g-megatrontp2.v1.sh index bbd490e4c0..3c42ce5407 100755 --- a/tests/test_suites/vlm/vlm_grpo-qwen2.5-vl-3b-instruct-clevr-1n8g-megatrontp2.v1.sh +++ b/tests/test_suites/vlm/vlm_grpo-qwen2.5-vl-3b-instruct-clevr-1n8g-megatrontp2.v1.sh @@ -34,8 +34,8 @@ uv run tests/json_dump_tb_logs.py $LOG_DIR --output_path $JSON_METRICS # Only run metrics if the target step is reached if [[ $(jq 'to_entries | .[] | select(.key == "train/loss") | .value | keys | map(tonumber) | max' $JSON_METRICS) -ge $MAX_STEPS ]]; then uv run tests/check_metrics.py $JSON_METRICS \ - 'data["train/loss"]["200"] < 0.1' \ - 'data["train/reward"]["200"] > 0.9' + 'mean(data["train/loss"], range_start=181) < 0.1' \ + 'mean(data["train/reward"], range_start=181) > 0.9' # Clean up checkpoint directory after successful run to save space. rm -rf "$CKPT_DIR"