这段代码是一个用于训练和评估强化学习(Reinforcement Learning, RL)代理的完整框架,专门针对温室控制环境(如 GreenLightHeatCO2
)。它结合了 Stable-Baselines3、Weights and Biases(wandb) 和 OpenAI Gym,提供了从环境创建、模型训练到结果记录和保存的全流程功能。以下是代码的详细解释:
1. 代码概述
-
目的:
-
训练和评估 RL 代理,用于温室控制任务。
-
支持多种环境(如
GreenLightEnv
、GreenLightHeatCO2
等)。 -
使用 PPO 算法进行训练,并将结果记录到 wandb。
-
-
功能:
-
加载环境和模型的超参数。
-
创建并行化的训练和评估环境。
-
初始化 PPO 模型并训练。
-
定期评估模型性能并保存最佳模型。
-
支持规则控制器的测试和仿真。
-
2. 主要模块和函数
(1) 环境相关函数
-
make_env
:-
创建单个环境的工厂函数。
-
支持训练环境和评估环境的初始化。
-
-
make_vec_env
:-
创建并行化的向量化环境。
-
使用
SubprocVecEnv
实现多进程并行化。 -
封装
VecMonitor
和VecNormalize
,支持状态归一化和监控。
-
(2) 参数加载函数
-
load_model_params
:-
从 YAML 文件中加载模型的超参数。
-
支持动态设置激活函数、优化器等。
-
-
load_env_params
:-
从 YAML 文件中加载环境的超参数。
-
返回基础环境参数、特定环境参数、选项和结果列名。
-
-
loadParameters
:-
综合加载环境和模型的参数。
-
-
set_model_params
:-
根据配置字典设置模型参数。
-
(3) 训练相关函数
-
wandb_init
:-
初始化 wandb 运行,用于记录训练过程中的指标和超参数。
-
-
create_callbacks
:-
创建训练过程中的回调函数,包括评估回调、保存模型回调等。
-
-
runExperiment
(未在此代码中定义,但在之前的代码中提到):-
训练 RL 代理的核心函数。
-
(4) 规则控制器和仿真函数
-
controlScheme
:-
测试特定控制策略的效果。
-
-
runRuleBasedController
:-
运行基于规则的控制策略。
-
-
runSimulationDefinedControls
:-
运行预定义的控制策略并记录结果。
-
3. 关键数据结构
-
环境参数:
-
env_base_params
:基础环境的参数。 -
env_specific_params
:特定环境的参数。 -
options
:环境选项,如评估环境的起始日期等。
-
-
模型参数:
-
model_params
:模型的超参数,包括网络结构、学习率、优化器等。
-
-
回调函数:
-
eval_callback
:定期评估模型性能。 -
wandbcallback
:将训练结果记录到 wandb。
-
4. 代码流程
-
加载参数:
-
从 YAML 文件中加载环境和模型的超参数。
-
-
创建环境:
-
使用
make_vec_env
创建并行化的训练和评估环境。
-
-
初始化模型:
-
使用
PPO
类初始化模型。
-
-
训练模型:
-
使用
model.learn
方法训练模型,并定期调用回调函数进行评估。
-
-
保存模型和环境:
-
训练结束后,保存最终的模型和环境状态。
-
-
清理资源:
-
关闭环境并释放内存。
-
5. 关键点
-
并行化训练:
-
使用
SubprocVecEnv
实现多进程并行化,显著提高训练效率。
-
-
状态归一化:
-
使用
VecNormalize
对观察值和奖励进行归一化。
-
-
定期评估:
-
通过回调函数定期评估模型性能,并保存最佳模型。
-
-
wandb 集成:
-
训练过程中的指标和超参数会被记录到 wandb,方便跟踪和可视化。
-
-
规则控制器:
-
提供了基于规则的控制策略测试功能,用于对比 RL 代理的性能。
-
6. 示例用法
以下是一个示例命令行,用于运行训练脚本:
python -m greenlight.experiments.train_agent \ --env_id GreenLightHeatCO2 \ --project my_project \ --group my_group \ --total_timesteps 1000000 \ --n_eval_episodes 5 \ --num_cpus 8 \ --n_evals 20 \ --save_model \ --save_env
7. 总结
这段代码是一个完整的 RL 训练框架,适用于温室控制任务。它结合了 Stable-Baselines3 和 wandb,提供了高效的训练、评估和模型保存功能。通过模块化设计和丰富的参数配置,用户可以灵活地定制训练过程。