疫情期间在家连着实验室的服务器继续学习,用到关于强化学习相关的包 gym 时,在render上出现了问题。

 

环境:

Ubuntu18.04 服务器
python 3.7.6
gym 0.17.1
jupyter 1.0.0
ipython 7.13.0
matplotlib 3.2.1

 

用远程开 jupyter notebook 并在 jupyter 中运行 gym 的 env,调用 env.render() 时出现了如下报错:

 

NoSuchDisplayException: Cannot connect to "None"

 

在 StackOverflow 上找到了解决方案:

首先在服务器上安装 xvfb ,并用 xvfb 运行可显示的 jupyter notebook:

1 $ sudo apt-get install xvfb
2 $ xvfb-run -s "-screen 0 1400x900x24" jupyter notebook

然后在 jupyter 中加入代码:

1 import matplotlib.pyplot as plt
2 %matplotlib inline
3 from IPython import display

为显示加上一个函数:

1 def show_state(env, step=0, info=""):
2     plt.figure(3)
3     plt.clf()
4     plt.imshow(env.render(mode='rgb_array'))
5     plt.title("Step: %d %s" % (step, info))
6     plt.axis('off')
7 
8     display.clear_output(wait=True)
9     display.display(plt.gcf())

然后在运行过程中将 env.render() 替换为 show_state(env, step, info) 的调用即可。

在任意env.step()函数调用、环境状态改变之后都可以调用show_state函数来展示图像

应将env传入,并可以传入步数step,以及想要显示的信息文字串info

 

当使用 xvfb-run 时可能遇到上一次调用没有关闭的情况,在 StackOverflow 上也找到了相关解决方法,只要在 xvfb-run 前使用指令:

1 $ pkill Xvfb

关掉之前的就可以正常开始新的了。

 

附 StackOverflow  具体内容网址:

https://stackoverflow.com/questions/40195740/how-to-run-openai-gym-render-over-a-server

https://stackoverflow.com/questions/16726227/xvfb-failed-start-error