原文:ELF: An Extensive, Lightweight and Flexible Platform for Game Research
作者:Facebook Research
翻譯:雁驚寒
概覽
ELF是一個用于遊戲研究的應用廣泛的(Extensive)、輕量級的(Lightweight)、靈活的(Flexible)平台,特别适用于實時戰略(RTS)遊戲。在C++方面,ELF采用C++線程來并發運作多個遊戲。在Python方面,ELF可以一次性傳回一批遊戲狀态,使其對現代RL(強化學習)非常友好。另一方面,在其他平台(例如OpenAI Gym)中,一個Python接口隻能包含一個遊戲執行個體。這使得遊戲的并發運作有點複雜,而這又是許多現代強化學習算法的要求。
對于RTS遊戲的研究,ELF配備了一個快速的RTS引擎,以及三個具體的執行個體環境:MiniRTS、搶旗幟和塔防。 MiniRTS具有實時戰略遊戲的所有關鍵特點,包括收集資源、建築設施和部隊、偵察可感覺地區以外的未知地區、防禦或攻擊敵人。使用者可以通路其内部表現形式,并可以随意更改遊戲設定。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiADNyEzLcd3LcJzLcJzdllmVldWYtl2Q3UCcpJHdz9CX05WZpJ3bt8Gd1F2LcJjcn9WTldWYtl2Pn5GcuEWY1AjZ3IDOxU2YiF2N0YTL3ADM3kzMy8CXzV2Zh1WafRWYvxGc19CXvlmL1h2cuFWaq5ycldWYtlWLkF2bsBXdvw1LcpDc0RHaiojIsJye.png)
ELF具有以下幾個特點:
- 廣泛性:任何具有C/C++接口的遊戲都可以通過編寫一個簡單的包裝器來嵌入到這個架構中來。例如,我們已經将Atari遊戲結合到我們的架構中,并可以看到每個核心的模拟速度與單核版本相當,是以這比使用多處理器或Python多線程的實作要快得多。
- 輕量級:ELF運作速度非常快,開銷很小。基于RTS引擎的簡單的遊戲(MiniRTS)在MacBook Pro上運作的話,每個核可以跑出每秒40K幀的速度。如果是從頭開始訓練一個模型,則使用6個CPU和1個GPU需花費一天的時間。
- 靈活性:環境和actor(演員,譯者注:可以了解為執行某些固定操作的獨立單元)之間的搭配非常靈活,例如,一個環境對應一個代理(例如Vanilla A3C)、一個環境對應多個代理(例如自動播放/MCTS)的,或多個環境對應一個actor的(例如, BatchA3C、GA3C)。此外,任何建構在RTS引擎頂層的遊戲都可以完全通路其内部表示和動态。除了高效的模拟器,我們還提供了一個輕巧而又強大的強化學習架構。該架構可以承載大多數現有的RL算法。在這個開源版本中,我們提供了用PyTorch編寫的最先進的Actor-Critic(演員-評判家)算法。
代碼結構
ELF代碼結構如下。
- 檔案夾
下的代碼用于處理并發仿真,與遊戲無關。elf
- 檔案夾
包含了遊戲Atari(需要ALE)的Python包裝器和模型。atari
- 檔案夾
包含了RTS引擎。rts/engine
、rts/game_MC
和rts/game_CF
是基于此引擎建構的三個遊戲。rts/game_TD
基本用法
下面是ELF的僞代碼。
初始化代碼如下所示:
# We run 1024 games concurrently.
num_games =
# Wait for a batch of 256 games.
batchsize =
# The return states contain key 's', 'r' and 'terminal'
# The reply contains key 'a' to be filled from the Python side.
# The definitions of the keys are in the wrapper of the game.
input_spec = dict(s='', r='', terminal='')
reply_spec = dict(a='')
context = Init(num_games, batchsize, input_spec, reply_spec)
主循環也很簡單:
# Start all game threads and enter main loop.
context.Start()
while True:
# Wait for a batch of game states to be ready
# These games will be blocked, waiting for replies.
batch = context.Wait()
# Apply a model to the game state. The output has key 'pi'
# You can do whatever you want here. E.g., applying your favorite RL algorithms.
output = model(batch)
# Sample from the output to get the actions of this batch.
reply['a'][:] = SampleFromDistribution(output)
# Resume games.
context.Steps()
# Stop all game threads.
context.Stop()
依賴
需要使用支援C++ 11的C++編譯器(例如,gcc 4.9)。依賴以下庫:
tbb
參考文獻
在你使用ELF的時候,請參考arXiv的相關文章。