MuJoCo

원래 MuJoCo를 파이썬에서 사용하려면 mujoco-py 라이브러리를 이용하여야 했다. 단순히 mujoco-py를 설치하면 쓸 수 있는 것이 아니라 MuJoCo 파일을 다운받아 특정 디렉토리로 옯기고 하는 복잡한 과정이 필요했다.

근데 정말 다행히도 2.1.0. 버전 이후로는 바인딩이 되어서 단순히 mujoco 라이브러리를 설치하면 바로 사용할 수 있게 되었다. 또한 mujoco-py는 glfw 라이브러리가 충동하는 에러도 있었고 다양한 dependency 관련 에러가 많이 발생했는데, mujoco로 바인딩된 후에는 에러가 모두 사라졌다.

!apt-get update
!pip install mujoco

렌더링

참고 링크: [1] [2]

Colab에는 GUI가 따로 없기 때문에 MuJoCo 환경을 렌더링하기 위해서는 pyvirtualdisplay가 필요하다. pyvirtualdisplay를 사용하기 위해서는 Xvfb (X virtual framebuffer) 파일이 필요하므로 xvfb와 xvfbwrapper를 추가로 설치해준다.

!pip install pyvirtualdisplay
!sudo apt-get install xvfb
!pip install xvfbwrapper

참고로 xvfb를 설치하지 않으면 해당 파일이 없다는 에러가 발생한다.

FileNotFoundError: [Errno 2] No such file or directory: ‘Xvfb’

렌더링을 위한 코드는 아래와 같다.

import gym
import glob
import io
import base64
from IPython.display import HTML
from IPython import display as ipythondisplay
from gym.wrappers.record_video import RecordVideo
from pyvirtualdisplay import Display

display = Display(visible=0, size=(1400, 900))
display.start()

def show_video():
  mp4list = glob.glob('video/*.mp4')
  if len(mp4list) > 0:
    mp4 = mp4list[0]
    video = io.open(mp4, 'r+b').read()
    encoded = base64.b64encode(video)
    ipythondisplay.display(HTML(data='''<video alt="test" autoplay
                loop controls style="height: 400px;">
                <source src="data:video/mp4;base64,{0}" type="video/mp4" />
             </video>'''.format(encoded.decode('ascii'))))
  else:
    print("Could not find video")


env_name = 'Ant-v4'
env = gym.make(env_name, render_mode="rgb_array")
env = RecordVideo(env, './video',  episode_trigger = lambda episode_number: True)
state = env.reset()

while True:
  env.render()

  mu,sigma = agent.get_action(torch.from_numpy(state).float().to(device))
  dist = torch.distributions.Normal(mu,sigma[0])
  action = dist.sample()
  state, reward, done, info = env.step(action.cpu().numpy())

  if done: break

env.close()
show_video()

gym.wrappers의 Monitor는 deprecated 되었기 때무에 gym.wrappers.record_video의 RecordVideo를 사용하였다. show_video 함수는 다음과 같이 작동한다.

  1. RecordVideo로 gym을 녹화 후 ‘./video’ 디렉토리에 mp4로 저장
  2. glob으로 저장된 mp4의 이름을 검색
  3. io와 base64로 동영상을 불러와 인코딩
  4. Colab output에 HTML로 띄워줌

while 루프는 단순하게 렌더링과 action을 반복하는 과정이므로, 강화학습 환경과 에이전트에 따라 수정하면 된다.

성공 화면

아래 이미지는 ‘Ant-v4’ 환경에 대한 Colab output 화면이다.