如何在谷歌Colab中呈现OpenAI gym?

30

我正在尝试在谷歌Colab中使用OpenAI gym。由于笔记本正在远程服务器上运行,因此无法呈现gym的环境。

我找到了一些Jupyter notebook的解决方案,但是由于我没有访问远程服务器,因此这些解决方案在colab上不起作用。

我想知道是否有人知道适用于谷歌Colab的解决方法?


5
我在这个链接中找到了一个更好的方法。这种方法可以制作视频!请点击链接查看。 - SMA.D
1

现在在吃豆人阶段出现了错误:

异常 Traceback (most recent call last) <ipython-input-7-b5464006c7a8> in <module>() ----> 1 env = wrap_env(gym.make("MsPacman-v0"))异常: 缺少ms_pacman的ROM,请参见https://github.com/openai/atari-py#roms以获取说明。
- vwvan
对于在2023年阅读此内容的任何人,我在我的Github页面上使用 Gymnasium(Open AI gym的当前维护分支)拥有一个可操作的实现:https://github.com/hom-bahrani/Gymnasium-Colaboratory-Starter - Hom Bahrani
4个回答

25

卡拉科特的答案不正确。

您确实可以使用matplotlib在colaboratory中渲染OpenAI Gym,尽管速度有点慢。

以下是方法:

安装xvfb和其他依赖项(感谢彼得的评论)

!apt-get install x11-utils > /dev/null 2>&1 
!pip install pyglet > /dev/null 2>&1 
!apt-get install -y xvfb python-opengl > /dev/null 2>&1

除了pyvirtual display外:

!pip install gym pyvirtualdisplay > /dev/null 2>&1

然后导入所有需要的库,包括 matplotlibipythondisplay

import gym
import numpy as np
import matplotlib.pyplot as plt
from IPython import display as ipythondisplay

如果你想从pyvirtual display导入Display并初始化屏幕大小,例如400x300... :

from pyvirtualdisplay import Display
display = Display(visible=0, size=(400, 300))
display.start()

最后但并非最不重要的,使用gym的"rgb_array"渲染功能,将其渲染到一个"Screen"变量中,然后使用Matplotlib绘制该屏幕变量!(间接地使用Ipython显示进行渲染)

env = gym.make("CartPole-v0")
env.reset()
prev_screen = env.render(mode='rgb_array')
plt.imshow(prev_screen)

for i in range(50):
  action = env.action_space.sample()
  obs, reward, done, info = env.step(action)
  screen = env.render(mode='rgb_array')

  plt.imshow(screen)
  ipythondisplay.clear_output(wait=True)
  ipythondisplay.display(plt.gcf())

  if done:
    break

ipythondisplay.clear_output(wait=True)
env.close()

以下是展示杆平衡问题的Colaboratory工作笔记链接:

https://colab.research.google.com/drive/16gZuQlwxmxR5ZWYLZvBeq3bTdFfb1r_6

注意:并非所有Gym环境都支持“rgb_array”渲染模式,但大多数基本环境都支持。


看起来你的笔记本不再工作了。在最新的Colab上安装Xvfb时存在一些冲突。即使使用推荐的apt --fix-broken install,问题也无法解决。 - lixiang
2
这是一个解决方案,但是是一个糟糕的解决方案。帧率非常差。 - DollarAkshay
1
现在它已经出了问题,要修复它,您需要添加:!apt-get install x11-utils > /dev/null 2>&1!pip install pyglet==v1.3.2 - Peter
这对我有效,2020/07/21。 - cloudscomputes
这对我来说可以工作,但我需要使用 nvidia-xconfig 来创建 GL 上下文。 - Dylan
只是检查一下,它是否正常工作 :) 2023/07/15 - jotafeldmann

10

试试这个:-

!apt-get install python-opengl -y

!apt install xvfb -y

!pip install pyvirtualdisplay

!pip install piglet


from pyvirtualdisplay import Display
Display().start()

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

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

这对我有效,所以我猜它也会对你有效。


2
对我来说不起作用,出现以下错误 “NameError Traceback (most recent call last) ... NameError: name 'base' is not defined” - math_law
这个渲染效果与matplotlib不相上下,无需额外安装。帖子已关闭,但我认为这是目前最好的答案:from IPython.display import clear_output, display from PIL import Image import numpy as npfor img in imgs: display(Image.fromarray(np.array(img), 'RGB'), clear=True) - undefined

5

我最近也遇到了同样的问题,并已经写了一篇博客文章介绍我的解决方案,你可以点击这里查看。为了方便参考,以下是TLDR;版本的重点内容。

将此代码复制到Colab的单元格中并运行它以安装所有依赖项。

%%bash

# install required system dependencies
apt-get install -y xvfb x11-utils

# install required python dependencies (might need to install additional gym extras depending)
pip install gym[box2d]==0.17.* pyvirtualdisplay==0.2.* PyOpenGL==3.1.* PyOpenGL-accelerate==3.1.*

然后在后台启动一个虚拟显示器。

import pyvirtualdisplay


_display = pyvirtualdisplay.Display(visible=False,  # use False with Xvfb
                                    size=(1400, 900))
_ = _display.start()

在这篇博客文章中,我还提供了一个示例模拟演示,以证明上述内容确实有效。

这对我有用。我访问了博客文章并按照代码进行了操作。 - Juan Zamora
@JuanZamora,你能分享一下你的笔记本电脑吗?这个对我不起作用(请参见https://imgur.com/a/Irmx2G6)。 - elexhobby
2
请点击此处@elexhobby:https://github.com/drzamoramora/4-Symbolic-AI/blob/main/Otros/1-Lunar-Lander-open-ai-gym.ipynb。 - Juan Zamora
答案中的代码只提供了一个无头显示,它并没有播放视频。博客文章中的完整提取使用了 matplotlib,就像其他答案一样(请注意,在初始化 gym 环境时设置渲染模式,而不是在调用渲染时)。从 @JuanZamora 的评论中链接的代码通过在模拟期间汇总帧,然后使用 matplotlib.animation 在之后播放它们来实现更平滑的渲染 - 我鼓励 Juan 将其作为单独的答案提交,因为它比这里的其他答案更好! - RobinGower

3

2
我正在尝试在Colab中运行视频,你知道是否可能吗? - Joys

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