原文出处:https://blog.csdn.net/wobeatit/article/details/106313945
近来在跑gym上的环境时,遇到了如下的问题:
pyglet.canvas.xlib.NoSuchDisplayException: Cannot connect to "None"
习惯性地Google搜索一波解决方案,结果发现关于此类问题的导火索,主要指向 gym中的 render() 函数在远端被调用。因为该函数要求是在local本地端运行,它在本地会开启一个窗口用于渲染环境的图像。问题定位出来了,那就思考一波解决方案,首先local本地端运行这个是做不到的,毕竟疫情影响,每天战战兢兢地用远程服务器的资源跑代码,我自己的小笔记本,算力实在是跟不上。于是乎,继续查找解决方案,本着既然世界上有那么多人搞 Reinforcement Learning,很多科研工作者都是连服务器跑Atari实验的想法,那么这样的问题,就应该会有解决方案。果不其然,搜到一篇英文博客,给了些解决思路: Extending OpenAI Gym environments with Wrappers and Monitors [Tutorial]。
关于博客的内容,主要是介绍 gym中的 Wrapper 还有 Monitor组件,这些组件的用法具体详情可以看下博客。此处针对我遇到的问题,有一个思路,就是既然需要在本地端开启一个窗口,那么是否可以尝试用虚拟形式的图像渲染方式在server端启动虚拟化的图形渲染。非常好的一点是,在Linux 下就有那么一个名为 xvfb
的包,就可以做这件事情。它可以在服务器上启动虚拟的图形显示,并强制程序在其中绘制。xvfb
的安装方式:
yum install Xvbf
调用方法:
xvfb-run -s "-screen 0 1400x900x24" jupyter notebook
其中在调用的过程中,还遇到了另一个问题:AttributeError: 'ImageData' object has no attribute 'data'
,在网上看大家的反馈,是 pyglet 的版本原因,需要指定安装特定版本的 pyglet:
pip install pyglet==1.3.2
安装完成后,继续执行程序,顺利运行,至此,踩坑结束。
参考文献
[1] Extending OpenAI Gym environments with Wrappers and Monitors [Tutorial]
[2] StackOverflow. How to run OpenAI Gym .render() over a server