93

Jupyter (Ubuntu 14.04) を介してp2.xlarge AWSサーバーで python 2.7 スクリプトを実行しています。シミュレーションをレンダリングできるようにしたいと思います。

最小限の作業例

import gym
env = gym.make('CartPole-v0')
env.reset()
env.render()

env.render()(とりわけ)次のエラーが発生します。

...
HINT: make sure you have OpenGL install. On Ubuntu, you can run 
'apt-get install python-opengl'. If you're running on a server, 
you may need a virtual frame buffer; something like this should work: 
'xvfb-run -s \"-screen 0 1400x900x24\" python <your_script.py>'")
...
NoSuchDisplayException: Cannot connect to "None"

シミュレーションを見る方法を教えてください。インライン化できれば理想ですが、表示方法はなんでもいいです。

編集:これは、従来のコントロールなど、一部の環境でのみ発生する問題です。


アップデートⅠ

これに触発されて、 xvfb-run -s \"-screen 0 1400x900x24\" python <your_script.py>(うまくいかなかった)の代わりに、次のことを試しました。

xvfb-run -a jupyter notebook

代わりに取得した元のスクリプトを実行する

GLXInfoException: pyglet requires an X server with GLX

アップデートⅡ

問題#154は関連しているようです。ポップアップを無効にして、RGB カラーを直接作成してみました

import gym
env = gym.make('CartPole-v0')
env.reset()

img = env.render(mode='rgb_array', close=True)  
print(type(img)) # <--- <type 'NoneType'>

img = env.render(mode='rgb_array', close=False) # <--- ERROR
print(type(img)) 

私は得るImportError: cannot import name gl_info


アップデートⅢ

@ Torxedからインスピレーションを得て、ビデオ ファイルを作成し、それをレンダリングしてみました (完全に満足のいくソリューションです)。

「結果の記録とアップロード」のコードの使用

import gym

env = gym.make('CartPole-v0')
env.monitor.start('/tmp/cartpole-experiment-1', force=True)
observation = env.reset()
for t in range(100):
#    env.render()
    print(observation)
    action = env.action_space.sample()
    observation, reward, done, info = env.step(action)
    if done:
        print("Episode finished after {} timesteps".format(t+1))
        break

env.monitor.close()

私はあなたの提案に従ってみましたがImportError: cannot import name gl_info、実行時に取得しましたenv.monitor.start(...

私の理解では、問題は OpenAI が を使用しpygletpygletレンダリングされる画像の RGB カラーを計算するために画面を「必要とする」ことです。したがって、モニターが接続されていると考えるようにpythonをだます必要があります


アップデート IV

参考までに、バンブルビーを使用してオンラインで機能するように見えるソリューションがあります。これは、サーバーを制御できる場合に機能するはずですが、AWS は VM で実行されるため、これを使用できないと思います。


更新 V

あなたがこの問題を抱えていて、どうすればいいのかわからない場合 (私のように)、ほとんどの環境の状態は単純なので、独自のレンダリング メカニズムを作成できます。あまり満足のいくものではありませんが..ご存知のとおりです。

4

14 に答える 14

25

このGitHub の問題は、私にとってうまくいった答えを与えてくれました。matplotlib追加の依存関係 (すでに持っていると思います) やサーバーの構成を必要としないので、これは素晴らしいことです。

実行するだけです。

import gym
import matplotlib.pyplot as plt
%matplotlib inline

env = gym.make('Breakout-v0') # insert your favorite environment
render = lambda : plt.imshow(env.render(mode='rgb_array'))
env.reset()
render()

を使用すると、各位置のRGB 値mode='rgb_array'が返され、 (またはその他の方法) でこれらが適切に表示されます。numpy.ndarraymatplotlibimshow

同じセルで複数回レンダリングする場合、このソリューションは毎回別の画像をプロットすることに注意してください。これはおそらくあなたが望むものではありません。そのための良い回避策を見つけたら、これを更新しようとします。

1 つのセルで複数回レンダリングするように更新する

このStackOverflowの回答に基づいて、これが実際のスニペットです(インタラクティブなプロットでこれを行うより効率的な方法があることに注意してください。この方法は私のマシンでは少し遅れているようです):

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)

更新して効率を上げる

私のマシンでは、これは約 3 倍高速でした。imshow違いは、レンダリングするたびに呼び出すのではなく、元のプロットの RGB データを変更するだけです。

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)
于 2017-06-08T04:17:42.780 に答える
9

私はこれに遭遇しました。xvfb を X サーバーとして使用すると、何らかの形で Nvidia ドライバーと競合します。しかし、最終的にこの投稿は私を正しい方向に向けました. -no-opengl-filesオプションで Nvidia ドライバー、オプションで CUDA をインストールすれば、Xvfb は問題なく動作し--no-opengl-libsます。これを知っていれば、うまくいくはずです。しかし、これを理解するまでにかなりの時間がかかり、xvfb と nvidia ドライバーで問題が発生したのは私だけではないようです。

ここでは、Ubuntu 16.04 LTS を使用して AWS EC2 インスタンスですべてをセットアップするために必要なすべての手順を書き留めました。

于 2016-11-13T21:35:19.367 に答える
2

Colaboratoryで機能するソリューションを探していましたが、これで終わりました

from IPython import display
import numpy as np
import time

import gym
env = gym.make('SpaceInvaders-v0')
env.reset()

import PIL.Image
import io


def showarray(a, fmt='png'):
    a = np.uint8(a)
    f = io.BytesIO()
    ima = PIL.Image.fromarray(a).save(f, fmt)
    return f.getvalue()

imagehandle = display.display(display.Image(data=showarray(env.render(mode='rgb_array')), width=450), display_id='gymscr')

while True:
    time.sleep(0.01)
    env.step(env.action_space.sample()) # take a random action
    display.update_display(display.Image(data=showarray(env.render(mode='rgb_array')), width=450), display_id='gymscr')

編集1:

Cartpole 環境には xvfbwrapper を使用できます。

from IPython import display
from xvfbwrapper import Xvfb
import numpy as np
import time
import pyglet
import gym
import PIL.Image
import io    

vdisplay = Xvfb(width=1280, height=740)
vdisplay.start()

env = gym.make('CartPole-v0')
env.reset()

def showarray(a, fmt='png'):
    a = np.uint8(a)
    f = io.BytesIO()
    ima = PIL.Image.fromarray(a).save(f, fmt)
    return f.getvalue()

imagehandle = display.display(display.Image(data=showarray(env.render(mode='rgb_array')), width=450), display_id='gymscr')


for _ in range(1000):
  time.sleep(0.01)
  observation, reward, done, info = env.step(env.action_space.sample()) # take a random action
  display.update_display(display.Image(data=showarray(env.render(mode='rgb_array')), width=450), display_id='gymscr')


vdisplay.stop()

ただし、標準の Jupyter を使用している場合は、より良い解決策があります。CommManager を使用して、更新されたデータ URL を含むメッセージを HTML 出力に送信できます。

IPython インライン画面の例

Colab では、CommManager は利用できません。より制限的な出力モジュールには、eval_js() というメソッドがあり、これは少し遅いようです。

于 2018-09-22T17:43:42.433 に答える
1

私は同じ問題と I_like_foxes ソリューションを使用して、opengl を修正せずに nvidia ドライバーを再インストールしました。Ubuntu 16.04 と GTX 1080ti で使用したコマンドは次のとおりです https://gist.github.com/8enmann/931ec2a9dc45fde871d2139a7d1f2d78

于 2017-08-03T21:07:50.100 に答える
-1

私の IPython 環境では、Andrew Schreiber のソリューションは画像をスムーズにプロットできません。以下は私の解決策です:

Linux サーバーの場合は、次のコマンドで jupyter を開きます

$ xvfb-run -s "-screen 0 1400x900x24" jupyter notebook

ジュピターで

import matplotlib.pyplot as plt
%matplotlib inline
%matplotlib notebook
from IPython import display

反復表示:

done = False
obs = env.reset()

fig = plt.figure()
ax = fig.add_subplot(111)
plt.ion()

fig.show()
fig.canvas.draw()

while not done:
    # action = pi.act(True, obs)[0] # pi means a policy which produces an action, if you have
    # obs, reward, done, info = env.step(action) # do action, if you have
    env_rnd = env.render(mode='rgb_array')
    ax.clear()
    ax.imshow(env_rnd)
    fig.canvas.draw()
    time.sleep(0.01)
于 2018-08-26T14:31:18.370 に答える