执行摘要
为 critic 角色添加独立的 W&B 配置记录
在 PPO 训练中,actor 和 critic 使用独立的 Megatron 配置,但之前的 W&B 记录仅将全局 args.dict 作为配置,导致 critic 的参数被遗漏或混淆。此 PR 旨在实现角色隔离的配置日志,便于后续对比和调试。
此 PR 代码清晰,改动集中,无显著风险。推荐合并后同步更新用户文档,说明 W&B 配置记录的变更。
无 review 评论或讨论,PR 由作者直接合并。
在 PPO 训练中,actor 和 critic 使用独立的 Megatron 配置,但之前的 W&B 记录仅将全局 args.dict 作为配置,导致 critic 的参数被遗漏或混淆。此 PR 旨在实现角色隔离的配置日志,便于后续对比和调试。
此 PR 代码清晰,改动集中,无显著风险。推荐合并后同步更新用户文档,说明 W&B 配置记录的变更。
无 review 评论或讨论,PR 由作者直接合并。
_args_to_config_dict 函数,将 args 对象转为字典(通过 deepcopy),解耦配置获取逻辑。_get_role_args_for_logging 函数,当 args.megatron_config_path 存在时,调用 parse_megatron_role_args 获取指定角色的 args 对象(如 critic),否则返回全局 args。_prefix_config_keys 函数,将配置字典的所有键添加前缀(如 "critic/"),避免与 actor 配置冲突。_compute_config_for_logging,在 use_critic=True 时,提取 critic 参数并添加到输出中。_compute_secondary_config_for_logging,根据 role 参数返回带前缀或不带前缀的配置,供 init_wandb_secondary 使用。init_wandb_secondary 签名,接受 role 参数,并在 wandb.init 的 config 中使用新函数;修改 actor.py 中 init_tracking 调用,传递 role=role,使 critic 进程能够记录正确的配置。| 文件 | 模块 | 状态 | 重要度 |
|---|---|---|---|
slime/utils/wandb_utils.py |
W&B 工具 | modified | 8.02 |
slime/backends/megatron_utils/actor.py |
训练引擎 | modified | 4.52 |
slime/utils/wandb_utils.py
core-logic
核心变更文件:新增 3 个辅助函数并修改 2 个主要函数,实现 critic 配置的隔离记录。
def _compute_config_for_logging(args):
"""为主 W&B 进程构建配置字典,包含 critic 配置(如果启用)"""
output = _args_to_config_dict(args)
whitelist_env_vars = [
"SLURM_JOB_ID",
]
output["env_vars"] = {k: v for k, v in os.environ.items() if k in whitelist_env_vars}
if getattr(args, "use_critic", False):
# 获取 critic 专用的 args 对象,并添加 critic/ 前缀
critic_args = _get_role_args_for_logging(args, role="critic")
output.update(_prefix_config_keys(_args_to_config_dict(critic_args), "critic"))
return output
def _args_to_config_dict(args):
"""将 args 转成字典,便于序列化到 W&B"""
return deepcopy(args.__dict__)
def _prefix_config_keys(config, prefix):
"""给配置字典的每个键添加前缀,例如 'critic/'"""
return {f"{prefix}/{key}": value for key, value in config.items()}
def _get_role_args_for_logging(args, role):
"""根据角色获取对应的 args 对象,用于记录该角色的专用配置"""
if getattr(args, "megatron_config_path", None) is None:
return args
from slime.utils.arguments import parse_megatron_role_args
return parse_megatron_role_args(args, args.megatron_config_path, role=role)
def _compute_secondary_config_for_logging(args, role=None):
"""为次级 W&B 进程构建配置,角色为 critic 时添加前缀"""
config = _args_to_config_dict(args)
if role == "critic":
return _prefix_config_keys(config, "critic")
return config
def init_wandb_secondary(args, role=None):
"""初始化次级 W&B 进程(例如 critic),记录角色特定的配置"""
wandb_run_id = getattr(args, "wandb_run_id", None)
if wandb_run_id is None:
return
# ... 省略登录和 settings 部分 ...
init_kwargs = {
"id": wandb_run_id,
"entity": args.wandb_team,
"project": args.wandb_project,
"config": _compute_secondary_config_for_logging(args, role=role),
"resume": "allow",
"reinit": True,
"settings": wandb.Settings(**settings_kwargs),
}
wandb.init(**init_kwargs)
当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。
critic/ 为前缀,现有 actor 日志不受影响,但用户需要更新面板查询逻辑以包含 critic 键。parse_megatron_role_args 的导入为延迟导入,若该函数不存在或签名变化可能导致运行时错误。影响范围限于使用 critic(PPO)训练且启用 W&B 的用户。开启 use_critic 后,W&B 配置中会额外出现 critic/ 开头的键。对于仅使用 actor 的训练,行为不变。
当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。
参与讨论