JupyterLabでアニメーションが動作しないときの対処

背景・目的

最近、深層強化学習を勉強していて、教材としては

https://www.amazon.co.jp/dp/4839965625

を使っている。 コードはノートブックに記述していて、JupyterLabを利用している。 Toy problem として自作で3×3マスの迷路を自作して、選択した行動をアニメーションとして描画するところで問題があったのでメモしておく。

エージェントが通るパスをアニメーションとして表示するコードを部分的に抜粋して載せておく。

from matplotlib import animation
from IPython.display import HTML
%matplotlib inline

def init():
    line.set_data([], [])
    return (line,)

def animate(i):
    state = state_history[i]
    x = (state % 3) + 0.5
    y = 2.5 - int(state / 3)
    line.set_data(x, y)
    return (line,)

anim = animation.FuncAnimation(fig, animate, init_func=init, 
                               frames=len(state_history), interval=200, repeat=False)
anim.save("maze.gif", writer = "imagemagick")
HTML(anim.to_jshtml())

state_historyにはエージェントが通るパスのが保存されていて、それをアニメーションとして動かす。 今回問題になったは HTML(anim.to_jshtml()) の部分である。

アニメーションとして動かすには

Jupyter内で図をアニメーションとして動かすには、 matplotlibanimation を利用すると簡単に実現できる。 実際に、書籍では恐らくJupyter Notebookで実験することを想定しており、簡単にアニメーションを動かすことができた。

しかし、JupyterLabではJavaScriptの問題のためかアニメーションを再生することができない。 この問題はGithub上でissueとして上がっている。 ここでは、animationのオブジェクトにある to_jshtml() を使っているが、 その他にも to_html5_video() 関数があり、これを使ってもアニメーションを再生できなかった。

どうやって解決したか

JupyterのNotebookはコードのみでなく、Markdownとして文章を記述することが可能である。 今回は、アニメーションをgifとして保存し、そのファイルをMarkdownで読み込みアニメーションを再生することで回避した。 上記のコードの中の

anim.save("maze.gif", writer = "imagemagick")

でアニメーションをgifとして保存している。 ここで保存したファイルをMarkdown

<div class="pull-left">
![Animated GIF](maze.gif)
<div>

と記述した。 これにより、Jupyter NotebookでもJupyterLabでもアニメーションを表示することができた。 難点としては、アニメーションが無限にリピート再生されてしまうところくらいかなと思っている。 それよりも簡単に可視化されどのような挙動になるのか、可視化されながら説明できる点のほうがはるかに重要だと思うので、 回避方法が見つかってよかった。 おなじ問題に出くわしている人の解決方法になれば幸いです。 また、JupyterLabで to_jshtml()to_html5_video() などコードでアニメーションが実現できた人はコメントなどでぜひとも教えてください!