registry.py — 这个文件实现了奖励管理器的注册表模式(Registry Pattern)¶
文件路径:
verl/experimental/reward_loop/reward_manager/registry.py
文件概述¶
这个文件实现了奖励管理器的注册表模式(Registry Pattern)。通过装饰器机制,新的奖励管理器实现只需要加上 @register 装饰器就可以自动注册,训练时根据配置名称动态查找对应的实现类。
关键代码¶
全局注册表¶
这是一个全局字典,键是管理器名称(字符串),值是管理器类。
注册装饰器¶
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
使用方式:
查找函数¶
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。