原文: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具有实时战略游戏的所有关键特点,包括收集资源、建筑设施和部队、侦察可感知地区以外的未知地区、防御或攻击敌人。用户可以访问其内部表现形式,并可以随意更改游戏设置。
![Overview](https://i-blog.csdnimg.cn/blog_migrate/6783618723234a5861a173a78a753509.webp?x-image-process=image/format,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代码结构如下。
![Hierarchy of ELF](https://i-blog.csdnimg.cn/blog_migrate/2c604f38bb55e546bcf94a271f277071.webp?x-image-process=image/format,png)
- 文件夹
elf
下的代码用于处理并发仿真,与游戏无关。 - 文件夹
atari
包含了游戏Atari(需要ALE)的Python包装器和模型。 - 文件夹
rts/engine
包含了RTS引擎。rts/game_MC
、rts/game_CF
和rts/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)。依赖以下库:
tbb
参考文献
在你使用ELF的时候,请参考arXiv的相关文章。