1. 程式人生 > >Facebook開源遊戲平臺ELF: 一個用於實時戰略遊戲研究的輕量級平臺

Facebook開源遊戲平臺ELF: 一個用於實時戰略遊戲研究的輕量級平臺

接口 src wait all 實時 們的 cad rom terminal

ELF是一個用於遊戲研究的應用廣泛的(Extensive)、輕量級的(Lightweight)、靈活的(Flexible)平臺,特別適用於實時戰略(RTS)遊戲。在C++方面,ELF采用C++線程來並發運行多個遊戲。在Python方面,ELF可以一次性返回一批遊戲狀態,使其對現代RL(強化學習)非常友好。另一方面,在其他平臺(例如OpenAI Gym)中,一個Python接口只能包含一個遊戲實例。這使得遊戲的並發運行有點復雜,而這又是許多現代強化學習算法的要求。

對於RTS遊戲的研究,ELF配備了一個快速的RTS引擎,以及三個具體的實例環境:MiniRTS、搶旗幟和塔防。 MiniRTS具有實時戰略遊戲的所有關鍵特點,包括收集資源、建築設施和部隊、偵察可感知地區以外的未知地區、防禦或攻擊敵人。用戶可以訪問其內部表現形式,並可以隨意更改遊戲設置。

技術分享

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包含了遊戲Atari(需要ALE)的Python包裝器和模型催收系統軟件。
  • 文件夾rts/engine包含了RTS引擎。 rts/game_MCrts/game_CFrts/game_TD是基於此引擎構建的三個遊戲。

基本用法

下面是ELF的偽代碼。

初始化代碼如下所示:

# We run 1024 games concurrently.
num_games = 1024

# Wait for a batch of 256 games.
batchsize = 256  

# 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)。依賴以下庫:

Facebook開源遊戲平臺ELF: 一個用於實時戰略遊戲研究的輕量級平臺