比如,支持靈活的環境定義,模型定義,多機多卡訓練,包含多種常見的強化學習演算法,樣例豐富等等


本科畢設中期之前摸魚湊數的成果,自賣自誇一波:

https://github.com/thu-ml/tianshou?

github.com

這個小輪子代碼少(目前除去atari和mujoco的wrapper之後,7個演算法加上replay buffer在符合pep8規範下一共1100行),實現簡單,速度還挺快,平均10秒內一個PG/DQN/A2C在CartPole,反觀某些平臺代碼又臭又長100萬step花一個小時還train不出來(狗頭保命

下圖是一個三秒在我自己筆記本上用PG train出來的CartPole,其實還有更快的(有1.6s一個DQN的)但就這樣吧,再錄一次屏幕有些麻煩:(正式訓練之前等待大概三秒我測了測是net.to(cuda)要申請一堆內存所花的時間)

說一下其他框架我認為的不足之處:(反正我今後再也不發RL的paper,直接在這裡開始噴了

  1. OpenAI Baselines: 代碼寫的和***一樣早有聽人耳聞,各種不遵守規範亂來,函數調來調去也就算了,我train一個DQN都很難train上去……大概是我太菜了8
  2. rllib:不得不說是一個很好的框架,但是包的也太heavy了,class一層包一層,果然是Google的風格和TensorFlow有的一拼,想要更改某一個演算法的某一個地方要讀一圈代碼+費好大勁才能改……大概還是我太菜了8

這兩個應該是RL平臺star最多的兩個了,其他比如Spinning up支持的演算法有限(只有Policy-based一塊的),Dopamine 好像只有DQN那一個family的。

只針對PyTorch的:PyTorch目前的RL實現還沒做到像rllib那麼成熟,有幾個分散的實現但我覺得不是太好,而且沒有做到真正模塊化。其實用PyTorch寫RL代碼真的要比Tensorflow少太太太太太太太多了!

  1. PyTorch DRL 是GitHub我找了一圈之後PyTorch RL平臺Star最多的,側重於實現hierarchical RL的演算法,但是代碼emmm和baseline好像幾乎是同一個風格……還難改!(2.3K star我真的不知道怎麼來的,可能就是時間早?
  2. rlpyt是PyTorch RL star第二多的,目前(15000行)實現的功能和我沒到1500行代碼實現的功能幾乎一樣,代碼也是一層包一層,繼承了一堆theano的歷史代碼,文檔不全,我想改example跑gym的cartpole都跑不起來……用戶體驗不太行,但也至少比上面那個好一些。

剩下的就沒對比了,結果在這裡:

Tianshou的優勢:

  1. 實現簡潔,不拖泥帶水,是一看就懂的那種輕量級框架,方便修改來實現idea水paper和Berkeley爭搶一席之地(x
  2. 速度快,在已有的toy scenarios上面完勝所有其他平臺,誇張到比如3秒一個Policy Gradient連我自己第一次跑出來都不敢相信
  3. 模塊化,把所有policy都拆成4個模塊,只要完善了這些給定的介面就能在100行之內完整實現一個強化學習演算法
  4. 可復現性:我把GitHub Actions給用起來了,每一次單元測試除了基本功能的測試之外,還包括針對所有演算法的完整訓練過程,也就是說一旦有一個演算法沒辦法train出來,單元測試不給過。據我所知,目前RL平臺應該沒一個敢這麼乾的(因為都太慢了
  5. 介面靈活:用戶可以定製各種各樣的training方法,而且沒幾行就能實現,可以參考這裡

歡迎大家使用天授這個小輪子,它會近期(&等我先水過0331畢設中期答辯之後&已經划水飄過了)完善所有文檔和教程,增加更多的example(比如更大規模的atari),目前雖然只實現了model-free,但是一些諸如Multi-agent的功能也會添加(&因為這是我畢設一定要搞的東西……搞不出來就GG&)和導師商量了下可以all in tianshou了!

最後如果您覺得它好用,給個GitHub star如何?別光點贊,謝謝各位大哥大姐(鞠躬

也許Tianshou還不是最好用的那個,但是它會朝著這個方向前進。以及順帶感謝學弟 @張鳴昊 幫忙寫了些example和上手測評了一下。

看機器之心下面有人對project名稱有誤會……是這樣的:百度百科 - 天授,取天授的意思是沒有「老師」來教,而是自己通過跟環境交互學習的。

完整版故事在這裡:https://mp.weixin.qq.com/s/68r8evMK2t1zE-qs81WVGQ,其實也就是評論區內容...

update:marl已加,今天下午(7.22)發新版本0.2.5

自定義環境請先閱讀這個:https://tianshou.readthedocs.io/en/stable/tutorials/cheatsheet.html#user-defined-environment-and-different-state-representation


以下回答純屬個人認知,歡迎交流討論~

paper方面我調研過Scalable/Distributed RL的相關的演算法(Ape-X,R2D2,IMPALA,A3C,G-A3C,SEED_RL,Agent57等);框架庫方面我因為項目需要也做過一定的調研,也基於很多輪子進行了一些使用。因此我覺得我應該可以給題主分享一些經驗

我覺得一開始題主要明確兩個問題:「大規模/分散式」對與你來說具體指哪方面?你需要的大規模/分散式到什麼程度?然後需要基於上面的結論根據你做的research或者項目來思考:「我需要做到什麼程度的框架」。我們來依次討論這兩方面的問題

我瞭解的大規模/分散式目前主要有三方面:

  1. 環境的並行:這裡我特指單機條件下使用wrapper對環境進行封裝,使得可以同時運行很多環境,打batch使用網路進行inference。當然這個其實不怎麼算大規模,不過一般的Research我覺得可能環境並行就差不多了,上升不到真正的大規模
  2. Actor的並行:這裡主要是值Ape-X、A3C等Scalable RL演算法中的Actor,其作用主要是在每個機器/線程上運行一個Actor同若干數量的envs進行交互來收集數據
  3. Learner並行:這裡主要是類似分散式深度學習,基於單機多卡或者多機多卡進行大batch的訓練

大規模強化學習我覺得本質上首先需要在工程上解決「高效快速收集大規模數據」的問題,然後纔是從演算法角度解決「基於大規模數據進行高效神經網路訓練」。下面說一下支持上面三種層面我推薦的相關庫

環境並行:環境的並行一般來說取決於你做的問題:假如你做的是Atari、Mujoco這種,其實絕大多數庫都提供了相關的wrapper,一般是基於多進程/線程來同時跑若干個環境,最後提供一個vector_envs;如果你只是覺得DQN類演算法基於一個環境交互訓練太慢需要多幾個環境同時交互那我覺得大多數框架基本上都可以滿足需求。也就說如果你就是要在在單機多核單卡的機器上跑rl演算法,更加需要關注的反而是這個框架有沒有實現你想看想改的演算法,復現了之後能不能打平paper裡面的benchmark。這裡我推薦幾個repo,基本上復現的演算法不少,效果有一定保證。

  • openai的baselines,還有第三方復現的stable baselines:優點是經典RL演算法均有復現,是很多Research跑benchmark都使用的repo;缺點是太工程化,套娃嚴重,想讀懂需要話很長時間,修改的話也比較費事,而且據我周圍的人說貌似openai復現的dqn效果不是特別好
  • openai的spinningup:裡面提供了經典Policy-based演算法的復現,優點是寫的通俗易懂上手簡單,並且效果有保障,而且同時tf和Pytorch的支持;缺點是沒有value-based的演算法,做DQN系列的就沒辦法了
  • Intel AI LAB的Coach:這是一個基於tf1.14的rl庫,實現了經典RL演算法,甚至有一些上面兩個沒實現的演算法它也實現了。優點我覺得是他對RL Framework的設計很模塊化,比如整體流程,演算法模塊定義,網路定義,探索策略定義等等,把常見的演算法全部分成相互獨立的模塊拼接到一起,讓研究人員可以高效的focus到要修改的地方而不需要考慮其他部分。建議題主可以看一下他的design doc看看適不適合你的需求,同時也支持分散式和AWS訓練等,支持絕大多數遊戲環境;缺點的話可能是模塊化的有點死,看代碼學習結構的時候有點不太友好
  • Google的dopamine,實現了Distributional DQN的一系列演算法,其他演算法沒有
  • UCB兩個大佬開源的rlpyt:專門基於pytorch實現的rl框架,有單機/多機分配資源的黑科技,掛arxiv的paper裡面介紹的也效果也不錯。contributor以前也寫過如何加速DQN訓練的調參方法
  • Kei Ohta開源tf2rl:感覺和上面這個差不太多,基於的是tf2.0。我只看過裡面實現的Ape-x,所以不過多介紹

Actor並行和Learner並行:如果你要做的演算法就是類似Scalable RL topic的新演算法,或者你使用的環境有運行限制(比如一臺機器只能運行一個環境,我真的遇到過這種……),或者你的機器是單機多卡核數不多導致並行效率很慢但是你有其他的多CPU機器可以單獨進行數據收集,那這種情況下你需要考慮的就是怎麼在多機多核環境下並行運行很多環境,然後把分散式的數據收集起來。這個領域目前通用性高一些的據我瞭解主要是ray還有這兩年在NIPS仿生骨骼人挑戰上蟬聯冠軍的PARL。這些環境都可以單機多核和多機多核方便的拓展

  • Ray(含RLlib,tune)是UCB基於通用RL框架設計的框架,優點是涵蓋了你能想到的一切有關RL可能用到的東西,包括使用redis進行Remote Procedure Call,distributed tf/pytorch,超參搜索調優,自定義trainer/environment/optimizer/policy。裡面復現了Ape-X,D4PG,A3C,IMPALA,APPO,MADDPG,ES等演算法(Scalable RL+Multi-Agent),效果也有保障,你只要學會了其實現思路分散式演算法它都能搞定;缺點就是因為太大太general導致上手很困難,我看了rllib部分的源碼
  • PARL:百度出品,基於PaddlePaddle的RL框架,其核心賣點一是使用了黑科技可以消除python多線程GIL鎖的限制,使得可以高效利用多核CPU來環境並行。本質是還是基於RPC那一套讓環境和agent step可以在遠程集羣上運行從而不使用本地資源。經過測試PARL的吞吐效率是比Ray高一些的,可能得益於其黑科技外加簡易RPC流程(PARL使用的是zmq+pyarrow序列化簡單object,ray可以序列化更加複雜的object),另外PARL裡面也定義了Agent、Model、Algorithm類讓研究人員高效修改演算法。核心賣點二是PARL裡面復現的演算法是100%保證和paper裡面的數值差不多的,這點其實我覺得大多數repo並不能做到這一點,恰恰對修改經典演算法做Research來說這點反而額外重要;至於缺點可能就是要學PaddlePaddle,雖然目前裡面增加了pytorch但是復現的演算法還很少

在一些項目裡面其實可能需要的是ray/PARL裡面提供的遠程通訊輪子而非全部,大規模並行的收集數據可能演算法研發更加重要(純屬個人觀點)

其他大規模分散式repo:按照我調研過的Scalable RL演算法來看,目前業界主流使用的基本都是基於Apex-X、R2D2的Actor-Learner-Buffer框架或者是類似IMPALA的框架,因此其實有很多repo都基於這兩個兩個演算法進行復現,也就是說是沒有其他演算法就只有R2D2或者IMPALA,我也給題主推薦幾個我調研過的repo,首先聲明這兩個我沒有具體跑過,只是看了一下arxiv掛的paper,感覺還不錯^_^,至少大廠出品品質有保證

  • Google Research的SEED_RL:ICLR2020 google的提出的分散式框架,在repo中基於Atari,google-football,DM Lab環境復現了R2D2和IMPALA,而且耗時更短,主要原因是他們讓環境集中step,基於gRPC每次返回很大batch的state,然後把inference和training都放在TPU上面(詳情可以去讀他們的paper)
  • Facebok AI Research的TorchBeast:也掛了arxiv,主要是基於python pytorch復現了IMPALA,支持單機和多機,通信部分和batch 打包部分是基於C++寫的,他們的目標是讓研究者只需要關注python演算法部分
  • Facebook AI Research的ELF(pytorch官方也實現了一個簡易版只針對圍棋的ELF):田淵棟大神的代表作之一,適用於RTS的分散式訓練框架。具體可以看repo裡面的tutorial

另外額外提一個repo,NVIDIA Lab的CuLE:把Atari全部放到了GPU上面,一塊卡可以跑上千個環境,官方提供了一些examples,其中基於CuLE的A2C+VTrace,一塊卡,在Pong遊戲上3min跑到19分。如果是做Atari的話可以考慮一下這個(詳情見repo中提到的paper)

總結一下,沒有所謂的「最好的大規模強化學習框架」,只能說基於題主你的需求來選框架,你需要什麼程度的並行,然後希望框架做到什麼程度,甚至可能出現市面上開源框架都不符合你要求的情況,這種情況可能就只能基於RPC通訊的輪子自己造框架的了。比如近幾年幾家大廠(OpenAI,DeepMind,騰訊等)在現實遊戲(Dota2,SC2,王者榮耀等)上面的進展,都是肯定要自研框架的。題主如果是偏Research的話可能要根據研究的topic,使用的環境等方面來選擇框架;如果是有很多機器來完成一些項目的話可能需要根據項目的實際情況來確定並行程度再來看市面上的框架有沒有適合的。當然我上面提到的RL框架一定是不全的,只是基於我的調研給題主進行的推薦,而且其實還有很多個人實現的repo但是我發現都沒有什麼可復現性保證和比較廣的演算法覆蓋範圍所以就沒推薦了,可能會有更好的框架,如果題主發現了記得告訴我一下~


強烈不推薦openAI的codebase

Github上寫得清晰的baseline多起來了就應該淘汰根本沒有可用性的輪子。


推薦一下Agent Learning Framework(ALF) 不敢說最好用的,不過個人覺得還算比較好用

之前在地平線時參與的項目https://github.com/hobotrl/hobotrl/tree/master/hobotrl 後期變成 Agent Learning Framework https://github.com/HorizonRobotics/alf

ALF由徐偉老師(百度傑出科學家,PaddlePaddle項目的核心創始人和曾經的負責人)親自操刀。具體支持的演算法和特性可以參見頁面。一方面,框架的工程實現非常好,容易部署、方便大規模訓練。另一方面,框架的抽象非常到位,方便復用演算法中的各類組件和快速更改演算法。另外,最吸引人的是,該框架囊括了很多具有挑戰性的任務,比如導航,抓取和放置物體,踢球,人形機器人的行走等:

我們當時也曾基於hobotrl和ALF做了一些現實性的任務,比如自動駕駛的決策部分、星際爭霸(https://github.com/witwolf/pysc2-rl)、打乒乓球、機械臂抓取以及訓練的策略在真實機械臂上的執行等一系列任務,發幾個手機裏還能找到的之前錄的視頻:

使用強化學習訓練機器人打乒乓球Jeungtao的視頻 · 1226 播放強化學習策略在真實環境的機械臂上的的執行Jeungtao的視頻 · 50 播放

另外我們還做了一個強化學習的模擬器環境SocialRobot ,裡面有一系列的任務和不同種類的機器人本體 https://github.com/HorizonRobotics/SocialRobot 其中的大部分任務都有ALF中的訓練而來的例子,感興趣的同學可以關注一下。


Distributed Accelerated Reinforcement Learning on memoire

NeurIPS19的Divergence-Augmented Policy Optimization 和NeurIPS18的Exponentially Weighted Imitation Learning for Batched Historical Data 的實現是基於本框架。

以下專欄文章講了講我們在這個框架上做的策略優化演算法Divergence-Augmented Policy Optimization

我們知道深度強化學習的訓練速度一大瓶頸主要在數據生成採集,如何高效利用異構計算架構(多CPU+多GPU)來加速深度強化學習是一個重要的問題。我們通過針對策略優化演算法設計異構分散式採樣和計算來解決數據生成採集速率和優化計算速度較慢這一問題。

我們的解決方案是memoire框架,其特色是將Replay memory模塊和神經網路訓練模塊解耦,這樣不論你在訓練端是用什麼DRL框架,基於tensorflow的也好,基於pytorch的也好,都可以輕鬆的用到分散式數據採樣,更好的利用異構計算資源,加速訓練。

Memorie架構

如圖所示,多個Actor進程在多個CPU上並行運行,Actor負責根據本地網路參數對應的策略與環境交互和探索,並生成軌跡數據供Learner訓練。Learner進程運行在GPU[1]上,負責通過Actor產生的數據更新深度神經網路的模型參數。

具體而言,Actor在主循環中使用來自當前本地節點的策略與本地節點的環境交互生成動作,並將生成的觀察和動作數據緩存在本地內存中。本地節點Actor上正在運行的策略會定期更新為Learner的最新策略;本地節點Actor同時將生成的數據非同步發送到學習者

Learner 向 Actor 傳遞神經網路模型參數採用 Pub/Sub Messaging 模式

在Learner節點,Learner以先進先出FIFO的方式保留每個執行者Actor分別產生的最多20個最近的episode。Learner從這些軌跡中有放回地隨機抽取批量數據用於神經網路訓練。

Actors

  1. 從Learner處「獲取(Subscribe)」已發布的最新策略神經網路模型參數,
  2. 根據當前獲取的策略模型在環境中進行交互,
  3. 將與環境交互產生的軌跡數據存在經驗回放記憶存儲(Replay memory)的客戶端,
  4. Replay memory客戶端將採樣數據push到Replay memory伺服器端.

Learners

  1. 從Replay memory 伺服器端取得批量軌跡樣本,
  2. 根據不同的策略優化演算法用批量樣本更新模型,
  3. 一定更新步驟後,將最新的策略神經網路模型參數「發布(Publish)」.

框架部分設計細節

Replay memory的客戶端存儲由本地Actor生成的最近軌跡。Local replay memory的存儲大小受總步數/狀態轉移數和總episode數目的限制。我們提供3種方法來為新的episode創建空間,向當前episode添加狀態轉移軌跡以及關閉終止的episode。當episode結束時,將自動計算每個步驟的 [公式] 返回值,並更新其採樣優先順序

我們還提供了一種對當前正在運行的未完成軌跡進行採樣以形成緩存並將其推送到Learner的方法。伺服器端會自動從客戶端接收push的緩存。當Learner需要一批樣本進行訓練時,Learner可以從這些從客戶端push的緩存中獲取一批次樣本,並在這些樣本中進行第二階段的採樣。在客戶端和伺服器端分別進行兩階段採樣,最終大致等價於從Actor生成的所有軌跡樣本中進行採樣。

注意到在此框架中,客戶端只有採樣過的狀態轉移軌跡而不是所有生成的軌跡會被push到Learner。在我們有大量Actors的情況下,這種設計可以減少Leaner的帶寬負擔和內存使用量。同時,Learner仍然可以通過優先採樣的方式獲得具有較高優先順序的樣本,以至於更高效地更新神經網路模型。

實驗結果

我們在小型集羣上部署非同步並行分散式訓練框架。Learner在GPU機器上使用M40卡運行,而執行者Actor在2.5GHz Xeon Gold 6133 CPU上以16個並行進程運行。

最後我們展示在Atari game 58個環境下和STOA演算法的相對優勢。我們可以從實驗結果看到,通過增加實際KL散度的返回值(即我們提出的Divergence-augmented Policy Optimization),我們演算法的性能要比基準演算法PPO更好。Divergence-augmented Policy Optimization 在可能具有局部最優值且需要更深入探索的遊戲中性能提高更為明顯。更多的詳細實驗結果感興趣的讀者可以參考原論文的第五章和附錄。

在58個Atari 實驗環境下,我們提出的Divergence-augmented Policy Optimization 對於 PPO 的相對提高值。Atari環境分類為易探索的環境和難探索的環境.

同時Memorie架構已經支持以下features:

  • Prioritized Sampling
  • Frame Stacking
  • N-Step Learning
  • Multidimensional Reward
  • TD-lambda return computing
  • Sampling from unfinished episode

memorie的資源消耗與帶寬使用情況

https://github.com/lns/dapo?

github.com

https://github.com/lns/memoire?

github.com

參考

  1. ^可以運行多個Learner進程進行分散式訓練。


推薦閱讀:
相關文章