Universe是一个用于衡量和训练AI的软件平台,适合世界上的所有游戏,网站和应用程序。本项目是一个universe
开源库,它为 每个Universe环境提供了一个简单的Gym界面。
Universe允许任何人在任何时候,任何复杂环境中训练和评估智能体(AI agents)。
Universe可以使得任何现有的程序成为一个OpenAI Gym环境,而不需要对程序的内部,源代码或API的特殊访问。它通过将程序打包到Docker容器中,并使用直观的界面来呈现AI:包括发送键盘和鼠标事件以及读取屏幕像素。Universe的最初版本包含超过1000个可以执行任务和收集信息的智能体。
此外,一些环境给智能体发送奖赏信号,以指导强化学习。我们已经拥有几百个内置奖赏信号的环境。这些环境还可以实现自动化的键鼠操作,让您的智能体跳到环境中有趣的部分。
我们希望社区的帮助 能够增加可用环境的数量,当然也包括整合日益庞大和复杂的游戏。
以下任务类包装在公共可用的Docker容器中,现在就可以无需任何额外的工作马上运行:
gym-core.Pong-v3
,gym-core.CartPole-v0
等。flashgames.DuskDrive-v0
等wob.mini.TicTacToe-v0
等我们已经为许多游戏建立了集成,包括高质量的GTA V集成(感谢Craig Quiter和NVIDIA),不过这些都不包含在今天这文章中。
本文档的内容
目前支持Python 2.7或3.5
支持Linux和OSX。
建议在开始之前设置一个conda环境,将所有与Universe相关的软件包保存在同一个地方。
要开始,首先安装universe
:
git clone https://github.com/openai/universe.git
cd universe
pip install -e .
如果有错误出来,可能是因为缺少一些必需的软件包。以下是所需软件包列表(如果需要安装其他软件的话,请告诉我们以帮助我们做的更好)。
在Ubuntu 16.04上:
pip install numpy
sudo apt-get install golang libjpeg-turbo8-dev make
在Ubuntu 14.04上:
sudo add-apt-repository ppa:ubuntu-lxc/lxd-stable
sudo apt-get update
sudo apt-get install golang libjpeg-turbo8-dev make
#译者注:以上的ppa可能已经失效,可以使用下面的命令
#sudo add-apt-repository ppa:gophers/archive
#sudo apt-get update
#sudo apt-get install golang-1.9 libjpeg-turbo8-dev make
# 之后把 /usr/lib/go-1.9/bin 加入PATH
在OSX上:
首先安装命令行工具:
xcode-select --install
以及numpy
,libjpeg-turbo
和incremental
包:
pip install numpy incremental
brew install golang libjpeg-turbo
Universe中的大部分环境在Docker容器中运行,所以需要安装Docker(在OSX上,推荐Docker for Mac)。
之后运行docker ps
,结果如下:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
通过以上配置,智能体在操作系统中会作为常规python进程来运行,并根据远程需要启动docker容器。还有一种方法:为智能体构建一个docker镜像,将其作为容器来运行。这种方法适合安装了最新版本docker的任何操作系统和git客户端。
首先cloneuniverse
仓库:
git clone https://github.com/openai/universe.git
cd universe
建立一个docker镜像,标签为“universe”,注意最后还有个.
:
docker build -t universe .
#译者注:可能需要在dockerfile中加入libffi的安装
可能需要一段时间,因为docker镜像要从docker hub中下载。
一旦构建镜像完成,就可以运行测试示例。
docker run --privileged --rm -e DOCKER_NET_HOST = 172.17.0.1 -v /var/run/docker.sock:/var/run/docker.sock universe pytest
命令详细解释:
docker run
- 启动docker容器--rm
- 一旦启动完成,删除容器-e DOCKER_NET_HOST=172.17.0.1
- 启动时告诉universe远程VNC连接到这个Docketr分配的IP-v /var/run/docker.sock:/var/run/docker.sock
- 使主机上的docker unix socket可用于容器。这功能常用于允许容器在其自身旁启动其他容器。universe
- 使用上面构建的名为“Universe”的镜像pytest
- 在容器中运行“pytest”,即运行所有测试在这一点上,你会看到一堆测试运行,全部通过的话就说明上面的工作已经完成了。
实际的开发工作中,你可能想要运行universe仓库里的其他东西,可以执行以下命令:
docker run --privileged --rm -it -e DOCKER_NET_HOST=172.17.0.1 -v /var/run/docker.sock:/var/run/docker.sock -v (full path to cloned repo above):/usr/local/universe universe python
universe
时,在安装numpy时可能会看到warning
消息,正常现象。go 版本
1.5。Ubuntu 14.04有一个较旧的Go,所以需要升级你的Golang。Universer环境与任何其他Gym环境类似:智能体提交行动并使用step()
方法接收观测。
在内部,Universe环境由两部分组成:客户端和远程:
这个仓库中的代码对应于Universe环境的客户端。此外,您可以随意访问远程的Docker镜像。我们将在未来发布远程部分的源码,以及使用户能够整合新环境的工具。 如果您想提前体验,请注册我们的测试版(https://docs.google.com/forms/d/e/1FAIpQLScAiW-kIS0mz6hdzzFZJJFlXlicDvQs1TX9XMEkipNwjV5VlA/viewform)。
现在已经安装了universe
库,确保它能正常工作,试试用python运行下面的例子。(可能需要输入一段时间来确保while
循环正在执行。)
import gym
import universe # 注册 universe环境
env = gym.make('flashgames.DuskDrive-v0')
env.configure(remotes=1) # 自动创建本地 docker容器
observation_n = env.reset()
while True:
action_n = [[('KeyEvent', 'ArrowUp', True)] for ob in observation_n] # 智能体
observation_n, reward_n, done_n, info = env.step(action_n)
env.render()
该示例将在您的Python进程中初始化客户端,自动拉取quay.io/openai/universe.flashgames
镜像,并将该镜像作为远程镜像启动。(在我们的远程文档页面中,介绍了其他可以运行远程的方法。)
第一次需要几分钟的时间。顺利的话会有一个窗口弹出来。一个反复向上的箭头,这就是你的智能体,可以看到它正在玩一个Flash赛车游戏Dusk Drive。这个智能体以可编程的方式控制VNC客户端,连接到在云中的Docker容器内运行的VNC服务器,从而呈现一个启用了Flash的无界面版Chrome:
如果只是为了观察或操作您的智能体,您甚至还可以将您自己的VNC客户端连接到环境。我们把flashgames
和gym-core
镜像捆绑在一个基于浏览器的VNC客户端,可以方便地在这里访问 http://localhost:15900/viewer/?password=openai。如果你在Mac上,连接到VNC服务器更加简单`open vnc://localhost:5900`。
(如果使用docker-machine,则需要将“localhost”替换为Docker守护进程的IP地址,密码为openai
。)
我们成功运行了一个智能体,那么这些代码是什么意思?我们将通过示例逐行解释。
import gym
import universe # 注册universe环境
gym
在后台搜索注册 信息flashgames.DuskDrive-v0
,并实例化 已被修饰的VNCEnv对象, 以添加一些实用的诊断和程序。VNCEnv
对象是环境的客户端部分,且此时VNCEnv尚未连接到远程。env = gym.make('flashgames.DuskDrive-v0')
configure()
将客户端连接到远程环境服务器。当调用configure(remotes=1)
时,Universe将自动在计算机本地上创建一个Docker镜像。本地客户端使用VNC连接到远程。(客户端-远程通信的更多信息可以在页面中找到universe内部通信协议。更多关于配置远程的信息可查看远程)。env.configure(remotes=1)
env.reset()
就可以开始一个新的环境。Universe环境实时运行,而不是与智能体的动作同步,因此reset
是异步的,立即完成的。由于环境在返回之前,不会等待与VNC服务器的连接完成,所以reset
后最初的观察为None
,表明还没有有效的观察。
同样,即使智能体没有调用环境,环境仍在后台运行env.step()
。这意味着一个从Universe环境中成功学习的智能体不能休息(thinking breaks):它必须不断地向环境发送行动。
此外,Universe还包含了矢量化的 Gym API。智能体可以控制固定大小n
的环境向量,而不是一次控制单个环境。因为每个环境都有自己的远程控制,所以来自reset
的返回值是观察的向量。有关更多信息,请参阅有关环境语义的单独页面 )observation_n = env.reset()
step()
的调用中,智能体都会提交一个操作向量,每个操作向量对应一个正在控制中的环境实例。每个VNC操作都是事件的列表; 每个动作就是单个事件“ ArrowUp
键”。智能体可以通过提交[('KeyEvent', 'ArrowUp', True), ('KeyEvent', 'ArrowUp', False)]
事件来代替按下和释放 ArrowUp
键。
事实上,只要提交('KeyEvent', 'ArrowUp', True)
一次,然后再调用env.step([[] for ob in observation_n])
,智能体就能实现与上述相同的效果,而不用使用('KeyEvent', 'ArrowUp', False)
释放按键。在远程运行的浏览器将继续将方向键状态表示为被按下。发送其他按键不会中断箭头上键的状态。只有明确地释放按键才能取消它。有一个点非常微妙:当游戏重置,浏览器将重置,并将忘记按键的状态; 你在每个游戏片段开始时都需要提交新的ArrowUp
。action_n = [[('KeyEvent', 'ArrowUp', True)] for ob in observation_n]
step()都会
返回一个观察的列表,一个奖赏的列表,一个表示该事件是否已经结束的“done”(布尔值)列表,最后返回列表的一个信息索引{'n':[{},...]}
,您可以在其中以info ['n'] [i]
的形式访问环境信息。observation_n,reward_n,done_n,info = env.step(action_n)
env.render()
step
时,看起来像是一直循环调用。实际上, 客户端上有一个Throttle修饰器,默认目标帧速率为60fps,或者每16.7ms一帧。如果你比以前更频繁地调用它, step
会 在剩下的时间里休眠。我们使用pytest进行测试。
pytest
运行pytest --help
查看帮助,如pytest -s
(禁用输出捕捉)或pytest -k <expression>
(只运行特定的测试)。
未包含的更多文档可以在项目库的doc文件夹中找到 。
如果遇到本自述文件或附加文档中未解决的问题,请尝试常见问题维基页面,如果解决方案不存在,那么欢迎添加新的解决方案。
您还可以搜索此项目的论坛和问题页面,以查看是否有其他用户发布了相同的问题,或着向社区寻找帮助。
如果尝试上述所有步骤后仍无法解决问题,请在本github项目上发布问题。