RL Experiments

clearwave2026-09-20未分类15

实验3:2×A100 多卡 GRPO 实验报告

本实验旨在验证基于 verl 的多卡 LLM 强化学习训练流程,并初步观察 FSDP 场景下 GRPO 的训练行为与系统性能。实验使用 2×A100 GPU,基础模型为 Qwen2.5-3B-Instruct,任务为 GSM8K 数学推理。训练采用 GRPO,Actor 使用 FSDP 进行多卡训练,rollout 后端为 vLLM,Tensor Parallel Size=1。主要参数设置为:train batch size=8,rollout.n=2,即每个训练 step 对 8 个不同 prompt 各采样 2 条 response,共产生 16 条 trajectory;Actor learning rate=1e-6,PPO mini-batch size=8,micro-batch size per GPU=2,max prompt length=512,max response length=256,关闭 reward KL 与 policy KL loss。实验共运行 25 个 training steps,不进行训练中 validation,以避免 GSM8K evaluation 对 wall-clock time 的显著干扰。

从训练行为看,25 个 step 的平均 reward/score 为 0.360,平均 entropy 为 0.325,平均 policy-gradient loss 为 0.0060,平均 gradient norm 为 0.967。Reward 在 0.1250–0.6875 之间有明显波动,这是由于单 step 仅包含 16 条 rollout,且 GSM8K reward 基本为离散的正确/错误奖励,因此 batch-level reward 方差较大。训练期间 entropy 未出现持续下降至接近 0 的现象,gradient norm 也基本保持稳定,没有观察到明显的梯度爆炸或 policy collapse。第 14、16 step 出现 pg_loss=0grad_norm=0,与 rollout.n=2 下部分 batch 缺少有效组内 reward 差异的现象一致:当同一 prompt 的两个 rollout 同时正确或同时错误时,其 GRPO relative advantage 接近 0,从而无法提供有效 policy-gradient signal。

系统性能方面,第 1 step 耗时 42.87 s、吞吐仅 63.8 tok/s,明显包含模型加载、vLLM/FSDP 初始化和 warm-up 开销,因此不纳入稳定性能统计。step 2–25 的平均 step time 为 10.57 s,平均吞吐约 255.4 tok/s,表明 warm-up 后 2×A100 的多卡 GRPO workload 运行较稳定。response 平均长度约为 230.4 tokens,但平均截断率达到 53.5%,说明当前 max_response_length=256 对 GSM8K reasoning 形成了明显限制。实验中 reward 与截断率呈较强负相关(样本内 Pearson correlation 约 -0.67),提示部分错误回答可能来自 reasoning 尚未结束即被截断;由于仅有 25 个 step,该相关性只应视为诊断信号,而不能视为正式统计结论。

原始数据如下:

step=1,  score=0.3125, entropy=0.335, pg_loss=0.0063,  grad_norm=1.167, response_len=222.3, trunc_rate=0.44, step_time=42.87s, throughput=63.8 tok/s
step=2,  score=0.1875, entropy=0.296, pg_loss=-0.0021, grad_norm=0.568, response_len=233.4, trunc_rate=0.63, step_time=10.45s, throughput=259.6 tok/s
step=3,  score=0.4375, entropy=0.342, pg_loss=-0.0143, grad_norm=1.192, response_len=230.5, trunc_rate=0.50, step_time=11.18s, throughput=242.7 tok/s
step=4,  score=0.2500, entropy=0.299, pg_loss=0.0095,  grad_norm=0.832, response_len=237.4, trunc_rate=0.69, step_time=12.30s, throughput=227.3 tok/s
step=5,  score=0.3125, entropy=0.307, pg_loss=-0.0019, grad_norm=1.184, response_len=247.1, trunc_rate=0.75, step_time=9.47s, throughput=289.9 tok/s
step=6,  score=0.2500, entropy=0.404, pg_loss=0.0253,  grad_norm=1.781, response_len=222.4, trunc_rate=0.63, step_time=9.52s, throughput=271.5 tok/s
step=7,  score=0.5625, entropy=0.378, pg_loss=0.0024,  grad_norm=1.043, response_len=230.6, trunc_rate=0.44, step_time=11.70s, throughput=232.5 tok/s
step=8,  score=0.5000, entropy=0.304, pg_loss=0.0000,  grad_norm=0.806, response_len=245.6, trunc_rate=0.56, step_time=10.49s, throughput=270.9 tok/s
step=9,  score=0.3750, entropy=0.272, pg_loss=0.0023,  grad_norm=1.339, response_len=227.1, trunc_rate=0.38, step_time=10.47s, throughput=249.9 tok/s
step=10, score=0.4375, entropy=0.292, pg_loss=0.0032,  grad_norm=0.880, response_len=239.4, trunc_rate=0.44, step_time=12.27s, throughput=220.8 tok/s
step=11, score=0.1875, entropy=0.266, pg_loss=0.0133,  grad_norm=0.659, response_len=221.4, trunc_rate=0.50, step_time=10.82s, throughput=237.9 tok/s
step=12, score=0.2500, entropy=0.316, pg_loss=-0.0004, grad_norm=1.722, response_len=228.8, trunc_rate=0.44, step_time=9.54s, throughput=274.2 tok/s
step=13, score=0.3125, entropy=0.275, pg_loss=0.0131,  grad_norm=1.045, response_len=238.8, trunc_rate=0.63, step_time=10.47s, throughput=266.7 tok/s
step=14, score=0.5000, entropy=0.340, pg_loss=0.0000,  grad_norm=0.000, response_len=218.6, trunc_rate=0.44, step_time=9.51s, throughput=266.2 tok/s
step=15, score=0.2500, entropy=0.331, pg_loss=0.0116,  grad_norm=0.978, response_len=236.6, trunc_rate=0.69, step_time=11.44s, throughput=240.8 tok/s
step=16, score=0.3750, entropy=0.367, pg_loss=0.0000,  grad_norm=0.000, response_len=241.3, trunc_rate=0.63, step_time=10.05s, throughput=284.7 tok/s
step=17, score=0.4375, entropy=0.287, pg_loss=0.0009,  grad_norm=0.473, response_len=225.1, trunc_rate=0.56, step_time=9.77s, throughput=261.4 tok/s
step=18, score=0.5000, entropy=0.329, pg_loss=-0.0137, grad_norm=1.104, response_len=201.1, trunc_rate=0.31, step_time=12.58s, throughput=200.3 tok/s
step=19, score=0.4375, entropy=0.393, pg_loss=-0.0070, grad_norm=0.994, response_len=214.8, trunc_rate=0.31, step_time=10.46s, throughput=236.3 tok/s
step=20, score=0.1250, entropy=0.332, pg_loss=0.0107,  grad_norm=0.767, response_len=240.4, trunc_rate=0.63, step_time=9.90s, throughput=284.0 tok/s
step=21, score=0.4375, entropy=0.340, pg_loss=0.0251,  grad_norm=1.214, response_len=231.6, trunc_rate=0.44, step_time=10.07s, throughput=265.5 tok/s
step=22, score=0.2500, entropy=0.260, pg_loss=0.0218,  grad_norm=0.916, response_len=235.8, trunc_rate=0.75, step_time=10.07s, throughput=266.1 tok/s
step=23, score=0.6875, entropy=0.339, pg_loss=0.0045,  grad_norm=1.160, response_len=229.7, trunc_rate=0.25, step_time=10.49s, throughput=250.7 tok/s
step=24, score=0.2500, entropy=0.343, pg_loss=0.0122,  grad_norm=1.349, response_len=228.6, trunc_rate=0.69, step_time=9.91s, throughput=269.7 tok/s
step=25, score=0.3750, entropy=0.386, pg_loss=0.0267,  grad_norm=1.000, response_len=224.1, trunc_rate=0.56, step_time=10.68s, throughput=259.9 tok/s

总体而言,本实验成功跑通了 Qwen2.5-3B + 2×A100 + FSDP + vLLM + GRPO 的多卡 LLM RL pipeline,并获得了稳定的训练吞吐与合理的梯度/entropy 行为。当前最大的配置问题是 response truncation 较严重,同时 rollout.n=2 导致部分 batch 缺乏有效的组内相对奖励信号。后续 quality-oriented 实验应优先将 max_response_length 提升至 512,并将 rollout.n 提升至 4,再通过独立 GSM8K benchmark 判断训练前后模型能力变化。 


相关文章