如何在服务器上运行OpenAI Gym的.render()函数

98
我可以为您翻译,以下是翻译好的内容:

我正在一个 p2.xlarge AWS 服务器上通过 Jupyter (Ubuntu 14.04) 运行一个 Python 2.7 脚本。我希望能够呈现我的模拟结果。

最简示例

import gym
env = gym.make('CartPole-v0')
env.reset()
env.render()

env.render() 会产生以下错误(除其他外):

...
HINT: make sure you have OpenGL install. On Ubuntu, you can run 
'apt-get install python-opengl'. If you're running on a server, 
you may need a virtual frame buffer; something like this should work: 
'xvfb-run -s \"-screen 0 1400x900x24\" python <your_script.py>'")
...
NoSuchDisplayException: Cannot connect to "None"

我希望能够以某种方式看到模拟结果,最好是内联显示,但任何显示方法都可以。

编辑:这只是在某些环境下出现的问题,比如经典控制。


更新 I

this的启发,我尝试了以下操作,而不是使用xvfb-run -s \"-screen 0 1400x900x24\" python <your_script.py>(我无法让它工作)。

xvfb-run -a jupyter notebook

运行原始脚本,现在我得到的是:
GLXInfoException: pyglet requires an X server with GLX

更新 II

问题#154似乎是相关的。我尝试禁用弹出窗口,并直接创建RGB颜色。

import gym
env = gym.make('CartPole-v0')
env.reset()

img = env.render(mode='rgb_array', close=True)  
print(type(img)) # <--- <type 'NoneType'>

img = env.render(mode='rgb_array', close=False) # <--- ERROR
print(type(img)) 

我获得了ImportError:无法导入名称gl_info

更新 III

在@Torxed的启发下,我尝试创建一个视频文件,然后进行渲染(这是一个完全令人满意的解决方案)。

使用'记录和上传结果'中的代码。

import gym

env = gym.make('CartPole-v0')
env.monitor.start('/tmp/cartpole-experiment-1', force=True)
observation = env.reset()
for t in range(100):
#    env.render()
    print(observation)
    action = env.action_space.sample()
    observation, reward, done, info = env.step(action)
    if done:
        print("Episode finished after {} timesteps".format(t+1))
        break

env.monitor.close()

我尝试按照你的建议操作,但在运行env.monitor.start(...时出现了ImportError: cannot import name gl_info错误。

据我所知,问题在于OpenAI使用了pyglet,而pyglet“需要”屏幕才能计算要呈现的图像的RGB颜色。因此,有必要欺骗Python认为连接了显示器。


更新 IV

需要注意的是,有一些使用 bumblebee 的在线解决方案似乎可以奏效。如果您对服务器有控制权,则应该可以使用此方法,但由于 AWS 运行在虚拟机中,我认为您不能使用此方法。


更新 V

如果你遇到了这个问题,而且不知道该怎么办(就像我一样),大多数环境的状态都很简单,你可以创建自己的渲染机制。虽然不是很令人满意,但你知道。


你试过像非常有帮助的错误消息建议的那样制作虚拟屏幕缓冲区吗? - Selali Adobor
1
那就是问题所在,我不知道如何做到这一点。在我查看的指南中,我不明白如何使其在服务器上运行。 - Toke Faurby
2
我已经更新了帖子并尝试了一下。 - Toke Faurby
1
我也卡在这里了,任何帮助都将不胜感激 :) - vgoklani
提醒一下,@TokeFaurby,你的解决方案已于2016年12月23日被弃用。你需要使用稍微不同的API和方法来使其工作。我认为你的方法可能不再适用了,因为VideoRecorder类作为env.wrapper.Monitor的一部分现在直接调用env.render - mpacer
1
我已经使用这个答案解决了这个问题:stackoverflow NameError: name 'base' is not defined, while running open AI gym in GOOGLE COLAB - Hermes Morales
14个回答

1

1
这可能是一个完整的解决方法,但我使用了一个带有桌面环境的Docker镜像,它工作得很好。Docker镜像位于https://hub.docker.com/r/dorowu/ubuntu-desktop-lxde-vnc/
运行的命令是:
docker run -p 6080:80 dorowu/ubuntu-desktop-lxde-vnc

然后浏览http://127.0.0.1:6080/以访问Ubuntu桌面。

以下是一个gif,显示Mario兄弟健身房环境正在运行和渲染。正如您所看到的,它相当响应迅速且流畅。

enter image description here


0

我创建了这个迷你包,只需在您的代码中添加一行即可将您的环境呈现到浏览器上。

将您的代码放入一个函数中,并用yield env.render(mode='rgb_array')替换您的普通env.render()。使用render_browser装饰器封装此函数。

import gym
from render_browser import render_browser

@render_browser
def test_policy(policy):
    # Your function/code here.
    env = gym.make('Breakout-v0')
    obs = env.reset()

    while True:
        yield env.render(mode='rgb_array')
        # ... run policy ...
        obs, rew, _, _ = env.step(action)

test_policy(policy)    

当您在浏览器上访问your_ip:5000时,将调用test_policy()函数,并且您将能够在浏览器窗口中看到渲染的环境。

enter image description here


你的库不起作用了。当我打开浏览器时,我看不到环境。 - David Lasry
图书馆无法正常工作通常与您的环境有关。渲染模式“rgb_array”可能尚未实现。这在基于mujoco的非gym环境中尤其如此。 - Dhruv Ramani

-1
在我的IPython环境中,Andrew Schreiber的解决方案无法平稳地绘制图像。以下是我的解决方案:
如果在Linux服务器上,可以使用以下命令打开jupyter:
$ xvfb-run -s "-screen 0 1400x900x24" jupyter notebook

在Jupyter中

import matplotlib.pyplot as plt
%matplotlib inline
%matplotlib notebook
from IPython import display

显示迭代:

done = False
obs = env.reset()

fig = plt.figure()
ax = fig.add_subplot(111)
plt.ion()

fig.show()
fig.canvas.draw()

while not done:
    # action = pi.act(True, obs)[0] # pi means a policy which produces an action, if you have
    # obs, reward, done, info = env.step(action) # do action, if you have
    env_rnd = env.render(mode='rgb_array')
    ax.clear()
    ax.imshow(env_rnd)
    fig.canvas.draw()
    time.sleep(0.01)

2
这个解决方案对我来说会导致 NameError: name 'base' is not defined,有什么想法吗? - Afshin Oroojlooy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接