项目地址:
https://github.com/hiyouga/EasyR1?tab=readme-ov-file#custom-dataset
拉取镜像:
docker pull hiyouga/verl:ngc-th2.6.0-cu126-vllm0.8.4-flashinfer0.2.2-cxx11abi0
做一个镜像:
FROM hiyouga/verl:ngc-th2.6.0-cu126-vllm0.8.4-flashinfer0.2.2-cxx11abi0 WORKDIR /workplace RUN git clone https://github.com/hiyouga/EasyR1.git WORKDIR /workplace/EasyR1 RUN pip install -e . -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple RUN pip install swanlab -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
进入容器:
docker run -it \ --net host \ --gpus '"device=4,5,6,7"' \ --shm-size=64g \ -v /data/xiedong/Qwen/Qwen2.5-VL-3B-Instruct:/Qwen2.5-VL-3B-Instruct \ kevinchina/deeplearning:r1 \ bash
vim examples/qwen2_5_vl_7b_geo3k_grpo.sh
#!/bin/bash set -x export PYTHONUNBUFFERED=1 MODEL_PATH=/Qwen2.5-VL-3B-Instruct python3 -m verl.trainer.main \ config=examples/config.yaml \ data.train_files=hiyouga/geometry3k@train \ data.val_files=hiyouga/geometry3k@test \ worker.actor.model.model_path=${MODEL_PATH} \ trainer.experiment_name=qwen2_5_vl_7b_geo_grpo \ trainer.logger=['console','swanlab'] \ trainer.n_gpus_per_node=4 \ trainer.n_nodes=2
训练:
export SWANLAB_API_KEY=pM7Xvs5OS2EeXPOfJ # 设置在线跟踪模式API export SWANLAB_LOG_DIR=/swanlab_log # 设置本地日志存储路径 export SWANLAB_MODE=cloud # 包含四种模式:cloud云端跟踪模式(默认)、cloud-only仅云端跟踪本地不保存文件、local本地跟踪模式、disabled完全不记录用于debug bash examples/qwen2_5_vl_7b_geo3k_grpo.sh
解释一下 examples/config.yaml
文件中的重要参数及其含义:
1. data
部分 (数据配置):
train_files
, val_files
: 指定训练和验证数据集的路径或 Hugging Face Hub 的标识符。这是模型学习和评估的基础。prompt_key
, answer_key
, image_key
: 定义数据集中表示 prompt、真实答案(用于可能的评估或参考)以及图像(如果是多模态任务)的列名。max_prompt_length
, max_response_length
: 分别限制输入 prompt 和模型生成响应的最大 token 长度。这影响内存使用和模型处理序列的能力。过短可能截断重要信息,过长可能导致内存不足。rollout_batch_size
: 在 rollout/生成 阶段(即模型根据 prompt 生成响应时)每个设备处理的 prompt 数量。这影响生成速度和 GPU 内存使用。val_batch_size
: 在验证阶段每个设备处理的样本数量。-1
通常表示一次性处理所有验证数据。format_prompt
: 指向一个 Jinja 模板文件的路径,用于在训练前格式化原始的 prompt 文本(例如,添加特定的指令或角色标识)。max_pixels
, min_pixels
: (仅适用于多模态模型)限制输入图像处理后的最大和最小像素数,用于标准化图像大小,影响 VRAM 使用和模型性能。就是图像宽乘以图像高。filter_overlong_prompts
: 是否过滤掉那些经过格式化和 token 化后仍然超过 max_prompt_length
的 prompt。2. algorithm
部分 (算法配置):
adv_estimator
: 指定计算优势函数(Advantage)的方法。grpo
(Group Ranking Policy Optimization) 是一种特定的 PPO 变体,它会为每个 prompt 生成多个响应 (n
个) 并基于它们的排序来估计优势。这是强化学习训练的核心算法选择。disable_kl
, use_kl_loss
, kl_penalty
, kl_coef
: 这些参数控制 KL 散度正则化。KL 正则化用于限制在线策略(Actor)与参考策略(通常是初始模型或 SFT 模型)之间的差异,防止策略更新过快导致训练不稳定。
use_kl_loss
: 是否在损失函数中加入 KL 散度项。kl_coef
: KL 散度项在总损失中的权重系数。kl_penalty
: KL 散度惩罚的具体计算方式,low_var_kl
可能是某种特定的变体。3. worker
部分 (工作进程配置):
actor
(策略模型/在线模型):
global_batch_size
: 重要! 在所有 GPU 上进行一次参数更新时使用的总样本量。它影响梯度计算的准确性和稳定性。micro_batch_size_per_device_for_update
: 重要! 在单个 GPU 上,每次前向/反向传播(用于梯度计算)时处理的样本数量。global_batch_size
通常是 micro_batch_size_per_device_for_update
乘以 GPU 数量再乘以梯度累积步数。这是控制 GPU 显存占用的关键参数。micro_batch_size_per_device_for_experience
: 在单个 GPU 上,每次计算经验(例如,计算旧 log prob 或值函数输出)时处理的样本数量。max_grad_norm
: 梯度裁剪的阈值,防止梯度爆炸导致训练不稳定。padding_free
: 是否启用 PagedAttention 等技术来优化显存使用,尤其是在处理不同长度序列时。model.model_path
: 核心! 指定要训练的 Actor 模型的路径(本地或 Hugging Face Hub)。model.enable_gradient_checkpointing
: 是否启用梯度检查点,用计算时间换取显存空间,允许训练更大的模型或使用更大的批次大小。model.freeze_vision_tower
: (仅多模态) 是否冻结视觉部分的参数不进行训练。optim
: 配置优化器参数,如学习率 (lr
)、权重衰减 (weight_decay
)、优化器类型 (strategy
)、学习率预热比例 (lr_warmup_ratio
)。fsdp
: 配置 FSDP (Fully Sharded Data Parallel) 参数,用于大规模分布式训练。
enable_full_shard
: 是否启用完全分片(ZeRO Stage 3)。enable_cpu_offload
: 是否将部分参数或优化器状态卸载到 CPU 内存,以节省 GPU 显存。offload
: FSDP CPU 卸载的具体配置。rollout
(生成/采样配置):
n
: 重要! (特别是对于 GRPO/RLOO) 为每个 prompt 生成多少个响应。对于 GRPO,这个值必须大于 1。temperature
, top_p
: 控制生成文本的多样性。temperature
调整概率分布的平滑度,top_p
进行核心采样。gpu_memory_utilization
: VLLM 等推理引擎使用的显存比例。tensor_parallel_size
: 推理时使用的张量并行大小。ref
(参考模型): (如果使用 KL 散度或某些优势估计方法)
fsdp
和 offload
配置,用于加载参考模型(通常与 Actor 初始模型相同)以计算 KL 散度。配置通常倾向于节省 GPU 显存(例如启用 CPU offload)。reward
(奖励模型/函数):
reward_type
: batch
表示奖励函数可以一次处理一批数据。reward_function
: 核心! 指定计算奖励的 Python 脚本和函数 (例如 ./examples/reward_function/math.py:compute_score
)。这是 RL 的核心部分,定义了模型的优化目标。4. trainer
部分 (训练器配置):
total_epochs
, max_steps
: 控制训练的总轮数或总步数。满足其一即停止训练。project_name
, experiment_name
: 用于 WandB 或其他日志记录工具的项目和实验名称。logger
: 指定日志记录方式,例如 console
(控制台输出)和 wandb
(Weights & Biases)。nnodes
, n_gpus_per_node
: 指定分布式训练使用的节点(机器)数量和每个节点的 GPU 数量。val_freq
: 每隔多少个训练步数进行一次验证。-1
表示禁用。val_before_train
: 是否在训练开始前进行一次验证。save_freq
: 每隔多少个训练步数保存一次检查点(checkpoint)。-1
表示禁用。save_limit
: 最多保留多少个检查点。旧的会被删除。save_checkpoint_path
: 指定保存检查点的路径。load_checkpoint_path
: 指定从哪个检查点加载模型以继续训练。这个配置文件涵盖了从数据加载、模型选择、核心 RL 算法、分布式训练策略到实验管理等方面的关键设置。
rollout_batch_size:512
RolloutConfig
中,控制数据加载器的批量大小global_batch_size:128
micro_batch_size_per_device_for_update:4
micro_batch_size_per_device_for_experience:16
整个RLHF训练流程按以下阶段进行:
数据加载阶段:
rollout_batch_size
从训练数据中加载批次数据生成阶段(Rollout/Generation):
rollout.n
控制)奖励计算阶段:
compute_score
函数评估答案的正确性优势计算阶段:
rollout.n > 1
,需要生成多个响应来计算优势策略更新阶段:
每个步骤的执行会在日志中记录时间统计信息,例如gen(生成)、reward(奖励计算)、update_actor(策略更新)等阶段的时间。
在配置文件中,这些参数需要满足特定的约束关系,例如rollout_batch_size
必须能被global_batch_size
整除,以保证训练过程的正确性和效率。
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!