How to run OpenAI Gym .render() over a server

前端 未结 15 1945
囚心锁ツ
囚心锁ツ 2020-12-12 10:07

I am running a python 2.7 script on a p2.xlarge AWS server through Jupyter (Ubuntu 14.04). I would like to be able to render my simulations.

Minimal working example<

相关标签:
15条回答
  • 2020-12-12 10:40

    There's also this solution using pyvirtualdisplay (an Xvfb wrapper). One thing I like about this solution is you can launch it from inside your script, instead of having to wrap it at launch:

    from pyvirtualdisplay import Display
    display = Display(visible=0, size=(1400, 900))
    display.start()
    
    0 讨论(0)
  • 2020-12-12 10:40

    I avoided the issues with using matplotlib by simply using PIL, Python Image Library:

    import gym, PIL
    env = gym.make('SpaceInvaders-v0')
    array = env.reset()
    PIL.Image.fromarray(env.render(mode='rgb_array'))
    

    I found that I didn't need to set the XV frame buffer.

    0 讨论(0)
  • 2020-12-12 10:40

    I encountered the same problem and stumbled upon the answers here. Mixing them helped me to solve the problem.

    Here's a step by step solution:

    Install the following:

    apt-get install -y python-opengl xvfb
    

    Start your jupyter notebook via the following command:

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

    Inside the notebook:

    import gym
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    env = gym.make('MountainCar-v0') # insert your favorite environment
    env.reset()
    plt.imshow(env.render(mode='rgb_array')
    

    Now you can put the same thing in a loop to render it multiple times.

    from IPython import display
    
    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)
    

    Hope this works for anyone else still facing an issue. Thanks to Andrews and Nathan for their answers.

    0 讨论(0)
  • 2020-12-12 10:42

    This might be a complete workaround, but I used a docker image with a desktop environment, and it works great. The docker image is at https://hub.docker.com/r/dorowu/ubuntu-desktop-lxde-vnc/

    The command to run is

    docker run -p 6080:80 dorowu/ubuntu-desktop-lxde-vnc
    

    Then browse http://127.0.0.1:6080/ to access the Ubuntu desktop.

    Below are a gif showing it the Mario bros gym environment running and being rendered. As you can see, it is fairly responsive and smooth.

    0 讨论(0)
  • 2020-12-12 10:46

    Not sure how to post images in the comment so here is the error I got trying to use @Andrew Schreiber's solution:

    0 讨论(0)
  • 2020-12-12 10:48

    Referencing my other answer here: Display OpenAI gym in Jupyter notebook only

    I made a quick working example here which you could fork: https://kyso.io/eoin/openai-gym-jupyter with two examples of rendering in Jupyter - one as an mp4, and another as a realtime gif.

    The .mp4 example is quite simple.

    import gym
    from gym import wrappers
    
    env = gym.make('SpaceInvaders-v0')
    env = wrappers.Monitor(env, "./gym-results", force=True)
    env.reset()
    for _ in range(1000):
        action = env.action_space.sample()
        observation, reward, done, info = env.step(action)
        if done: break
    env.close()
    

    Then in a new cell Jupyter cell, or download it from the server onto some place where you can view the video.

    import io
    import base64
    from IPython.display import HTML
    
    video = io.open('./gym-results/openaigym.video.%s.video000000.mp4' % env.file_infix, 'r+b').read()
    encoded = base64.b64encode(video)
    HTML(data='''
        <video width="360" height="auto" alt="test" controls><source src="data:video/mp4;base64,{0}" type="video/mp4" /></video>'''
    .format(encoded.decode('ascii')))
    

    If your on a server with public access you could run python -m http.server in the gym-results folder and just watch the videos there.

    0 讨论(0)
提交回复
热议问题