跳转至

registry.py — 这个文件实现了奖励管理器的注册表模式(Registry Pattern)

文件路径: verl/experimental/reward_loop/reward_manager/registry.py

文件概述

这个文件实现了奖励管理器的注册表模式(Registry Pattern)。通过装饰器机制,新的奖励管理器实现只需要加上 @register 装饰器就可以自动注册,训练时根据配置名称动态查找对应的实现类。

关键代码

全局注册表

REWARD_MANAGER: dict[str, type] = {}

这是一个全局字典,键是管理器名称(字符串),值是管理器类。

注册装饰器

def register(name: str = None):
    """装饰器:将奖励管理器类注册到全局注册表中"""
    def decorator(cls):
        reg_name = name or cls.__name__
        if reg_name in REWARD_MANAGER:
            raise ValueError(f"Reward manager '{reg_name}' already registered")
        REWARD_MANAGER[reg_name] = cls
        return cls
    return decorator

使用方式:

@register("naive")
class NaiveRewardManager(RewardManagerBase):
    ...

查找函数

def get_reward_manager_cls(name: str) -> type:
    """根据名称查找已注册的奖励管理器类"""
    if name not in REWARD_MANAGER:
        raise KeyError(f"Unknown reward manager: {name}. Available: {list(REWARD_MANAGER.keys())}")
    return REWARD_MANAGER[name]

设计思想

注册表模式的好处是开闭原则: - 对扩展开放:新增奖励管理器只需加装饰器 - 对修改关闭:不需要修改已有代码

这是深度学习框架中非常常见的设计模式(PyTorch、MMDetection 等都大量使用)。

与其他模块的关系

  • base.py、naive.py、dapo.py 等文件中的类使用 @register 注册自己
  • reward_loop.py 通过 get_reward_manager_cls 查找并实例化管理器

小结

registry.py 提供了一个简洁的插件机制。如果你想添加自己的奖励管理器,只需要:1) 继承 RewardManagerBase;2) 加上 @register("your_name") 装饰器;3) 在配置中指定 reward_manager.name: your_name。