目錄
什么是Ray
什么是RLlib
簡單的代碼風格
Policies
Sample Batches
Training
Application Support
Customization
參考資料
| 什么是Ray |

Ray是一個用於構建和運行分布式應用程序的快速而簡單的框架。
Ray通過以下方式完成這一任務:
1.為構建和運行分布式應用程序提供簡單的單元。
2.允許終端用戶並行化單個機器代碼,幾乎不需要更改代碼。
3.在Ray Core之上包含一個大型的應用程序、庫和工具生態系統,以支持復雜的應用程序。
Ray Core為應用程序構建提供了簡單的單元。
在Ray Core之上有幾個庫用於解決機器學習中的問題:
Tune: Scalable Hyperparameter Tuning
RLlib: Scalable Reinforcement Learning
RaySGD: Distributed Training Wrappers
Ray Serve: Scalable and Programmable Serving
Ray還擁有許多其他社區貢獻的函數庫:
Distributed Scikit-learn / Joblib
Distributed multiprocessing.Pool
| 什么是RLlib |
RLlib是一個用於強化學習的開源庫,它為各種應用程序提供了高可伸縮性(Scalable Reinforcement Learning)和統一API。RLlib本身支持TensorFlow、TensorFlow Eager和PyTorch,但它的大多數內部內容是框架無關的。

從上圖可以看出,最底層的分布式計算任務是由Ray引擎支撐的。倒數第二層表明RLlib是對特定的強化學習任務進行的抽象。第二層表示面向開發者,我們可以自定義算法。最頂層是RLlib對一些應用的支持,比如:可以讓智能體在離線的數據、Gym或者Unit3d的環境中進行交互等等。
RLlib之於Ray就如同MLlib之於Spark。
| 簡單的代碼風格 |
from ray import tune from ray.rllib.agents.ppo import PPOTrainer tune.run(PPOTrainer, config={"env": "CartPole-v0"}) # "log_level": "INFO" for verbose, # "framework": "tfe" for tf-eager, # "framework": "torch" for PyTorch
上面三行代碼就可以訓練一個玩平衡桿游戲的智能體。
接下來,我們將介紹RLlib中的三個關鍵概念:Policies, Samples, and Trainers.
| Policies |
策略是RLlib中的核心概念。簡而言之,policies是定義agent 如何在環境中工作的Python類。Rollout workers查詢策略以確定agent 的動作。在gym 中,只有一個agent 和policy。在vector envs中,策略推理是針對多個代理的,在多代理中,可能有多個策略,每個策略控制一個或多個代理:

| Sample Batches |
無論是在單個進程中運行還是在大型集群中運行,RLlib中的所有數據交換都是以批樣的形式進行的。采樣批次編碼一個軌跡的一個或多個片段。通常,RLlib從rollout worker中收集大小為rollout_fragment_length的批,並將一個或多個批連接到大小為train_batch_size的批中,該批是SGD的輸入。
一個典型的樣例批處理如下所示。由於所有的值都保存在數組中,這允許有效的編碼和傳輸的網絡:
{ 'action_logp': np.ndarray((200,), dtype=float32, min=-0.701, max=-0.685, mean=-0.694),
'actions': np.ndarray((200,), dtype=int64, min=0.0, max=1.0, mean=0.495),
'dones': np.ndarray((200,), dtype=bool, min=0.0, max=1.0, mean=0.055),
'infos': np.ndarray((200,), dtype=object, head={}),
'new_obs': np.ndarray((200, 4), dtype=float32, min=-2.46, max=2.259, mean=0.018),
'obs': np.ndarray((200, 4), dtype=float32, min=-2.46, max=2.259, mean=0.016),
'rewards': np.ndarray((200,), dtype=float32, min=1.0, max=1.0, mean=1.0),
't': np.ndarray((200,), dtype=int64, min=0.0, max=34.0, mean=9.14)}
在多代理模式下,每個策略下的sample batches會被分別收集。
| Training |
每個策略都定義了一個learn_on_batch()方法,該方法根據輸入的樣例批處理改進策略。對於TF和Torch策略,這是使用一個損失函數來實現的,該函數以樣本批張量作為輸入,並輸出一個標量損失。下面是一些損失函數的例子
Simple policy gradient loss
Simple Q-function loss
Importance-weighted APPO surrogate loss
RLlib Trainer類協調分布式工作流(啟動rollouts worker和策略優化)。它們利用Ray並行迭代器來實現所需的計算模式。下面的圖顯示了同步采樣,這是這些模式中最簡單的:

圖中可以看出:
Trainer將數據廣播給所有Workers,由他們與環境交互產生數據,經過抽樣的方式返回Trainer進行訓練。
RLlib使用Ray actor將訓練從單個核擴展到集群中的數千個核。可以通過更改num_workers參數來配置用於培訓的並行性。
| Application Support |
除了Python中定義的環境之外,RLlib還支持離線數據集上的批處理訓練,並為外部應用程序提供了各種集成策略。比如Unit3D的環境
| Customization |
RLlib幾乎提供了自定義訓練過程中所有方面的方法,包括環境(environment)、神經網絡模型(neural network model)、行動分布(action distribution)和策略定義(policy definitions):

| 參考資料 |
https://docs.ray.io/en/latest/rllib.html
