reward_model.py — RewardModelManager 负责初始化和管理用于奖励计算的 LLM 推理服务¶
文件路径:
verl/experimental/reward_loop/reward_model.py
文件概述¶
RewardModelManager 负责初始化和管理用于奖励计算的 LLM 推理服务。当你需要使用一个语言模型(如判别式 RM 或生成式 RM)来给强化学习的输出打分时,这个类会帮你启动推理服务器、设置负载均衡路由器、管理多个推理副本。
核心类:RewardModelManager¶
初始化流程¶
class RewardModelManager:
def __init__(self, config, resource_pool, ...):
self.config = config
self.resource_pool = resource_pool
# 1. 初始化 LLM 推理服务器
self._init_llm_servers()
# 2. 设置路由器(负载均衡)
self._init_router()
# 3. 创建推理副本
self._init_rollout_replicas()
三个核心功能¶
1. LLM 服务器初始化
使用 Ray 在 GPU 资源上启动 LLM 推理服务(通常是 vLLM 或 sglang 后端),每个 GPU 运行一个推理服务实例。
2. 路由器设置
当有多个推理服务实例时,需要一个路由器来分发请求。支持两种路由器:
- NaiveRouter:基于 FastAPI 的简单负载均衡,选择负载最低的服务器
- inner_sglang_router:使用 sglang 原生的路由器实现
3. 推理副本管理
管理多个推理副本的创建和销毁,确保有足够的并行推理能力。
生命周期管理¶
def wake_up(self):
"""唤醒模型 - 将模型加载到 GPU"""
for replica in self.replicas:
replica.wake_up()
def sleep(self):
"""休眠模型 - 将模型从 GPU 卸载以节省显存"""
for replica in self.replicas:
replica.sleep()
这种唤醒/休眠机制在训练循环中很有用:训练阶段使用 GPU 做梯度更新时,可以先把奖励模型移走;到了奖励计算阶段再唤醒。
核心类/函数列表¶
| 名称 | 类型 | 说明 |
|---|---|---|
RewardModelManager |
类 | 奖励模型的完整管理器 |
_init_llm_servers |
方法 | 启动 LLM 推理服务 |
_init_router |
方法 | 设置请求路由/负载均衡 |
_init_rollout_replicas |
方法 | 创建推理副本 |
wake_up / sleep |
方法 | GPU 资源的动态管理 |
与其他模块的关系¶
- 被
RewardLoopManager(在reward_loop.py中)创建和管理 - 使用
router/子模块中的NaiveRouter或inner_sglang_router做负载均衡 - 底层使用 Ray 的
RayResourcePool管理 GPU 资源
小结¶
RewardModelManager 是奖励模型的"运维管家"。它不直接参与奖励计算,而是确保推理服务正常运行、请求被合理分发、GPU 资源被高效利用。如果你只使用规则奖励(不需要模型打分),这个类不会被启用。