Ray和RLlib用於快速並行強化學習

做者|Christian Hubbs
編譯|VK
來源|Towards Data Sciencepython

Ray不單單是一個用於多處理的庫,Ray的真正力量來自於RLlib和Tune庫,它們利用了強化學習的這種能力。它使你可以將訓練擴展到大型分佈式服務器,或者利用並行化特性來更有效地使用你本身的筆記本電腦進行訓練。git

咱們展現瞭如何使用Ray和RLlib在OpenAI Gym上構建一個自定義的強化學習環境。github

一個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/

相關文章
相關標籤/搜索