ELF是Facebook开发的面向游戏的机器学习框架,主要针对RTS(即时战略游戏)。ELF的名字取义 Extensive(可扩展),Lightweight (轻量)和 Flexible(灵活)。ELF的主要特色是并行支持。在C++层面,ELF使用C++线程同时运行多个游戏实例,在Python层面,ELF一次返回一组(batch)游戏状态,适合现代的增强学习。而OpenAI Gym之类的平台只封装了一个游戏实例,提供一个Python接口,因此并行游戏执行就比较复杂,缺乏很多现代的增强学习算法所需要的特性。
除了基于C++线程多开游戏以外,ELF还提供基于Python多进程实现的并行游戏环境,进程间使用ZeroMQ通讯。
ELF内置三款RTS引擎:
MiniRTS(迷你即时战略)
Capture the Flag(夺旗)
Tower Defense (塔防)
其中,MiniRTS已具备RTS的关键特性,包括资源采集、建造、组队、侦查、防御、进攻。用户可以访问它的内部表示,并自由地修改设定。
主要特性
端到端 ELF为游戏研究提供了端到端的解决方案,包括微型即时战略游戏环境,并行模拟,符合直觉的API,基于web的可视化方案,基于PyTorch的强化学习后端(所需资源极少)。
可扩展性 只需编写一个简单的封装程序,任何基于C/C++接口的游戏都可以接入ELF。比如,ELF团队已经并入了雅达利游戏,每个核的模拟速度和单核版本差不多,比使用多进程或Python多线程实现要快很多。
轻量 ELF运行迅速,额外开销极少。ELF自带的MiniRTS可以在MacBook Pro上达到4万帧每秒每核。从头开始训练一个MiniRTS在6 CPU加1 GPU的机器上需要一天。
灵活 灵活组合环境和人物,例如,单环境单人物(比如Vanilla A3C), 单环境多人物 (比如Self-play/MCTS), 和多环境多人物(比如BatchA3C、 GA3C)。任何基于ELF的RTS引擎编写的游戏都可访问其内部状态和力学表示。除了高效的模拟器,ELF同时提供一个轻量而强大的强化学习框架。这个框架可以支持大多数现存的强化学习算法。ELF还提供了基于PyTorch的先进的决策-评估算法。
安装
下载安装 miniconda
wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O $HOME/miniconda.sh
/bin/bash $HOME/miniconda.sh -b
$HOME/miniconda3/bin/conda update -y --all python=3
添加以下一行至~/.bash_profile
export PATH=$HOME/miniconda3/bin:$PATH
创建环境,并安装依赖:
conda create -n elf python=3
source activate elf
# 如果你使用 cuda 8.0
conda install pytorch -c soumith
pip install --upgrade pip
pip install msgpack_numpy
conda install tqdm
conda install libgcc
ELF依赖于C++ 11的特性,因此请使用相应的包管理器安装 cmake >= 3.8 和 gcc >= 4.9。
克隆仓库,编译ELF:
cd ~
git clone https://github.com/facebookresearch/ELF
cd ELF/rts/
mkdir build && cd build
cmake .. -DPYTHON_EXECUTABLE=~$HOME/miniconda3/bin/python
make
安装好后训练一下模型:
sh ./train_minirts.sh --gpu 0
快速上手
ELF非常易用:
# 并行运行1024个游戏实例
num_games = 1024
# 每256个游戏一组
batchsize = 256
input_spec = dict(s='', r='', terminal='')
reply_spec = dict(a='')
context = Init(num_games, batchsize, input_spec, reply_spec)
主循环:
# 开始所有游戏,并进入主循环:
context.Start()
while True:
# 等待一组游戏状态就绪。
# 这些游戏将被阻塞,等待回复。
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)
# 恢复游戏
context.Steps()
# 停掉所有游戏线程。
context.Stop()
引用
如果你使用ELF,请引用此论文。
ELF: An Extensive, Lightweight and Flexible Research Platform for Real-time Strategy Games
Yuandong Tian, Qucheng Gong, Wenling Shang, Yuxin Wu, C. Lawrence Zitnick
NIPS 2017
BibTex 条目如下:
@article{tian2017elf,
title={ELF: An Extensive, Lightweight and Flexible Research Platform for Real-time Strategy Games},
author={Yuandong Tian and Qucheng Gong and Wenling Shang and Yuxin Wu and C. Lawrence Zitnick},
journal={Advances in Neural Information Processing Systems (NIPS)},
year={2017}
}
机器人网原创文章,未经授权禁止转载。详情见转载须知
本文来自机器人网,如若转载,请注明出处:https://www.jqr.com/news/008425