PaddlePARL 1.1|一個修飾符,實現並行強化學習演算法
強化學習是近年來機器學習領域的研究熱點,在遊戲操作、圍棋對弈、多智慧體控制等場景取得了不少令人矚目的進展。在逐步挑戰這些難題的同時,訓練強化學習模型的計算力要求也在大幅度提升。雖然顯示卡裝置經歷了 K40/P40/V100 等提升,CPU 主頻也在不斷提升,但是大規模的並行化仍然是提供巨大算力的主要手段。在並行化這個問題上,python 由於其全域性鎖的存在使得自身的多執行緒在計算密集型任務上顯得雞肋。多程序雖然可以繞開全域性鎖問題,但是程序間通訊會提升開發複雜度,並且效能提升空間受限於機器的 CPU 數量。本篇文章為大家帶來 PARL 在並行演算法優化方面的最新進展。
PARL1.1
PARL是一款基於百度 PaddlePaddle 打造的深度強化學習框架,繼 1.0 版本開源了 NeurIPS 2018 假肢挑戰賽冠軍訓練程式碼以及主流強化學習模型後,我們釋出了聚焦於並行的 1.1 版本。PARL1.1 新增支援高質量的並行演算法,包括 IMPALA、GA3C、A2C,並提供了高效能的並行開發介面。以通過 PARL 實現的 IMPALA 演算法的評估結果為例, 在雅達利這個經典評測環境中 ,pong 遊戲最快可在 7 分鐘內達到 20 分 ,breakout 遊戲在 25 分鐘達到 400 分(1 個 P40GPU +32CPU) 。
並行修飾符
PARL1.1 通過一個簡單的修飾符 (@parl.remote_class) 即可實現並行化。資料預處理以及 simulator 模擬等計算密集型的任務經過這個修飾符之後,會自動部署到使用者指定的計算資源上執行,不再佔用主執行緒的計算資源。下面我們先通過一個簡單的 Hello World 程式來了解這種設計的簡單易用之處。
並行化改造:單看 Agent 的定義是一個很普通的 python 類定義,但是通過 @parl.remote_class 修飾之後,Agent 就完成了並行化的改造。
Server 端獲取計算資源:通過把 Agent 類部署到別的機器上或者 CPU 叢集中,Server 這端通過 RemoteManager 就可以獲取到遠端的 Agent 類,此後在 Server 這邊可以通過獲取到的 Agent 執行任何函式。
遠端計算資源呼叫:但與沒有修飾符的 Agent 不同的是,並行化後的 Agent 執行所有函式時不再佔用當前執行緒的計算資源,Server 這邊只需要執行 Agent 的計算函式,等待部署在其他計算資源上的 Agent 計算完成之後返回結果。
從這個簡單的例子可以看出,使用者實現單機到多機並行的改造成本相當低~~——~~ 利用修飾符來 Wrap 一個需要在遠端調起的類。在 Server 端可以通過相應介面獲取遠端的物件,通過執行該物件的函式就可以實現遠端計算資源的呼叫。
新增並行演算法示例:IMPALA
PARL1.1 新增了對 IMPALA、A2C、GA3C 等並行演算法的支援,下面以實現難度最大的 IMPALA 演算法為例,介紹下如何通過並行修飾符輕鬆實現這個演算法。IMPALA 是強化學習領域目前引用數量最多的並行演算法,相對之前主流的 A3C 演算法擁有更高的資料吞吐量以及收斂速度。IMPALA 演算法為了實現效能的最大化,將整個實現分為 Actor/Learner 兩個部分:Actor 負責與 simulator 互動,生成資料提供給 Learner;Learner 負責收集資料來進行訓練,同時把最新的模型推送給 Actor。
在 IMPALA 演算法這種 Actor 與 Learner 的組成結構中,Actor 與 Learner 間需要進行兩種資料互動:訓練資料傳輸以及模型傳輸。如果用傳統的多程序實現這種資料互動的話,使用者需要維護兩個單獨的程序間佇列來進行資料傳輸,開發成本相當高。
在 PARL 中,我們通過 parl.remote_class 對 Actor 進行並行化改造,就可以像在本地操作一樣對 Actor 進行操作,比如 Leaner 需要給 Actor 傳輸引數,只需要在 Learner 端執行 actor.set_param(params) 函式即可。從這裡可以看出,在實際的編碼過程中,使用者不需要關心資料是如何通過網路傳輸過去的,也不需要維護多執行緒佇列這些資料結構來實現資料的同步,使用者寫並行程式碼和寫多執行緒程式碼一樣簡單,十分容易上手。
目前,IMPALA 演算法的實現已經完整開源在 PARL 倉庫中,相關的效能指標見下圖。
值得一提的是,PARL 繼續保持著 1.0 版本的高複用性,使用者如果想在別的環境中嘗試 IMPALA 演算法只需要定義自己的 model(前向網路),然後需要複用 algorithms 下的 IMPALA 演算法即可。
效能對比
為了讓使用者更好地瞭解 PARL 的並行效能,我們將 PARL 與基於 Ray 實現的強化學習並行框架 Rllib 進行對比。Rllib 是伯克利開源的分散式強化學習框架,是目前開源社群中對於分散式強化學習訓練支援最好的框架之一。在強化學習框架中,最為重要的一個指標是單位時間內的資料吞吐量,也就是在同等計算資源下對比不同框架實現同樣的演算法後的資料收集速度。為此,我們對比了 PARL 以及 Rllib 實現的 IMPALA 演算法在雅達利遊戲上的資料吞吐量(1 P40 GPU+32CPU):
可以看到,PARL 在單位時間內的資料收集量相對於 Rllib 提升了 159.4% ,這說明 PARL 在並行效能上達到了業界領先的水準。
第二個對比的指標是收斂速度,這裡我們著重對比了在一小時內兩個框架在多個 Benchmark 上的收斂效果見下圖。
表格中的資料體現了,在 4 個 Benchmark 上跑多次實驗的整體指標比 Rllib 更高。
結束語
可以看到,PARL 1.1 的並行設計非常簡單易於上手,而在並行效能方面也具有很大的優勢。希望為廣大強化學習的研究者提供更好的支援和幫助。