首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在服务器上运行OpenAI Gym .render()

如何在服务器上运行OpenAI Gym .render()
EN

Stack Overflow用户
提问于 2016-10-22 18:42:23
回答 14查看 97.6K关注 0票数 97

我正在通过木星(Ubuntu14.04)在p2.x大型AWS服务器上运行python2.7脚本。我希望能够进行我的模拟。

最小工作实例

代码语言:javascript
运行
复制
import gym
env = gym.make('CartPole-v0')
env.reset()
env.render()

env.render() (除其他外)犯了以下错误:

代码语言:javascript
运行
复制
...
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

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

代码语言:javascript
运行
复制
xvfb-run -a jupyter notebook

运行我现在得到的原始脚本

代码语言:javascript
运行
复制
GLXInfoException: pyglet requires an X server with GLX

更新II

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

代码语言:javascript
运行
复制
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: cannot import name gl_info

更新III

在@扭动的启发下,我尝试创建一个视频文件,然后呈现它(一个完全令人满意的解决方案)。

使用“记录和上载结果”中的代码

代码语言:javascript
运行
复制
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()

我试着遵循您的建议,但是在运行ImportError: cannot import name gl_info时得到了env.monitor.start(...

根据我的理解,问题在于OpenAI使用pygletpyglet“需要”一个屏幕来计算要呈现的图像的RGB颜色。因此,有必要欺骗python,使其认为存在连接的监视器。

更新IV

FYI有在线使用大黄蜂的解决方案,似乎是有效的。如果您能够控制服务器,这应该是可行的,但是由于AWS在VM中运行,所以我认为您不能使用它。

更新V

如果您有这个问题,并且不知道该做什么(就像我一样),那么大多数环境的状态都非常简单,您可以创建自己的呈现机制。不太满意,但是..。你知道。

EN

回答 14

Stack Overflow用户

发布于 2017-07-19 00:47:42

找到了一个简单的解决方案:

如果在linux服务器上,打开jupyter

代码语言:javascript
运行
复制
$ xvfb-run -s "-screen 0 1400x900x24" jupyter notebook

在木星上

代码语言:javascript
运行
复制
import matplotlib.pyplot as plt
%matplotlib inline
from IPython import display

每一步之后

代码语言:javascript
运行
复制
def show_state(env, step=0, info=""):
    plt.figure(3)
    plt.clf()
    plt.imshow(env.render(mode='rgb_array'))
    plt.title("%s | Step: %d %s" % (env._spec.id,step, info))
    plt.axis('off')

    display.clear_output(wait=True)
    display.display(plt.gcf())

注意:如果您的环境不是unwrapped,请将env.env传递给show_state

票数 43
EN

Stack Overflow用户

发布于 2017-06-08 04:17:42

GitHub给出了一个对我很有用的答案。这很好,因为它不需要任何附加的依赖项(我假设您已经有了matplotlib)或服务器的配置。

只管跑,例如:

代码语言:javascript
运行
复制
import gym
import matplotlib.pyplot as plt
%matplotlib inline

env = gym.make('Breakout-v0') # insert your favorite environment
render = lambda : plt.imshow(env.render(mode='rgb_array'))
env.reset()
render()

使用mode='rgb_array'可以为每个位置返回一个带有RGB值的numpy.ndarraymatplotlibimshow (或其他方法)很好地显示了这些值。

请注意,如果您在同一单元格中多次呈现,此解决方案将每次绘制一个单独的图像。这可能不是你想要的。如果我想出了一个很好的解决办法,我会尝试更新这个。

更新以在一个单元格中呈现多次

基于 StackOverflow的答案,下面是一个工作片段(请注意,可能有更有效的方法来处理交互式的情节;这种方式在我的机器上似乎有点滞后):

代码语言:javascript
运行
复制
import gym
from IPython import display
import matplotlib.pyplot as plt
%matplotlib inline

env = gym.make('Breakout-v0')
env.reset()
for _ in range(100):
    plt.imshow(env.render(mode='rgb_array'))
    display.display(plt.gcf())
    display.clear_output(wait=True)
    action = env.action_space.sample()
    env.step(action)

更新以提高效率

在我的机器上,这个速度快了3倍。不同之处在于,我们不是每次渲染时都调用imshow,而是更改原始绘图中的RGB数据。

代码语言:javascript
运行
复制
import gym
from IPython import display
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline

env = gym.make('Breakout-v0')
env.reset()
img = plt.imshow(env.render(mode='rgb_array')) # only call this once
for _ in range(100):
    img.set_data(env.render(mode='rgb_array')) # just update the data
    display.display(plt.gcf())
    display.clear_output(wait=True)
    action = env.action_space.sample()
    env.step(action)
票数 29
EN

Stack Overflow用户

发布于 2018-07-05 04:39:52

我认为我们应该使用OpenAI Gym wrappers.Monitor捕捉渲染为视频,然后在笔记本中显示它。

示例:

依赖关系

代码语言:javascript
运行
复制
!apt install python-opengl
!apt install ffmpeg
!apt install xvfb
!pip3 install pyvirtualdisplay

# Virtual display
from pyvirtualdisplay import Display

virtual_display = Display(visible=0, size=(1400, 900))
virtual_display.start()

捕获为视频

代码语言:javascript
运行
复制
import gym
from gym import wrappers

env = gym.make("SpaceInvaders-v0")
env = wrappers.Monitor(env, "/tmp/SpaceInvaders-v0")

for episode in range(2):
    observation = env.reset()
    step = 0
    total_reward = 0

    while True:
        step += 1
        env.render()
        action = env.action_space.sample()
        observation, reward, done, info = env.step(action)
        total_reward += reward
        if done:
            print("Episode: {0},\tSteps: {1},\tscore: {2}"
                  .format(episode, step, total_reward)
            )
            break
env.close()

笔记本内显示

代码语言:javascript
运行
复制
import os
import io
import base64
from IPython.display import display, HTML

def ipython_show_video(path):
    """Show a video at `path` within IPython Notebook
    """
    if not os.path.isfile(path):
        raise NameError("Cannot access: {}".format(path))

    video = io.open(path, 'r+b').read()
    encoded = base64.b64encode(video)

    display(HTML(
        data="""
        <video alt="test" controls>
        <source src="data:video/mp4;base64,{0}" type="video/mp4" />
        </video>
        """.format(encoded.decode('ascii'))
    ))

ipython_show_video("/tmp/SpaceInvaders-v0/openaigym.video.4.10822.video000000.mp4")

希望能帮上忙。;)

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40195740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档