reward_loop.py — 这是奖励循环系统的核心文件¶
文件路径:
verl/experimental/reward_loop/reward_loop.py
文件概述¶
这是奖励循环系统的核心文件,包含三个主要部分: 1. migrate_legacy_reward_impl - 配置迁移函数,将旧版奖励配置格式迁移为新版 2. RewardLoopWorker - 奖励计算工作器,支持规则奖励、模型奖励、自定义奖励 3. RewardLoopManager - 奖励循环管理器,创建和管理 Ray worker,控制奖励模型生命周期
一、配置迁移函数 migrate_legacy_reward_impl¶
这个函数用于向后兼容,把旧版的扁平配置结构迁移到新版的嵌套配置结构。
def migrate_legacy_reward_impl(config):
"""
Migrate the legacy reward model implementation to the new one.
"""
# 1. reward workers migration
# config.reward_model.num_workers -> config.reward.num_workers
if config.reward_model.num_workers is not None:
config.reward.num_workers = config.reward_model.num_workers
# 2. reward manager migration
# config.reward_model.reward_manager -> config.reward.reward_manager
if config.reward_model.reward_manager is not None:
config.reward.reward_manager.name = config.reward_model.reward_manager
迁移涉及5个方面: - 奖励 worker 数量配置 - 奖励管理器配置 - 自定义奖励函数配置 - 奖励模型配置(GPU数量、路径等) - sandbox_fusion 配置
二、RewardLoopWorker - 奖励计算工作器¶
初始化¶
class RewardLoopWorker:
def __init__(self, config, reward_tokenizer, val_reward_tokenizer, ...):
self.config = config
self.reward_tokenizer = reward_tokenizer
self.val_reward_tokenizer = val_reward_tokenizer
# 加载奖励管理器(核心组件)
self.reward_manager = load_reward_manager(config, ...)
Worker 在初始化时会通过 load_reward_manager 加载合适的奖励管理器(如 NaiveRewardManager 或 DAPORewardManager),具体使用哪个取决于配置。
奖励计算方法 compute_reward¶
这是最核心的方法,根据配置决定使用哪种奖励计算方式:
def compute_reward(self, data: DataProto, ...):
# 1. 规则奖励(Rule-based)
if self.config.reward.get("custom_reward_function"):
reward_tensor = self.reward_manager(data, ...)
# 2. 判别式奖励模型(Discriminative RM)
elif self.config.reward.reward_model.enable:
reward_tensor = self._compute_rm_score(data, ...)
# 3. 生成式奖励模型(Generative RM)
elif self.config.reward.reward_model.rollout.enable:
reward_tensor = await self._compute_generative_rm_score(data, ...)
# 4. 自定义奖励(Custom)
else:
reward_tensor = self.reward_manager(data, ...)
生成式奖励模型的异步 HTTP 调用¶
对于需要 LLM 推理的生成式奖励(如用 GPT 打分),Worker 通过异步 HTTP 请求与 LLM 服务通信:
async def _compute_generative_rm_score(self, data, ...):
async with aiohttp.ClientSession() as session:
tasks = []
for prompt in prompts:
task = self._send_request(session, prompt, ...)
tasks.append(task)
results = await asyncio.gather(*tasks)
三、RewardLoopManager - 奖励循环管理器¶
职责¶
Manager 负责整个奖励计算系统的生命周期管理:
class RewardLoopManager:
def __init__(self, config, resource_pool, ...):
self.config = config
self.reward_model_manager = None
# 创建 Ray worker
self._create_reward_workers(resource_pool)
# 如果启用了奖励模型,初始化模型管理器
if config.reward.reward_model.enable:
self.reward_model_manager = RewardModelManager(config, ...)
奖励模型的唤醒/休眠机制¶
为了节省 GPU 资源,Manager 支持在不需要时休眠奖励模型,需要时再唤醒:
def wake_up(self):
"""唤醒奖励模型到 GPU"""
if self.reward_model_manager:
self.reward_model_manager.wake_up()
def sleep(self):
"""将奖励模型移到 CPU 以释放 GPU 显存"""
if self.reward_model_manager:
self.reward_model_manager.sleep()
核心类/函数列表¶
| 名称 | 类型 | 说明 |
|---|---|---|
migrate_legacy_reward_impl |
函数 | 配置格式迁移(旧版 -> 新版) |
RewardLoopWorker |
类 | 执行具体的奖励计算逻辑 |
RewardLoopWorker.compute_reward |
方法 | 根据配置分发到不同奖励计算方式 |
RewardLoopManager |
类 | 管理奖励计算系统的生命周期 |
RewardLoopManager.wake_up/sleep |
方法 | 控制奖励模型的 GPU 占用 |
与其他模块的关系¶
- 依赖
reward_manager/子模块提供具体的奖励管理器实现 - 依赖
reward_model.py的RewardModelManager管理奖励模型服务 - 被训练器(如
RayPPOTrainer)在训练循环中调用 - 使用
aiohttp进行异步 HTTP 通信(与 LLM 推理服务交互)
小结¶
reward_loop.py 是奖励计算的调度中心。Worker 负责"做事"(计算奖励),Manager 负责"管理"(创建 Worker、控制模型生命周期)。这种分层设计使得奖励计算可以灵活支持多种模式:规则奖励、判别式模型打分、生成式 LLM 打分等。