序文
LinuxシステムにデプロイされたJupyterの場合、おそらくジムに付属のArtriビデオゲームを最初にレンダリングしたときに、多かれ少なかれ次の問題が発生しました。
質問1:
~/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:ジムのみがインストールされていますが、Atariゲームコンポーネントはインストールされていません
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から
pyglet.canvas.xlib.NoSuchDisplayException: Cannot connect to "None"
クラウドのJupyterでGym-Artriビデオゲームの正しい姿勢をレンダリングします
1.ジムとピグレットをインストールします(質問1に対応して、すでにインストールしている場合はこの手順をスキップできます)
$ git clone https://github.com/openai/gym.git
$ cd gym
$ conda install -e .
$ conda install -c conda-forge pyglet
2. Atariパッケージをインストールします(質問2に対応して、すでにインストールしている場合は、この手順をスキップできます)
清華ミラーソースの使用は高速です
$ pip install gym[atari] -i https://pypi.tuna.tsinghua.edu.cn/simple
3. Xvfbパッケージをインストールします(質問3などに対応、コア)
Gymのrender()関数はローカル側で実行する必要があるため、環境の画像をレンダリングするためにローカルでウィンドウを開きます。クラウドレンダリングの場合、レンダリングを支援するための特別なツールが必要です。このパッケージはXvfb
それです。クラウドに置くことができます画像の仮想レンダリングを実行し、それによってサーバー上で仮想グラフィック表示を開始します。具体的なインストール方法は次のとおりです。
# CentOS, 注意这里首字母X是大写
$ yum install Xvbf
# Ubuntu
$ sudo apt install xvbf
4. Cloud Jupyterを開き
不挂起
ます(オプションでコマンドを実行します)
①クラウドJupyterを直接開く
$ xvfb-run -s "-screen 0 1400x900x24" jupyter notebook
②不挂起
クラウドJupyterを途中で開きます(インターフェースを閉じた後も、Jupyterはバックグラウンドで実行されます)
$ nohup xvfb-run -s "-screen 0 1400x900x24" jupyter notebook > jupyter.log 2>&1 &
プロセスを閉じたい場合は、プロセスPIDを見つけてプロセスを強制終了します。
$ ps -aux | grep jupyter
$ kill -9 <PID>
5.JupyterでAtraiビデオゲームをレンダリングします
ここでは、Breakout-v0
例としてAtraiのブリックブレーカーゲームを取り上げます。主に2つの方法があります。コアにはmatplotlib.pyplot
、使用中のimshow()
メソッドが必要です。パラメーターmode='rgb_array'
はnumpy.ndarray
、各位置のRGB値を提供し、それimshow()
をレンダリングに使用します。
①imshowを頻繁に呼び出して、マルチフレーム画像のレンダリングを実現します
ここでは、アクションを100回実行するエージェントを例にとると、100フレームのアニメーションがあります。最もネイティブな方法は、100回呼び出すことです。imshow()
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データを継続的に変更して、マルチフレーム画像レンダリングを実現します(imshowを1回だけ呼び出す、高速)
ここで、imshow()は最初に1回だけ呼び出され、エージェントが環境と対話するときに、RGBデータを変更することで各フレームのレンダリングが行われるset_data()
ため、レンダリング効率が向上します。
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]リモートサーバーで実行されているジムでのrender()関数のソリューション
[2] stackOverflow。サーバー上でOpenAIGym .render()を実行する方法
[3] stackOverflow.NameError:名前「base」が定義されていませんOpenAIジム
[4] DQNトレーニングatariゲーム:「atari_py」という名前のモジュールはありません