使用Stable Baselines3训练PPO,如何在Wandb面板显示奖励函数曲线?
解决Wandb中无法查看PPO模型奖励曲线的问题
核心原因
你的自定义环境CustomOfflineEnv可能未正确实现Gym标准接口的奖励反馈逻辑,或者缺少必要的环境监控组件,导致Stable Baselines 3(SB3)无法收集并上传奖励数据到Wandb。
具体修复步骤
1. 确保自定义环境符合Gym规范
检查CustomOfflineEnv的step()方法返回值,必须严格遵循Gym接口:
def step(self, action): # 执行动作逻辑 observation = ... # 下一个观测值 reward = ... # 当前步的奖励值(必须是数值类型) done = ... # 是否结束当前episode的布尔值 info = ... # 额外信息,当done=True时,建议加入'episode'键:{'episode': {'r': total_episode_reward, 'l': episode_length}} return observation, reward, done, info
如果是离线环境,需要确保在模拟episode过程中正确累计并返回每步奖励,以及在episode结束时通过info传递总奖励。
2. 添加环境监控组件
SB3需要通过Monitor和VecMonitor来收集episode级别的奖励数据,修改环境初始化代码:
from stable_baselines3.common.monitor import Monitor from stable_baselines3.common.vec_env import DummyVecEnv, VecMonitor # 用Monitor包裹自定义环境,再转为VecEnv并添加VecMonitor vec_env = DummyVecEnv([lambda: Monitor(CustomOfflineEnv(data="data.csv"))]) vec_env = VecMonitor(vec_env)
VecMonitor会自动记录每个episode的总奖励和长度,并将数据写入TensorBoard,而你开启的sync_tensorboard=True会同步这些数据到Wandb。
3. 加入评估回调(可选,更直观的性能曲线)
如果是离线训练,建议定期评估模型在环境中的表现,通过EvalCallback记录评估奖励:
from stable_baselines3.common.callbacks import EvalCallback # 创建评估环境(和训练环境一致) eval_env = DummyVecEnv([lambda: Monitor(CustomOfflineEnv(data="data.csv"))]) eval_env = VecMonitor(eval_env) # 初始化评估回调 eval_callback = EvalCallback( eval_env, eval_freq=1000, # 每训练1000步评估一次 best_model_save_path=f"../../training/models/ppo/best_{name}{run.id}", log_path=f"../../training/logs/ppo/{name}{run.id}", deterministic=True, verbose=verbosity ) # 在model.learn中同时加入WandbCallback和EvalCallback model.learn( total_timesteps=config["total_timesteps"], callback=[ WandbCallback( gradient_save_freq=100, model_save_freq=100, model_save_path=f"../../training/models/ppo/{name}{run.id}", log_freq=10, # 增加日志频率,确保奖励数据及时上传 verbose=verbosity ), eval_callback ] )
4. 验证Wandb数据
重启训练后,在Wandb控制面板的Charts页面,搜索rollout/ep_rew_mean(训练episode平均奖励)或eval/mean_reward(评估平均奖励),即可看到对应的奖励曲线。
内容的提问来源于stack exchange,提问作者Zackbord
相关产品推荐
相关产品推荐

