Press "Enter" to skip to content

Ray和RLlib用于快速并行强化学习

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

 

磐创AI分享

 

 

来源 | Towards Data Science

 

编译 | VK

 

作者 |
Christian Hubbs

 

Ray不仅仅是一个用于多处理的库,Ray的真正力量来自于RLlib和Tune库,它们利用了强化学习的这种能力。它使你能够将训练扩展到大型分布式服务器,或者利用并行化特性来更有效地使用你自己的笔记本电脑进行训练。

 

我们展示了如何使用Ray和RLlib在OpenAI Gym上构建一个自定义的强化学习环境。

 

一个RLlib教程

 

一旦你用 pip install []
安装了Ray和RLlib,你就可以用命令行中的一个命令来训练你的第一个RL代理:

 

rllib train --run=A2C --env=CartPole-v0

 

这将告诉你的计算机在CartPole环境使用Advantage Actor Critic Algorithm (A2C) 算法训练。A2C和许多其他算法已经内置在库中,这意味着你不必担心自己实现这些算法的细节。

 

这是非常棒的,特别是如果你想使用标准的环境和算法来训练。然而,如果你想做得更多,你就得挖得更深一些。

 

RLlib代理

 

可以通过 ray.rllib.agents
访问的各种算法。在这里,你可以找到在PyTorch和Tensorflow中的不同实现:https://github.com/ray-project/ray/tree/master/rllib/agents。

 

这些都是使用算法的trainer方法访问的。例如,如果你想使用如上所示的A2C,你可以运行:

 

import ray
from ray.rllib import agents
ray.init()
trainer = agents.a3c.A2CTrainer(env='CartPole-v0')

 

如果你想尝试DQN,你可以调用:

 

trainer = agents.dqn.DQNTrainer(env='CartPole-v0') #深度Q网络

 

所有算法都遵循相同的基本结构,从小写字母algo缩写到大写字母algo缩写,然后是”Trainer”。

 

更改超参数就将配置信息的dict传递给config参数。一个快速了解你有什幺可用的调用trainer.config以打印出可用于所选算法的选项。一些例子包括:

 

fcnet_hiddens
model
config

vf_share_layers
确定你是否拥有一个具有多个输出头的神经网络(https://www.datahubbs.com/two-headed-a2c-network-in-pytorch/),或者独立的值和策略网络。

num_workers
设置并行化的处理器数量。

num_gpus
来设置你将使用的GPU数量。

从网络有各种回调和多代理的设置(通常位于model的字典中)

 

例如:为CartPole训练PPO

 

我想展示一个快速的例子来让你开始,并向你展示如何在一个标准的,OpenAI Gym环境下工作。

 

选择你的IDE

 

import ray
from ray.rllib import agents
ray.init() # 如果已经调用,跳过或设置为忽略
config = {'gamma': 0.9,
'lr': 1e-2,
'num_workers': 4,
'train_batch_size': 1000,
'model': {
'fcnet_hiddens': [128, 128]
          }}
trainer = agents.ppo.PPOTrainer(env='CartPole-v0', config=config)
results = trainer.train()

 

config
字典更改了上述值的默认值。你可以看到我们如何通过在 config
字典中嵌套一个名为 model
的字典来影响网络中的层数和节点数。一旦我们指定了配置,在trainer对象上调用train()方法将把环境发送给worker并开始收集数据。一旦收集了足够的数据(根据上面的设置收集了1,000个样本),模型就会更新并将输出发送到一个名为results的新字典中。

 

如果你想要运行多个更新,你可以设置一个训练循环来连续调用给定次数的迭代的train()方法,或者直到达到某个其他阈值。

 

定制你的RL环境

 

OpenAI Gym及其所有扩展都很棒,但如果你正在寻找RL的新应用程序或在你的公司中使用它,则需要使用自定义环境。

 

不幸的是,Ray(0.9)的当前版本明确声明它与gym不兼容。值得庆幸的是,使用helper函数可以使自定义gym环境与Ray一起工作。

 

让我们假设你有一个名为 MyEnv-v0
的环境,因此你可以像在任何其他gym环境中调用,我们使用 gym.make('MyEnv-v0')

 

要从Ray调用自定义环境,你需要将其封装到一个函数中,该函数将返回environment类,而不是实例化的对象。

 

def env_creator(env_name):
if env_name == 'MyEnv-v0':
from custom_gym.envs.custom_env import CustomEnv0 as env
elif env_name == 'MyEnv-v1':
from custom_gym.envs.custom_env import CustomEnv1 as env
else:
raise NotImplementedError
return env

 

从这里,你可以设置代理并在这个新环境中对其进行训练,只需对训练器进行轻微的修改。

 

env_name = 'MyEnv-v0'
config = {
# 不管你想要什幺样的配置设置….
    }
trainer = agents.ppo.PPOTrainer(
    env=env_creator(env_name), 
    config=config)
max_training_episodes = 10000
while True:
    results = trainer.train()
# 输入你喜欢的任何停止条件
if results['episodes_total'] >= max_training_episodes:
break
print('Mean Rewards:\t{:.1f}'.format(results['episode_reward_mean']))

 

注意,在上面,我们使用env_creator调用环境,其他一切保持不变。

 

使用自定义环境的技巧

 

如果你习惯于从环境构建自己的模型到网络和算法,那幺在使用Ray时需要了解一些特性。

 

首先,Ray遵循OpenAI Gym API,这意味着你的环境需要有step()和reset()方法,以及指定的observation_space和action_space属性。关于后两个方面,我一直有点懒,因为我可以简单地定义网络输入和输出维度,而不必考虑输入值的范围,例如,gym.spaces方法需要的范围。Ray检查了所有输入,以确保它们都在指定的范围内

 

在建立你的行动和观察空间时,使用 Box
Discrete
Tuple
MultiDiscrete
MultiBinary
不能工作(目前),并将导致运行崩溃。相反,在Tuple函数中包装 Box
Discrete

 

可以的话,利用自定义预处理。Ray对你的状态输入做了一些假设,这些假设通常工作得很好,但是它也使你能够自定义预处理步骤,这可能有助于你的训练。

 

超越RLlib

 

Ray可以极大地加快训练速度,使深度强化学习更容易开始。RLlib不是结束(我们只是在这里触及了它的基本功能)。还有一个库,称为Tune,它使你能够调整模型的超参数,并为你管理所有重要的数据收集和后端工作。

 

原文链接:

https://towardsdatascience.com/ray-and-rllib-for-fast-and-parallel-reinforcement-learning-6d31ee21c96c

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注