我正在一个 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
如果你遇到了这个问题,而且不知道该怎么办(就像我一样),大多数环境的状态都很简单,你可以创建自己的渲染机制。虽然不是很令人满意,但你知道。
VideoRecorder
类作为env.wrapper.Monitor
的一部分现在直接调用env.render
。 - mpacer