verl微批次配置指南:避免OOM的关键设置
在大型语言模型(LLM)的强化学习后训练中,内存管理是决定能否成功运行训练任务的核心挑战之一。verl作为一个专为 LLM 后训练设计的高效强化学习框架,虽然具备出色的吞吐性能和灵活的并行能力,但在实际使用过程中,若微批次(micro batch size)配置不当,极易引发显存溢出(OOM),导致训练中断。
本文将深入解析 verl 中与微批次相关的关键参数,结合源码逻辑,帮助你理解每个 batch 参数的实际作用,并提供一套清晰、可落地的配置策略,确保你在不同硬件条件下都能稳定运行 GRPO 或 PPO 类型的训练任务。
1. 理解 verl 的核心架构与数据流
verl 基于HybridFlow论文实现,采用模块化设计,支持 Actor、Rollout、Critic、Reference Policy 等组件分离部署。其核心优势在于:
- 支持 FSDP、vLLM、SGLang 等主流推理/训练框架
- 实现高效的 3D-HybridEngine,减少通信开销
- 模块间通过 Ray 进行调度,支持分布式扩展
在典型的 GRPO(Generalized Reward-based Policy Optimization)训练流程中,verl 的执行步骤如下:
- 生成阶段(Rollout):Actor 模型对输入 prompt 进行多轮采样(n 次),生成大量 response。
- 打分阶段(Scoring):基于规则或奖励模型计算每条 response 的 token-level reward。
- 策略评估:计算旧策略(old policy)和参考策略(ref policy)下的 log_prob。
- 优势估计(Advantage Estimation):利用 reward 序列计算 advantage。
- 更新 Actor:根据 PPO-style loss 更新 actor 模型。
其中,第1步“生成”和第3步“log_prob 计算”是最容易发生 OOM 的环节,因为它们涉及大规模序列的前向推理,且需要保留完整的中间激活值。
2. 关键 batch 参数详解
我们从ppo_trainer.yaml配置文件出发,梳理所有与 batch 相关的核心参数及其作用机制。
2.1 全局训练参数
data.train_batch_size=60 trainer.n_gpus_per_node=6 trainer.nnodes=1这些是顶层控制参数:
data.train_batch_size:表示一个训练 step 所处理的原始 prompt 数量,即“全局批次大小”。n_gpus_per_node和nnodes:共同决定总 GPU 数量。本例中为单机 6 卡。
⚠️ 注意:
data.train_batch_size必须能被n_gpus_per_node整除,否则会报错。
这个参数决定了整个训练流程的数据起点。后续的所有 batch 分发都基于它展开。
2.2 Actor Rollout Ref 模块中的 batch 配置
这是最容易混淆的部分。以下是关键配置项:
actor_rollout_ref.actor.ppo_mini_batch_size=60 actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu=8 actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu=8 actor_rollout_ref.ref.log_prob_micro_batch_size_per_gpu=8 actor_rollout_ref.rollout.n=12 actor_rollout_ref.rollout.tensor_model_parallel_size=2下面我们逐个解释这些参数的真实含义。
### 2.2.1actor_rollout_ref.actor.ppo_mini_batch_size
这并不是传统意义上的“mini-batch”,而是一个归一化前的占位值。
在ActorRolloutRefWorker.__init__()中,该值会被自动调整:
self.config.actor.ppo_mini_batch_size *= self.config.rollout.n # 60 * 12 = 720 self.config.actor.ppo_mini_batch_size //= (self.device_mesh.size() // sp_size) # 720 // 6 = 120最终得到的是每个 GPU 上用于更新 actor 的 effective mini-batch 大小 ——120。
但这并不意味着每个 GPU 要同时加载 120 条完整序列进行前向传播!真正的内存压力来自 rollout 和 log_prob 计算阶段。
### 2.2.2actor_rollout_ref.rollout.n=12
这是指对每一条输入 prompt,Actor 模型要进行12 次独立采样,生成 12 条不同的 response。
因此,原本的data.train_batch_size=60条 prompt,经过 rollout 后会变成60 × 12 = 720条 sequence。
这也是为什么在ray_trainer.py中你会看到:
print("gen_batch_output.batch['prompt_token_ids'].shape: ", gen_batch_output.batch['prompts'].shape) # 输出: torch.Size([720, 8192])这意味着后续所有操作(如计算 old_log_prob、ref_log_prob)都要处理720 条序列。
### 2.2.3actor_rollout_ref.rollout.tensor_model_parallel_size=2
该参数定义了Tensor Parallelism(TP)的规模。每 2 张 GPU 组成一个 TP group,共享同一个 vLLM 推理实例。
由于总共有 6 张 GPU,所以会形成6 // 2 = 3个独立的 rollout worker。
每个 worker 负责处理(60 // 3) = 20条原始 prompt。
但由于n=12,每个 worker 实际需处理20 × 12 = 240条 generated sequences。
### 2.2.4*.log_prob_micro_batch_size_per_gpu
这才是真正影响显存的关键参数!
它出现在两个地方:
actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu=8actor_rollout_ref.ref.log_prob_micro_batch_size_per_gpu=8
这两个参数分别控制:
- 在rollout 阶段,每个 GPU 每次前向推理处理多少条 sequence 来计算 log_prob
- 在reference model 阶段,每个 GPU 每次处理多少条 sequence
✅ 显存占用 ≈
(batch_size_per_gpu) × seq_len × hidden_dim × num_layers
因此,即使总的 sequence 数达到 720,只要micro_batch_size_per_gpu控制得当,就能避免 OOM。
3. 微批次配置的核心原则
为了避免 OOM,必须遵循以下三大原则:
### 3.1 原则一:rollout 阶段的 micro batch 决定峰值显存
尽管有 720 条 sequence,但 vLLM 或 HuggingFace 模型并不会一次性全部推理。
而是按 micro batch 分批处理。例如:
for i in range(0, total_sequences, micro_batch_size_per_gpu): batch = sequences[i:i + micro_batch_size_per_gpu] output = model.generate(batch)所以,真正决定显存上限的是log_prob_micro_batch_size_per_gpu。
建议初始值设为 4~8,再根据实际显存使用情况逐步上调。
### 3.2 原则二:mini_batch_size 是逻辑概念,不影响推理显存
ppo_mini_batch_size只在更新 actor 时起作用,属于优化器层面的分批处理。
它不会直接影响 rollout 或 log_prob 计算的显存消耗。
但注意:如果ppo_mini_batch_size无法被 GPU 数整除,会在初始化时报错。
### 3.3 原则三:tensor_model_parallel_size 影响设备划分方式
tensor_model_parallel_size=2表示每两张卡组成一个 TP 组,共用一份模型权重。
这会影响:
- 每个 vLLM 实例的可用显存(两张卡拼接)
- 数据分片方式(DP 维度减少)
如果你的模型太大,单卡放不下,可以尝试增大 TP size(如 4 或 8),但需保证总 GPU 数能被整除。
4. 如何安全配置微批次?—— 实践建议
下面给出一套通用的配置模板,适用于大多数场景。
### 4.1 小规模实验(单机 1~2 卡,7B~13B 模型)
data.train_batch_size: 16 trainer.n_gpus_per_node: 2 trainer.nnodes: 1 actor_rollout_ref: actor: ppo_mini_batch_size: 16 ppo_micro_batch_size_per_gpu: 4 rollout: n: 8 tensor_model_parallel_size: 1 log_prob_micro_batch_size_per_gpu: 4 ref: log_prob_micro_batch_size_per_gpu: 4说明:
- 总 sequence 数:16 × 8 = 128
- 每 GPU 处理:128 / 2 = 64 条
- 每次推理仅处理 4 条 → 安全可控
### 4.2 中等规模训练(单机 6~8 卡,13B~34B 模型)
data.train_batch_size: 48 trainer.n_gpus_per_node: 8 trainer.nnodes: 1 actor_rollout_ref: actor: ppo_mini_batch_size: 48 ppo_micro_batch_size_per_gpu: 6 rollout: n: 12 tensor_model_parallel_size: 2 log_prob_micro_batch_size_per_gpu: 6 ref: log_prob_micro_batch_size_per_gpu: 6说明:
- 总 sequence 数:48 × 12 = 576
- TP group 数:8 // 2 = 4
- 每 group 处理:576 / 4 = 144 条
- 每次推理 6 条 → 平衡效率与显存
### 4.3 大规模集群训练(多节点,百亿级以上模型)
此时应启用 FSDP + Ulysses Sequence Parallelism。
data.train_batch_size: 128 trainer.n_gpus_per_node: 8 trainer.nnodes: 4 # 共 32 卡 actor_rollout_ref: actor: ppo_mini_batch_size: 128 ppo_micro_batch_size_per_gpu: 8 ulysses_sequence_parallel_size: 4 rollout: n: 8 tensor_model_parallel_size: 2 log_prob_micro_batch_size_per_gpu: 4 ref: log_prob_micro_batch_size_per_gpu: 4说明:
- 利用 Ulysses SP 将序列切分到多个 GPU
- 结合 FSDP 分片降低单卡参数存储
- micro batch 设为 4 更保守,防止长序列爆显存
5. 调试技巧与常见问题排查
### 5.1 如何判断是否接近 OOM?
在代码中加入显存监控:
import torch def log_gpu_memory(msg=""): if torch.cuda.is_available(): used = torch.cuda.memory_allocated() / 1024**3 reserved = torch.cuda.memory_reserved() / 1024**3 print(f"[{msg}] Allocated: {used:.2f} GB, Reserved: {reserved:.2f} GB")插入到关键函数前后,如generate_sequences、compute_log_prob。
观察是否有突增。
### 5.2 报错 “CUDA out of memory” 怎么办?
优先检查以下几点:
| 检查项 | 建议 |
|---|---|
log_prob_micro_batch_size_per_gpu是否过大? | 降到 4 或 2 再试 |
seq_len是否过长? | 尝试截断到 2048 或 4096 |
| 是否启用了不必要的 offload? | 若已用 FSDP,关闭 param/optimizer offload |
| vLLM 是否开启 PagedAttention? | 确保启用以提升显存利用率 |
### 5.3 为什么修改了 micro batch 却没生效?
注意:某些参数可能被启动脚本覆盖!
查看你的训练脚本中是否有类似:
--actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu=16这类命令行参数会覆盖 YAML 文件中的设置。
建议统一在一处配置,避免冲突。
6. 总结
在 verl 框架中,正确配置微批次是避免 OOM 的关键。本文总结了以下核心要点:
data.train_batch_size是起点,决定整体数据量rollout.n会放大实际 sequence 数量,不可忽视log_prob_micro_batch_size_per_gpu是影响显存的核心参数tensor_model_parallel_size决定设备分组方式ppo_mini_batch_size是逻辑 batch,不直接影响推理显存
✅ 最佳实践:先从小 micro batch 开始(如 4),验证流程通畅后,逐步增加至显存允许的最大值。
合理配置不仅能避免崩溃,还能最大化 GPU 利用率,提升训练吞吐。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。