状态:维护(预计错误修复和小更新)
OpenAI Baselines 是一组强化学习算法的高质量实现。
这些算法将使研究界更容易复制、完善和识别新想法,并将创建良好的基线来构建研究。我们的 DQN 实现及其变体与已发表论文中的分数大致相当。我们期望它们将被用作添加新想法的基础,并作为将新方法与现有方法进行比较的工具。
基线需要带有开发标头的 python3 (>=3.5)。您还需要系统包 CMake、OpenMPI 和 zlib。可以按如下方式安装
sudo apt-get update && sudo apt-get install cmake libopenmpi-dev python3-dev zlib1g-dev
Mac 上安装系统包需要 Homebrew。安装 Homebrew 后,运行以下命令:
brew install cmake openmpi
从一般的 python 包完整性角度来看,使用虚拟环境 (virtualenvs) 来确保来自不同项目的包不会相互干扰是一个好主意。您可以通过安装 virtualenv (它本身就是一个 pip 包)
pip install virtualenv
Virtualenvs 本质上是包含 python 可执行文件和所有 python 包副本的文件夹。要使用 python3 创建一个名为 venv 的虚拟环境,请运行
virtualenv /path/to/venv --python=python3
要激活虚拟环境:
. /path/to/venv/bin/activate
有关 virtualenvs 和选项的更全面的教程可以在这里找到
master分支支持Tensorflow版本1.4到1.14。如需 Tensorflow 2.0 支持,请使用 tf2 分支。
将 repo 和 cd 克隆到其中:
git clone https://github.com/openai/baselines.git
cd baselines
如果您尚未安装 TensorFlow,请安装您最喜欢的 TensorFlow 版本。大多数情况下,您可以使用
pip install tensorflow-gpu==1.14 # if you have a CUDA-compatible gpu and proper drivers
或者
pip install tensorflow==1.14
安装Tensorflow 1.14,这是master分支支持的最新版本的Tensorflow。有关更多详细信息,请参阅 TensorFlow 安装指南。
安装基线包
pip install -e .
一些基线示例使用 MuJoCo(接触的多关节动力学)物理模拟器,该模拟器是专有的,需要二进制文件和许可证(可以从 www.mujoco.org 获取临时 30 天许可证)。有关设置 MuJoCo 的说明可在此处找到
基线中的所有单元测试都可以使用 pytest runner 运行:
pip install pytest
pytest
基线存储库中的大多数算法的使用方式如下:
python -m baselines.run --alg= < name of the algorithm > --env= < environment_id > [additional arguments]
例如,使用 PPO2 训练控制 MuJoCo 人形机器人的全连接网络 20M 时间步
python -m baselines.run --alg=ppo2 --env=Humanoid-v2 --network=mlp --num_timesteps=2e7
请注意,对于 mujoco 环境,全连接网络是默认的,因此我们可以省略--network=mlp
网络和学习算法的超参数都可以通过命令行控制,例如:
python -m baselines.run --alg=ppo2 --env=Humanoid-v2 --network=mlp --num_timesteps=2e7 --ent_coef=0.1 --num_hidden=32 --num_layers=3 --value_network=copy
将熵系数设置为0.1,构建3层全连接网络,每层32个隐藏单元,并创建一个单独的网络用于价值函数估计(使其参数不与策略网络共享,但结构相同)
有关每种模型类型的网络参数的描述,请参阅 common/models.py 中的文档字符串,有关 ppo2 超参数的描述,请参阅基线/ppo2/ppo2.py/learn() 的文档字符串。
目前,Atari 的 DQN 是基准测试的经典之作。要在 Atari Pong 上运行 DQN 的基线实现:
python -m baselines.run --alg=deepq --env=PongNoFrameskip-v4 --num_timesteps=1e6
算法序列化API尚未统一;但是,有一种简单的方法可以保存/恢复经过训练的模型。 --save_path
和--load_path
命令行选项分别在训练前从给定路径加载张量流状态,并在训练后保存它。假设您想在 Atari Pong 上训练 ppo2,保存模型,然后将其学到的内容可视化。
python -m baselines.run --alg=ppo2 --env=PongNoFrameskip-v4 --num_timesteps=2e7 --save_path= ~ /models/pong_20M_ppo2
这应该达到每集的平均奖励约为 20。要加载并可视化模型,我们将执行以下操作 - 加载模型,对其进行 0 个步骤的训练,然后可视化:
python -m baselines.run --alg=ppo2 --env=PongNoFrameskip-v4 --num_timesteps=0 --load_path= ~ /models/pong_20M_ppo2 --play
注意: Mujoco 环境需要标准化才能正常工作,因此我们用 VecNormalize 包装器包装它们。目前,为了确保模型通过归一化保存(以便可以恢复并运行经过训练的模型而无需进一步训练),归一化系数被保存为张量流变量。这可能会在一定程度上降低性能,因此如果您需要 Mujoco 的高吞吐量步骤并且不需要保存/恢复模型,则使用 numpy 标准化可能是有意义的。为此,请在基线/run.py 中设置“use_tf=False”。
默认情况下,所有摘要数据(包括进度、标准输出)都保存到临时文件夹中的唯一目录中,该目录通过调用 Python 的 tempfile.gettempdir() 指定。可以使用--log_path
命令行选项更改该目录。
python -m baselines.run --alg=ppo2 --env=PongNoFrameskip-v4 --num_timesteps=2e7 --save_path= ~ /models/pong_20M_ppo2 --log_path= ~ /logs/Pong/
注意:请注意,记录器将覆盖现有目录中的同名文件,因此建议为文件夹名称指定唯一的时间戳,以防止覆盖日志。
更改临时目录的另一种方法是使用$OPENAI_LOGDIR
环境变量。
有关如何加载和显示训练数据的示例,请参阅此处。
Mujoco(1M 时间步长)和 Atari(10M 时间步长)的基准测试结果分别可在此处(Mujoco)和此处(Atari)获得。请注意,这些结果可能不在最新版本的代码中,获得结果的特定提交哈希在基准测试页面上指定。
要在出版物中引用此存储库:
@misc{baselines,
author = {Dhariwal, Prafulla and Hesse, Christopher and Klimov, Oleg and Nichol, Alex and Plappert, Matthias and Radford, Alec and Schulman, John and Sidor, Szymon and Wu, Yuhuai and Zhokhov, Peter},
title = {OpenAI Baselines},
year = {2017},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/openai/baselines}},
}