gym中render()函数在远端server运行的解决方案
近來在跑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 的安裝方式:
sudo apt install xvbf調用方法:
xvfb-run -s "-screen 0 640x480x24" python xxx.py其中在調用的過程中,還遇到了另一個問題:AttributeError: 'ImageData' object has no attribute 'data',在網上看大家的反饋,是 pyglet 的版本原因,需要指定安裝特定版本的 pyglet:
pip install pyglet==1.3.2安裝完成后,繼續執行程序,順利運行,至此,踩坑結束。
-
參考博客:
How to run OpenAI Gym .render() over a server
Extending OpenAI Gym environments with Wrappers and Monitors [Tutorial]
總結
以上是生活随笔為你收集整理的gym中render()函数在远端server运行的解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pyc文件反编译为py文件
- 下一篇: 熵的基础知识