#はじめに
いくつかのサイトでみると、以下のコード実行で仮想のディスプレイを割り当てると、
動作させることができるとのことですが、現在(2019/08/05)時点ではうまくいかないようです。
「display.start()」を実行する箇所で
「xdpyinfo was not found, X start can not be checked! Please install xdpyinfo!」
のエラーが表示されます。
!apt-get -qq -y install libcusparse8.0 libnvrtc8.0 libnvtoolsext1 > /dev/null
!ln -snf /usr/lib/x86_64-linux-gnu/libnvrtc-builtins.so.8.0 /usr/lib/x86_64-linux-gnu/libnvrtc-builtins.so
!apt-get -qq -y install xvfb freeglut3-dev ffmpeg> /dev/null
!pip install pyglet
!pip install pyopengl
!pip install pyvirtualdisplay
!pip install gym[classic_control]
from pyvirtualdisplay import Display
display = Display(visible=0, size=(1024, 768))
display.start()
import os
os.environ["DISPLAY"] = ":" + str(display.display) + "." + str(display.screen)
#対応方法(2019/08/05時点)
xdpyinfoとその関連ファイルが無いので以下の3つをUbuntu18.04環境からコピーする。
xdpyinfoには実行権限を付ける。
/usr/bin/xdpyinfo
/usr/lib/x86_64-linux-gnu/libXxf86dga.so.1
/usr/lib/x86_64-linux-gnu/libXxf86dga.so.1.0.0
ファイルをアップロードしてから以下コマンドを実行する。
!cp xdpyinfo /usr/bin/
!cp libXxf86dga.* /usr/lib/x86_64-linux-gnu/
!chmod +x /usr/bin/xdpyinfo
エラーにならずに実行できるようになります。
(2019/08/26追加)
gymの環境作成時に「wrappers.Monitor()」を使うことで、mp4ファイルに出力できる。
上記の方法での仮想ディスプレイの割り当てを行わなくても良いようです。
動画も出力できるので、こちらを使った方がよさそうです。
from gym import wrappers
ENV_NAME = 'MsPacman-v0'
env = gym.make(ENV_NAME)
env = wrappers.Monitor(env, '/content/drive/My Drive/movie_folder', video_callable=(lambda ep: ep % 100 == 0))
#対応方法(2020/01/07時点)
pygletおよびtensorflowのバージョンを下げたりしないと上記のやりかたでは動かないようです。
現在時点で以下の方法で実行できるようです。
①以下3ファイルのアップロード
xdpyinfo
libXxf86dga.so.1
libXxf86dga.so.1.0.0
②以下コマンドでファイル配置およびパッケージのインストール
!cp xdpyinfo /usr/bin/
!cp libXxf86dga.* /usr/lib/x86_64-linux-gnu/
!chmod +x /usr/bin/xdpyinfo
!pip uninstall pyglet -y
!pip install pyglet==1.2.4
!pip install keras-rl gym
!pip install tensorflow==1.13.1
!apt-get -qq -y install libcusparse8.0 libnvrtc8.0 libnvtoolsext1 > /dev/null
!ln -snf /usr/lib/x86_64-linux-gnu/libnvrtc-builtins.so.8.0 /usr/lib/x86_64-linux-gnu/libnvrtc-builtins.so
!apt-get -qq -y install xvfb freeglut3-dev ffmpeg> /dev/null
!pip install pyopengl
!pip install pyvirtualdisplay
!pip install gym[classic_control]
③「ランタイム」→「ランタイムを再起動」
④以下のコード実行で仮想ディスプレイを有効にする
from pyvirtualdisplay import Display
display = Display(visible=0, size=(1024, 768))
display.start()
⑤あとは環境作成時にwrappers.Monitor()を使えばよいようです。
from gym import wrappers
env = gym.make(ENV_NAME)
env = wrappers.Monitor(env, '/content', video_callable=(lambda ep: ep % 100 == 0))