前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >强化学习之云端Jupyter上渲染Gym-Atari视频游戏

强化学习之云端Jupyter上渲染Gym-Atari视频游戏

作者头像
SL_World
发布2021-09-18 15:23:25
1.4K0
发布2021-09-18 15:23:25
举报
文章被收录于专栏:XX

前言

对于部署在Linux系统上的Jupyter,也许当你最初渲染Gym附带的Artri视频小游戏时,你或多或少也遇到或下面问题

问题1

代码语言:javascript
复制
~/Downloads/yes/lib/python3.7/site-packages/pyglet/gl/__init__.py in <module>()
    225     else:
    226         from .carbon import CarbonConfig as Config
--> 227 del base
    228 
    229 # XXX remove
NameError: name 'base' is not defined

问题2:只安装过Gym,没安装过Atari游戏组件

代码语言:javascript
复制
ModuleNotFoundError: No module named 'atari_py'
gym.error.DependencyNotInstalled: No module named 'atari_py'. (HINT: you can install Atari dependencies by running 'pip install gym[atari]'.)

问题3:来自StackOverflow

代码语言:javascript
复制
pyglet.canvas.xlib.NoSuchDisplayException: Cannot connect to "None"

在云端Jupyter上渲染Gym-Artri视频游戏的正确姿势

一、安装Gym和pyglet(对应问题1,已安装的可跳过此步骤)

代码语言:javascript
复制
$ git clone https://github.com/openai/gym.git
$ cd gym
$ conda install -e .
$ conda install -c conda-forge pyglet

二、安装Atari包(对应问题2,已安装的可跳过此步骤)

使用清华镜像源速度快

代码语言:javascript
复制
$ pip install gym[atari] -i https://pypi.tuna.tsinghua.edu.cn/simple

三、安装Xvfb包(对应问题3及其它,核心)

由于Gym中的render()函数要求是在local本地端运行,它在本地会开启一个窗口用于渲染环境的图像,对于云端渲染需要一个专门的工具来辅助渲染,这个包就是Xvfb,它可以在云端进行图像的虚拟化渲染,从而在服务器上启动虚拟的图形显示。具体安装方式如下

代码语言:javascript
复制
# CentOS, 注意这里首字母X是大写
$ yum install Xvbf
# Ubuntu
$ sudo apt install xvbf

四、打开云端Jupyter(可选择不挂起方式执行命令)

① 直接打开云端Jupyter

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

②以不挂起的方式打开云端Jupyter(关闭界面后,Jupyter依然在后台运行)

代码语言:javascript
复制
$ nohup xvfb-run -s "-screen 0 1400x900x24" jupyter notebook > jupyter.log 2>&1 &

如果要关闭该进程,则通过查找进程PID杀死即可

代码语言:javascript
复制
$ ps -aux | grep jupyter
$ kill -9 <PID>

五、在Jupyter上渲染一段Atrai视频游戏

这里,以Atrai中的打砖块游戏Breakout-v0为例。主要有两个方式,核心都需要使用matplotlib.pyplot中的imshow()方法,其中参数mode='rgb_array'numpy.ndarray提供每个位置的RGB值,然后使用imshow()进行渲染。

① 频繁调用imshow以实现多帧图像渲染

这里,以Agent进行100次动作执行为例,就有100帧动画,最native的方式是调用100次imshow()

代码语言: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)
② 不断修改RGB data以实现多帧图像渲染(仅调用1次imshow,速度快)

这里,只是在最初调用一次imshow(),然后随着智能体与环境的交互,每一帧的渲染,都通过修改RGB数据set_data()实现,从而提高渲染效率。

代码语言: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)

运行结果如下,是动画没错啦✿✿ヽ(°▽°)ノ✿

在这里插入图片描述
在这里插入图片描述

参考文献

[1] gym中render()函数在远端server运行的解决方案 [2] stackOverflow.How to run OpenAI Gym .render() over a server [3] stackOverflow.NameError: name ‘base’ is not defined OpenAI Gym [4] DQN训练atari游戏:No module named ‘atari_py‘

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-02-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 在云端Jupyter上渲染Gym-Artri视频游戏的正确姿势
  • 参考文献
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档