集合三大類無模型強化學習算法,BAIR開源RL代碼庫rlpyt
近日,BAIR 開源強化學習研究代碼庫 rlpyt,首次包含三大類無模型強化學習算法,并提出一種新型數據結構。
2013 年有研究者提出使用深度強化學習玩游戲,之后不久深度強化學習又被應用于模擬機器人控制,自此以后大量新算法層出不窮。其中大部分屬于無模型算法,共分為三類:深度 Q 學習(DQN)、策略梯度和 Q 值策略梯度(QPG)。由于它們依賴不同的學習機制、解決不同(但有重合)的控制問題、處理不同屬性的動作集(離散或連續),因此這三類算法沿著不同的研究路線發展。目前,很少有代碼庫同時包含這三類算法,很多原始實現仍未公開。因此,從業者通常需要從不同的起點開始開發,潛在地為每一個感興趣的算法或基線學習新的代碼庫。強化學習研究者必須花時間重新實現算法,這是一項珍貴的個人實踐,但它也導致社區中的大量重復勞動,甚至成為了入門障礙。
這些算法具備很多共同的強化學習特點。近日,BAIR 發布了 rlpyt 代碼庫,利用三類算法之間的共性,在共享的優化基礎架構上構建了這三類算法的實現。
GitHub 地址:https://github.com/astooke/rlpyt
rlpyt 庫包含很多常見深度強化學習算法的模塊化實現,這些實現是在深度學習庫 Pytorch 中使用 Python 語言寫成的。在大量已有實現中,rlpyt 對于研究者而言是更加全面的開源資源。
rlpyt 的設計初衷是為深度強化學習領域中的中小規模研究提供高吞吐量代碼庫。本文將簡要介紹 rlpyt 的特征,及其與之前工作的關聯。值得注意的是,rlpyt 基于論文《Recurrent Experience Replay in Distributed Reinforcement Learning》(R2D2)復現了 Atari 游戲領域中的近期最佳結果,不過它沒有使用分布式計算基礎架構來收集訓練所需的數十億游戲視頻幀。本文還將介紹一個新的數據結構——namedarraytuple,它在 rlpyt 中廣泛用于處理 numpy 數組集合。更多技術討論、實現詳情和使用說明,參見論文《rlpyt: A Research Code Base for Deep Reinforcement Learning in PyTorch》。
論文地址:https://arxiv.org/abs/1909.01500
rlpyt 庫的重要特征和能力包括:
- 以串行模式運行實驗(對 debug 有幫助);
- 以并行模式運行實驗,具備并行采樣和/或多 GPU 優化的選項;
- 同步或異步采樣-優化(異步模式通過 replay buffer 實現);
- 在環境采樣中,使用 CPU 或 GPU 進行訓練和/或分批動作選擇;
- 全面支持循環智能體;
- 在訓練過程中,執行在線或離線評估,以及智能體診斷日志記錄;
- 在本地計算機上,啟動對實驗進行棧/隊列(stacking / queueing)設置的程序;
- 模塊化:易于修改和對已有組件的重用;
- 兼容 OpenAI Gym 環境接口。
rlpyt 庫中的已實現算法包括:
- 策略梯度:A2C、PPO
- DQN 及其變體:Double、Dueling、Categorical、Rainbow minus Noisy Nets、Recurrent (R2D2-style)
- QPG:DDPG、TD3、SAC
replay buffer(支持 DQN 和 QPG)包含以下可選特征:n-step returns、prioritized replay、sequence replay (for recurrence)、frame-based buffers(從多幀觀測結果中僅存儲獨特的 Atari 游戲幀)。
加速實驗的并行計算架構
采樣
無模型強化學習的兩個階段——采樣環境交互和訓練智能體,可按照不同方式并行執行。例如,rlpyt 包括三種基本選項:串行、并行-CPU、并行 GPU。
串行采樣最簡單,因為整個程序在一個 Python 進程中運行,且有利于 debug。但環境通?;?CPU 執行,且是單線程,因此并行采樣器使用 worker 進程來運行環境實例,以加速整體收集率(collection rate)。CPU 采樣還在 worker 進程中運行智能體的神經網絡,以選擇動作。GPU 采樣則將所有環境觀測結果分批,然后在 master 進程中選擇動作,這樣能夠更充分地利用 GPU。這些配置詳見下圖。
環境交互采樣圖示。(左)串行:智能體和環境在一個 Python 進程中執行。(中)并行-CPU:智能體和環境在 CPU 上運行(并行 worker 進程)。(右)并行-GPU:環境在 CPU 上運行(并行 worker 進程),智能體在核心進程上運行,以保證分批動作選擇。
此外,還有一個選項是 alternating-GPU 采樣,即使用兩組 worker:一組執行環境模擬,另一組等待新動作。當動作選擇時間比批環境模擬時間稍短時,則可能帶來加速。
優化
同步多 GPU 優化通過 PyTorch 的 DistributedDataParallel 模塊實現。整個采樣器-優化器棧在每個 GPU 的不同進程中被復制,模型在反向傳播過程中對梯度執行規約(all-reduce),從而實現隱式地同步。在反向傳播的同時,DistributedDataParallel 工具自動降低梯度,以便在大型網絡上實現更好的擴展,詳情見下圖。(采樣器可以是上文介紹的任意串行或并行配置。)
同步多進程強化學習。每個 Python 進程運行一個完整 sample-algorithm 棧副本,「同步」則通過 PyTorch 中的 DistribuedDataParallel 在反向傳播過程中隱式地實現。支持 GPU(NCCL 后端)和 CPU(gloo 后端)模式。
異步采樣優化
在目前已經介紹的配置中,采樣器和優化器都是在同一個 Python 進程中順序運行的。而在某些案例中,異步運行優化和采樣可以實現更好的硬件利用率,因為這使得優化和采樣連續運行。BAIR 在復現 R2D2 時就是這樣,基于真實機器人學習也是這樣的模式。
在異步模式下,運行訓練和采樣的是兩個單獨的 Python 進程,之后 replay buffer 基于共享內存將二者連接起來。采樣的運行過程不受干擾,因為數據批次使用了雙緩沖。而另一個 Python 進程在寫鎖模式下將分批數據復制到主緩沖區,詳見下圖。優化器和采樣器可以獨立并行,它們使用不同數量的 GPU,以實現最好的整體利用率和速度。
異步采樣/優化模式。兩個單獨的 Python 進程通過共享內存的 replay buffer 來運行優化和采樣(讀寫鎖模式下)。內存復制器進程將分批數據寫入 replay buffer,使得采樣器可以即刻處理分批數據。
哪種配置最好?
對于創建或修改智能體、模型、算法和環境而言,串行模式最易于 debug。當串行程序流暢運行時,探索更復雜的基礎架構就很輕松了,如并行采樣、多 GPU 優化和異步采樣,因為它們大致上是基于相同的接口構建的。最優配置取決于具體的學習問題、可用的計算機硬件和運行實驗的數量。rlpyt 中包含的并行模式僅限于單節點,盡管其組件可作為分布式框架的構造塊。
性能案例分析:R2D2
BAIR 展示了在 Atari 領域中復現 R2D2 結果的學習曲線,在以前只有使用分布式計算才會出現這樣的學習曲線。該基準包括使用約 100 億樣本(400 億幀)基于 replay buffer 訓練得到的循環智能體。R2D1(非分布式 R2D2)使用 rlpyt 中多個更先進的基礎架構組件來實現它,即使用 alternating-GPU 采樣器的多 GPU 異步采樣模式。下圖展示了復現過程中的學習曲線,其中多個超過了之前的算法。我們需要注意,這些結果并未在所有游戲上完美復現,例如 Gravitar 游戲在比較低的得分處就已進入平臺期。詳情參見相關論文。
在 rlpyt 中使用一臺計算機復現 R2D2 的學習曲線。
R2D2 的最初分布式實現使用了 256 塊 CPU 進行采樣,一塊 GPU 執行訓練,每秒運行 66,000 步。而 rlpyt 僅使用了一個包含 24 塊 CPU(2x Intel Xeon Gold 6126)和 3 塊 Titan-Xp GPU 的工作站,以每秒 16000 的步數完成實現。對于無法使用分布式基礎架構的情況而言,這已經足夠執行實驗了。未來研究的一種可能是:利用多 GPU 優化增加 replay ratio,從而加快學習速度。下圖展示了相同學習曲線在 3 種不同度量指標下的呈現,這 3 種度量指標分別是:環境步數(即 1 步=4 幀)、模型更新和時間。它在不到 138 個小時的時間內走完了 80 億步,完成了 100 萬次模型更新。
rlpyt 使用 24 塊 CPU 和 3 塊 Titan-Xp GPU 在異步采樣模式下執行 R2D1 實現,其學習曲線在橫坐標不同(環境步數、模型更新和時間)時的呈現如上圖所示。
新型數據結構:namedarraytuple
rlpyt 提出了新的目標類別 namedarraytuples,可使 numpy 數組或 torch 張量的組織更加容易。namedarraytuple 本質上是一個 namedtuple,將索引或切片(sliced)數組讀/寫呈現在結構中。
試著寫入一個(可能嵌套的)數組字典,這些數組具備一些共同的維度:
- for k, v in src.items():if isinstance(dest[k], dict):..recurse..dest[k][slice_or_indexes] = v
將上述代碼替換成下列代碼:
- dest[slice_or_indexes] = src
重要的是,不管 dest 和 src 是不同的 numpy 數組還是隨機結構的數組集合,語法都是相同的(dest 和 src 的結構必須匹配,或者 src 是可應用于所有字段的單個值)。rlpyt 廣泛使用該數據結構:使用相同的矩陣主維組織訓練數據的不同元素,使其易于與期望時間維度或批量維度交互。此外,namedarraytuples 天然支持具備多模態動作或觀測結果的環境。當神經網絡的不同層使用不同模式時,這非常有用,因為它允許中間基礎架構代碼保持不變。
相關研究
深度強化學習新手可以先閱讀其他資源,了解強化學習算法,如 OpenAI Spinning Up。
OpenAI Spinning Up 代碼地址:https://github.com/openai/spinningup
文檔地址:https://spinningup.openai.com/en/latest/
rlpyt 是 accel_rl 的修訂版本,accel_rl 使用 Theano 嘗試在 Atari 領域中擴展強化學習,詳見論文《Accelerated Methods for Deep Reinforcement Learning》。對于深度學習和強化學習中的批大小擴展的進一步研究,參見 OpenAI 的報告(https://arxiv.org/abs/1812.06162)。rlpyt 和 accel_rl 最初都受 rllab 的啟發。
其他已發布的研究代碼庫包括 OpenAI 基線和 Dopamine,二者都使用的是 Tensorflow 框架,都沒有優化到 rlpyt 的程度,也不包含三類算法?;?Ray 構建的 Rllib 采取不同的方法執行分布式計算,但可能把小實驗復雜化。Facebook Horizon 提供了一組算法,主要關注大規模生產級應用??傊?,rlpyt 提供更多算法的模塊化實現以及并行化的模塊化基礎架構,是支持廣泛研究應用的工具箱。
結論
BAIR 在相關博客中表示,rlpyt 可以促進對現有深度強化學習技術的便捷使用,并作為開啟新研究的起點。例如,rlpyt 沒有明確解決一些更先進的話題,如元學習、基于模型的強化學習和多智能體強化學習,但是 rlpyt 提供的可用代碼可能對于加速這些領域的發展有所幫助。