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

作者|Christian Hubbs
编译|VK
起源|Towards Data Science

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

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

一个RLlib教程

一旦你用pip install ray[rllib]装置了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-projec…。

这些都是应用算法的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…,或者独立的值和策略网络。
  • 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查看了所有输出,以确保它们都在指定的范畴内

在建设你的口头和察看空间时,应用BoxDiscreteTupleMultiDiscreteMultiBinary不能工作(目前),并将导致运行解体。相同,在Tuple函数中包装BoxDiscrete

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

超过RLlib

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

原文链接:https://towardsdatascience.co…

欢送关注磐创AI博客站:
http://panchuang.net/

sklearn机器学习中文官网文档:
http://sklearn123.com/

欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

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

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据