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

56次阅读

共计 3205 个字符,预计需要花费 9 分钟才能阅读完成。

作者 |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/

正文完
 0