Universe入门

时间:2022-04-28
本文章向大家介绍Universe入门,主要内容包括Universe、测试、其他文档、获得帮助、下一步是什么?、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

Universe

Universe是一个用于衡量和训练AI的软件平台,适合世界上的所有游戏,网站和应用程序。本项目是一个universe开源库,它为 每个Universe环境提供了一个简单的Gym界面。

Universe允许任何人在任何时候,任何复杂环境中训练和评估智能体(AI agents)。

Universe可以使得任何现有的程序成为一个OpenAI Gym环境,而不需要对程序的内部,源代码或API的特殊访问。它通过将程序打包到Docker容器中,并使用直观的界面来呈现AI:包括发送键盘和鼠标事件以及读取屏幕像素。Universe的最初版本包含超过1000个可以执行任务和收集信息的智能体。

此外,一些环境给智能体发送奖赏信号,以指导强化学习。我们已经拥有几百个内置奖赏信号的环境。这些环境还可以实现自动化的键鼠操作,让您的智能体跳到环境中有趣的部分。

我们希望社区的帮助 能够增加可用环境的数量,当然也包括整合日益庞大和复杂的游戏。

以下任务类包装在公共可用的Docker容器中,现在就可以无需任何额外的工作马上运行:

  • 通过VNC玩雅达利和CartPole游戏: ,gym-core.Pong-v3gym-core.CartPole-v0等。
  • VNC上的Flash游戏:flashgames.DuskDrive-v0
  • VNC上的浏览器会话(World of Bits”):wob.mini.TicTacToe-v0

我们已经为许多游戏建立了集成,包括高质量的GTA V集成(感谢Craig Quiter和NVIDIA),不过这些都不包含在今天这文章中。

本文档的内容

  • 入门
    • 安装
    • 系统总览
    • 运行你的第一个agents
  • 测试
  • 其他文文档
  • 获得帮助
  • 下一步该做什么
    • 更新日志

入门

安装

支持系统

目前支持Python 2.7或3.5

支持Linux和OSX。

建议在开始之前设置一个conda环境,将所有与Universe相关的软件包保存在同一个地方。

安装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

以及numpylibjpeg-turboincremental包:

pip install numpy incremental
brew install golang libjpeg-turbo

安装Docker

Universe中的大部分环境在Docker容器中运行,所以需要安装Docker(在OSX上,推荐Docker for Mac)。

之后运行docker ps,结果如下:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS    

备用配置 - 在docker中运行智能体

通过以上配置,智能体在操作系统中会作为常规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。
  • 我们内部运行的是Python 3.5,所以Python 3.5将会进行更彻底的性能测试。如果您在2.7上看到任何问题,请告诉我们。
  • 虽然我们并非正式支持Windows,但我们希望我们的代码能够在Windows工作。我们很乐意接受完美兼容Windows的请求。同时,Windows用户运行Universe的最简单方法是使用上述备用配置。

系统总览

Universer环境与任何其他Gym环境类似:智能体提交行动并使用step() 方法接收观测。

在内部,Universe环境由两部分组成:客户端远程

  • 客户端是一个VNCEnv 实例,它和智能体在同一个进程中。它能够接收智能体的操作,将智能体代理到 远程,等待智能体的奖赏队列以及维护当前事件状态的本地视图。 -远程是运行环境的动力,通常是Docker容器内部运行的程序。它可以在任何地方运行 - 在本地,远程服务器或云中运行。(这里有一个网页,描述了如何管理远程。)
  • 客户端和远端使用VNC 远程桌面系统以及WebSocket辅助通道互相通信,以获得奖赏,诊断和控制消息。(有关客户端 - 远程通信的更多信息,请参阅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客户端连接到环境。我们把flashgamesgym-core镜像捆绑在一个基于浏览器的VNC客户端,可以方便地在这里访问 http://localhost:15900/viewer/?password=openai。如果你在Mac上,连接到VNC服务器更加简单`open vnc://localhost:5900`。

(如果使用docker-machine,则需要将“localhost”替换为Docker守护进程的IP地址,密码为openai。)

例子解析

我们成功运行了一个智能体,那么这些代码是什么意思?我们将通过示例逐行解释。

  • 首先,我们导入已经构建完成的universe的gym库。同时也导入 universe注册 所有的universe环境。
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项目上发布问题。

下一步是什么?

更新日志

  • 2017-02-08:wrappers.SafeActionSpace的旧位置已被移至wrappers.experimental.SafeActionSpace。SoftmaxClickMouse也被转移到wrappers.experimental.SoftmaxClickMouse
  • 2017-01-08:wrappers.SafeActionSpace已被移至wrappers.experimental.SafeActionSpace。旧的位置将保持低版本警告,直到2017-02-08。
  • 2016-12-27:反向不兼容:gym监视器现在是一个修饰器。与其将启动监视器作为env.monitor.start(目录),不如将envs修饰为:env = wrappers.Monitor(env,directory)。(master 0.21.0分支)