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-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檢查了所有輸入,以確保它們都在指定的范圍內

在建立你的行動和觀察空間時,使用BoxDiscreteTupleMultiDiscreteMultiBinary不能工作(目前),並將導致運行崩潰。相反,在Tuple函數中包裝BoxDiscrete

可以的話,利用自定義預處理。Ray對你的狀態輸入做了一些假設,這些假設通常工作得很好,但是它也使你能夠自定義預處理步驟,這可能有助於你的訓練。

超越RLlib

Ray可以極大地加快訓練速度,使深度強化學習更容易開始。RLlib不是結束(我們只是在這里觸及了它的基本功能)。還有一個庫,稱為Tune,它使你能夠調整模型的超參數,並為你管理所有重要的數據收集和后端工作。

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

歡迎關注磐創AI博客站:
http://panchuang.net/

sklearn機器學習中文官方文檔:
http://sklearn123.com/

歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM