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

前端 未结 15 2154
囚心锁ツ
囚心锁ツ 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 11:06

    I was looking for a solution that works in Colaboratory and ended up with this

    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')
    

    EDIT 1:

    You could use xvfbwrapper for the Cartpole environment.

    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()
    

    If you're working with standard Jupyter, there's a better solution though. You can use the CommManager to send messages with updated Data URLs to your HTML output.

    IPython Inline Screen Example

    In Colab the CommManager is not available. The more restrictive output module has a method called eval_js() which seems to be kind of slow.

提交回复
热议问题