最近正在研究如何使用强化学习RL技术微调大模型读 VeRL 框架 的代码。VeRL 代码库在 examples/ 目录下提供了一些 RL 训练的示例脚本。其中ppo_trainer/run_deepseek7b_llm.sh 和 grpo_trainer/run_deepseek7b_llm.sh 这两个脚本均使用 gsm8k 数据集训练 deepseek 7b 模型不过一个使用 PPO 算法另一个使用 GRPO 算法。经比较这两个脚本的内容只有一些参数不同。笔者感到很好奇这些不同的参数表示什么含义如何跟具体算法对应起来对训练的影响又是什么本篇博客记录了笔者的学习过程。1 PPO 脚本 vs GRPO 脚本内容比较1.1 PPO 脚本 examples/ppo_trainer/run_deepseek7b_llm.sh# 来源于 examples/ppo_trainer/run_deepseek7b_llm.shset-xpython3-mverl.trainer.main_ppo\algorithm.adv_estimatorgae\data.train_files$HOME/data/gsm8k/train.parquet\data.val_files$HOME/data/gsm8k/test.parquet\data.train_batch_size1024\data.max_prompt_length512\data.max_response_length512\data.filter_overlong_promptsTrue\data.truncationerror\actor_rollout_ref.model.pathdeepseek-ai/deepseek-llm-7b-chat\actor_rollout_ref.actor.optim.lr1e-6\actor_rollout_ref.model.use_remove_paddingTrue\actor_rollout_ref.actor.ppo_mini_batch_size256\actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu16\actor_rollout_ref.actor.fsdp_config.param_offloadFalse\actor_rollout_ref.actor.fsdp_config.optimizer_offloadFalse\actor_rollout_ref.actor.use_kl_lossFalse\actor_rollout_ref.model.enable_gradient_checkpointingTrue\actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu32\actor_rollout_ref.rollout.tensor_model_parallel_size4\actor_rollout_ref.rollout.namevllm\actor_rollout_ref.rollout.gpu_memory_utilization0.4\critic.optim.lr1e-5\critic.model.use_remove_paddingTrue\critic.model.pathdeepseek-ai/deepseek-llm-7b-chat\critic.model.enable_gradient_checkpointingTrue\critic.ppo_micro_batch_size_per_gpu32\critic.model.fsdp_config.param_offloadFalse\critic.model.fsdp_config.optimizer_offloadFalse\algorithm.use_kl_in_rewardFalse\trainer.critic_warmup0\trainer.logger[console,wandb]\trainer.project_nameverl_example_gsm8k\trainer.experiment_namedeepseek_llm_7b_function_rm\trainer.n_gpus_per_node8\trainer.nnodes1\trainer.save_freq20\trainer.test_freq1\trainer.use_legacy_worker_implauto\trainer.total_epochs15$1.2 GRPO 脚本 examples/grpo_trainer/run_deepseek7b_llm.sh# 来源于 examples/grpo_trainer/run_deepseek7b_llm.sh仅展示不同的行algorithm.adv_estimatorgrpo\data.max_response_length1024\actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu80\actor_rollout_ref.actor.use_kl_lossTrue\actor_rollout_ref.actor.kl_loss_coef0.001\actor_rollout_ref.actor.kl_loss_typelow_var_kl\actor_rollout_ref.actor.entropy_coeff0\actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu160\actor_rollout_ref.rollout.tensor_model_parallel_size2\actor_rollout_ref.rollout.gpu_memory_utilization0.6\actor_rollout_ref.rollout.n5\actor_rollout_ref.ref.log_prob_micro_batch_size_per_gpu160\actor_rollout_ref.ref.fsdp_config.param_offloadTrue\# 以及GRPO 脚本没有以下这些行critic.optim.lr1e-5\critic.model.use_remove_paddingTrue\critic.model.pathdeepseek-ai/deepseek-llm-7b-chat\critic.model.enable_gradient_checkpointingTrue\critic.ppo_micro_batch_size_per_gpu32\critic.model.fsdp_config.param_offloadFalse\critic.model.fsdp_config.optimizer_offloadFalse\2 脚本差别讲解2.1 核心算法选择adv_estimatorPPO 脚本algorithm.adv_estimatorgaeGRPO 脚本algorithm.adv_estimatorgrpo含义gae使用 GAEGeneralized Advantage Estimation需要一个 value functioncritic来估计 V(s)然后用 TD(λ) 的形式算 advantage。grpo改用 GRPO 的 group-relative advantage不需要单独的 critic 网络而是对同一个 prompt 采样一组 responsegroup根据组内 reward 做归一化直接得到 advantage。在 VeRL 的实现里这是通过把adv_estimator设为对应的枚举值AdvantageEstimator.GRPO然后调用compute_grpo_outcome_advantage/compute_grpo_vectorized_outcome_advantage等函数来实现的。2.2 响应长度data.max_response_lengthPPOdata.max_response_length512GRPOdata.max_response_length1024GRPO 脚本允许更长的输出复杂推理、多样解答这和 GRPO 的典型使用场景math / reasoning是匹配的。没有算法上的硬性要求只是工程经验GRPO 经常和更长推理链配合使用。2.3 Actor 端 batch 设置相关对比几行# PPOactor_rollout_ref.actor.ppo_mini_batch_size256\actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu16\# GRPOactor_rollout_ref.actor.ppo_micro_batch_size_per_gpu80\# 示例里没再显式设 mini_batch_size保持默认含义根据 VeRL config 文档ppo_mini_batch_size一个 PPO epoch 里每次 optimizer step 使用的样本数全局计数。ppo_micro_batch_size_per_gpu每块 GPU 一次前向/反向的微批大小控制显存占用。GRPO 脚本把ppo_micro_batch_size_per_gpu提高到 80是利用了下面两个事实GRPO没有 critic总体显存压力小了可以把 micro batch 放大。GRPO 一般会配合n1的 group 采样需要吞吐更多样本。2.4 KL 相关use_kl_loss、kl_loss_coef、kl_loss_type、use_kl_in_reward对比# PPOactor_rollout_ref.actor.use_kl_lossFalse\algorithm.use_kl_in_rewardFalse\# GRPOactor_rollout_ref.actor.use_kl_lossTrue\actor_rollout_ref.actor.kl_loss_coef0.001\actor_rollout_ref.actor.kl_loss_typelow_var_kl\# (仍然保持 algorithm.use_kl_in_rewardFalse也就是不用 reward 级的 KL 惩罚)关键点PPO 脚本里use_kl_lossFalseuse_kl_in_rewardFalse 既没有在 loss 里用 KL也没有在 reward 里扣 KL纯靠 reward / advantage。GRPO 脚本里关掉 reward 中的 KLalgorithm.use_kl_in_rewardFalse改为在 loss 里加 KL 正则actor_rollout_ref.actor.use_kl_lossTrue系数kl_loss_coef0.001决定total_loss ppo_loss 0.001 * kl_loss形式kl_loss_typelow_var_kl即使用 “低方差 KL 近似公式”具体实现下面会讲。这也符合官方 GRPO 文档里的推荐GRPO 建议在 actor loss 上加 KL而不是在 reward 上手动减一个 KL penalty。2.5 熵系数entropy_coeffPPO 脚本没有显式改使用 config 默认值文档里默认是 0 或很小的值。GRPO 脚本显式写actor_rollout_ref.actor.entropy_coeff0意思是完全关掉熵正则。因为 GRPO 已经通过group 相对奖励鼓励好样本抑制差样本以及KL loss 控制和 ref policy 的距离来进行探索/正则了额外的熵正则很多工作里会直接设为 0。在 loss 公式中PPO/GRPO 的 actor loss大致是L actor L ppo λ KL ⋅ KL_loss − λ ent ⋅ H ( π ) L_{\text{actor}} L_{\text{ppo}} \lambda_{\text{KL}} \cdot \text{KL\_loss} - \lambda_{\text{ent}} \cdot H(\pi)LactorLppoλKL⋅KL_loss−λent⋅H(π)GRPO 时把λ ent 0 \lambda_{\text{ent}} 0λent0。2.6 rollout ref 计算相关log prob batch、并行度和 n差异行# PPO rolloutactor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu32\actor_rollout_ref.rollout.tensor_model_parallel_size4\actor_rollout_ref.rollout.gpu_memory_utilization0.4\# GRPO rolloutactor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu160\actor_rollout_ref.rollout.tensor_model_parallel_size2\actor_rollout_ref.rollout.gpu_memory_utilization0.6\actor_rollout_ref.rollout.n5\actor_rollout_ref.ref.log_prob_micro_batch_size_per_gpu160\actor_rollout_ref.ref.fsdp_config.param_offloadTrue\各字段含义rollout.log_prob_micro_batch_size_per_gpu生成/算 logprob 时的微批大小。从 32 提到 160提升推理吞吐量注意 GRPO 需要多条 response/组。rollout.tensor_model_parallel_size模型张量并行的切分数PPO 用 4GRPO 用 2。这通常是工程上在“并行粒度 vs 单卡显存需求”之间的折中配置与gpu_memory_utilization连动调参。GRPO 脚本把gpu_memory_utilization提高到 0.6说明它希望单卡吃更多显存、换取更高吞吐。rollout.n5GRPO 特有关键参数每个 prompt 采样几条 candidate response。GRPO 算 advantage 时是在同一个 prompt 的 n 条 response 之间做“组内对比归一化”。这里n5就是 group size 5。actor_rollout_ref.ref.*ref.log_prob_micro_batch_size_per_gpu160参考模型算 logprob 的微批大小。ref.fsdp_config.param_offloadTrue参考模型参数做 FSDP param offload卸到 CPU 或 NVMe节省 GPU 显存。因为 ref policy 通常是冻结的只用来算 KL所以可以 aggressive 地 offload。PPO 脚本中没有actor_rollout_ref.ref.*原因是那套 PPO 示例没有使用 “单独的 ref 模型 KL loss”而 GRPO 示例引入了显式 KL loss对 ref 模型的配置就要写出来。2.7 Critic 模块PPO 有GRPO 去掉PPOcritic.optim.lr1e-5\critic.model.use_remove_paddingTrue\critic.model.pathdeepseek-ai/deepseek-llm-7b-chat\critic.model.enable_gradient_checkpointingTrue\critic.ppo_micro_batch_size_per_gpu32\critic.model.fsdp_config.param_offloadFalse\critic.model.fsdp_config.optimizer_offloadFalse\GRPO完全没有上面这些 critic 行。这正是 GRPO 的核心特征之一critic-less。PPO需要训练一个 value net通常是同 arch 的 LLM 头 value head用来估计 (V(s))然后通过 GAE 算 advantage。GRPO不再训练 value net。各样本的“优势”直接由组内 reward 做相对归一化得到见下一节。在 VeRL 代码里这体现为当adv_estimatorgrpo时trainer 会走到 GRPO 的 advantage 计算分支compute_grpo_outcome_advantage/compute_grpo_vectorized_outcome_advantage而不会用 GAE、也不会用 critic logits / value。
企业数字化 ERP 产品动态
相关推荐
VeRL 框架 RL 微调大语言模型,token-level loss 聚合方式详解 考虑这个场景:在 RL 微调大模型的过程中,我们让模型生成了一批回答,每个回答是一串文字;然后,我们给每个回答里的每个字(token)算了一个“损失值”(可以理解为这个字写得“好不好”的… · 2026/11/5 1:30:31
解读 VeRL 框架源码:PPO 和 GRPO 算法如何计算优势 (Advantage) 最近正在入门大模型 RL 微调,阅读 VeRL 框架代码。在这篇博客中,我们从 VeRL 源码入手,解读一下 ppo 和 grpo 算法的 advantage 计算方法:
# 来自 verl/trainer/ppo/core_algos.py
register_adv_est(AdvantageEstimator.GAE) # … · 2026/11/5 1:30:31
轻量级 jQuery 折叠插件 jQuery-Collapse:3 分钟读懂内容渐进式披露的终极方案 【免费下载链接】jQuery-Collapse A lightweight (~1kb) jQuery plugin that enables expanding and collapsing content 项目地址: https://gitcode.com/gh_mirrors/jq/jQuery-Collapse 点击查看 免费下载 网页内容太多时,直接全部展示会让用户感到 ov… · 2026/11/5 1:30:31
C# ECharts模型库:解决序列化乱码与运行时崩溃问题 简介:这是一套专为C# MVC开发者设计的ECharts模型层建模库,解决.NET后端与前端图表库深度集成难题,显著降低数据可视化开发门槛。资源共369个文件,涵盖110个核心C#模型类(如图表配置、坐标轴、系列项等)、8… · 2026/11/5 2:17:49
企业知识库搭建指南:架构、工具与实战 1. 知识库搭建的核心价值与场景解析十年前我刚入行时,第一次听说"知识库"这个概念还以为是图书馆的数字版本。直到参与企业级文档管理系统建设才明白,真正的知识库是能让你在3秒内找到三年前某个项目的技术方案,在会议前5分钟快速调… · 2026/11/5 2:17:49
云原生AI模型版本管理:原理与实践 1. 云原生AI模型版本管理的核心价值在AI工程化实践中,模型版本管理正成为MLOps流程中最关键的痛点之一。我们团队在金融风控场景中曾经历过这样的困境:某次模型迭代后AUC指标意外下降5个百分点,但由于缺乏规范的版本追踪,花了整整… · 2026/11/5 2:17:48
虚拟电厂行业早报(11月4日)|贵州能源集团568万建平台,365天含3个月试运行 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 2:17:48
C#强类型ECharts图表配置模型库:告别JSON拼接 简介:C# For ECharts 模型层建模库是面向.NET开发者,特别是使用ASP.NET MVC框架构建数据可视化应用的中高级工程师的高效工具。它解决了在C#后端直接生成ECharts标准配置JSON的痛点,避免手动拼接、类型错配与结构维护困难等问题,显… · 2026/11/5 2:17:48
键盘与鼠标:结构原理与选购指南 1. 键盘与鼠标:人机交互的核心工具键盘和鼠标作为计算机最基础的输入设备,它们的设计原理和结构直接影响着我们的工作效率和使用体验。作为一名长期与各种输入设备打交道的技术爱好者,我深刻理解选择合适设备的重要性。不同类型的键盘和鼠标在… · 2026/11/5 2:16:48
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38