疫情期間在家連着實驗室的服務器繼續學習,用到關於強化學習相關的包 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