编辑
2025-05-02
深度学习
00

目录

训练
config.yaml 参数含义
批量大小参数含义及用途
训练流程详解

训练

项目地址:

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

config.yaml 参数含义

解释一下 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 散度或某些优势估计方法)

    • 通常包含 fsdpoffload 配置,用于加载参考模型(通常与 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 算法、分布式训练策略到实验管理等方面的关键设置。

批量大小参数含义及用途

  1. rollout_batch_size:512

    • 这是用于生成阶段(rollout phase)的批次大小,指每次从训练数据中抽取的样本数量
    • 在生成阶段,模型会对这些输入样本(prompts)生成响应(responses)
    • 主要用在 RolloutConfig 中,控制数据加载器的批量大小
  2. global_batch_size:128

    • 这是策略更新(policy update)阶段的全局批次大小
    • 表示在一个完整的权重更新周期中处理的总样本数
    • 与分布式训练相关,指所有设备上的总样本数
  3. micro_batch_size_per_device_for_update:4

    • 每个设备(GPU)在更新模型权重时单次处理的样本数
    • 用于梯度计算和参数更新阶段
    • 与梯度积累(gradient accumulation)直接相关
    • 当 global_batch_size 大于这个值时,需要多次累积梯度才能完成一次权重更新
  4. micro_batch_size_per_device_for_experience:16

    • 每个设备在经验收集(experience generation)阶段处理的样本数
    • 用于生成模型响应并计算奖励和优势(advantages)的阶段
    • 通常大于更新批次大小,因为前向传播比反向传播需要更少的内存

训练流程详解

整个RLHF训练流程按以下阶段进行:

  1. 数据加载阶段

    • 使用rollout_batch_size从训练数据中加载批次数据
  2. 生成阶段(Rollout/Generation)

    • 模型对输入提示(prompts)生成多个可能的响应(通过参数rollout.n控制)
    • 使用vLLM高效推理引擎进行生成
  3. 奖励计算阶段

    • 对生成的响应计算奖励(reward)
    • 在几何题训练中,使用compute_score函数评估答案的正确性
  4. 优势计算阶段

    • 使用GRPO(Generalized Reward Plus Optimization)算法计算优势函数
    • GRPO算法要求rollout.n > 1,需要生成多个响应来计算优势
  5. 策略更新阶段

    • 将数据分成mini-batches进行训练
    • 每个mini-batch再分成micro-batches进行梯度积累
    • 更新actor模型的参数,优化生成策略

每个步骤的执行会在日志中记录时间统计信息,例如gen(生成)、reward(奖励计算)、update_actor(策略更新)等阶段的时间。

在配置文件中,这些参数需要满足特定的约束关系,例如rollout_batch_size必须能被global_batch_size整除,以保证训练过程的正确性和效率。

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!