太陽がまぶしかったから

C'etait a cause du soleil.

matplotlib / imagemagick の Docker でグラフアニメーションGIFを生成

グラフアニメーションを生成したい

 改めて機械学習の勉強を始めるのにあたってグラフのプロットをアニメーションで表示させたくなった。Python ライブラリの matplotlib には直接アニメーションを表示させる機能もあるが、環境情報を Docker コンテナのコンソールに閉じ込めたいし、生成物を簡単に共有したい。そう考えると生成物自体をアニメショーンGIFにできると嬉しい。

 上記情報があったので参考にさせてもらいつつ、imagemagick を Docker コンテナにインストールする事でホストマシンへの影響を最小限にする。

imagemagick をインストールする Docker 環境の作成

  • imagemagick を make するのは結構しんどいのであきらめ
  • Debian ベースの python:3.8.1-slim イメージを用いて apt install したらあっさり
FROM python:3.8.1-slim

ENV TZ JST-9

RUN pip3 install --upgrade pip
COPY ./requirements.txt /requirements.txt
RUN pip3 install -r /requirements.txt

RUN apt-get update && \
    apt-get install -y imagemagick

RUN mkdir /data

ENTRYPOINT ["python3","/data/src/main.py"]
matplotlib == 3.1.2
numpy == 1.18.0
pandas == 0.25.3
  • 生成ファイルをホストマシンで取り扱うように docker-compose.yml を作成
  • ホストマシン上の ./src をコンテナ上の /data/src に共有してプログラム実行
  • コンテナ上の /data/work に出力したらホストマシン上の ./work に出力
version: '2'
services:
  python-test:
    build: .
    container_name: 'python-test'
    tty: true
    volumes:
      - './src:/data/src'
      - './work:/data/work'
    working_dir: '/data/work'
  • docker-compose でビルド
$ docker-compose build python-test
  • 下記コマンド ./src/main.py が実行される
$ docker-compose run python-test

ラフプロットプログラムの作成

  • matplotlib の基本的な使い方は下記の通り

  • 3次関数のプロットをアニメーションGIF化するプログラムの作成
import datetime
import matplotlib.pyplot as pyplot
import matplotlib.animation as animation

figure = pyplot.figure()
graphs = []
for i in range(-30, 30, 1):
    g = pyplot.plot(i, i ** 3, 'o', color='red')
    graphs.append(g)
    
now = datetime.datetime.now()
anime = animation.ArtistAnimation(figure, graphs, interval=50)
anime.save(f'plot_{now:%Y%m%d_%H%M%S}.gif', writer='imagemagick')
  • graphs 配列にプロット結果を格納していって ArtistAnimation オブジェクト生成
  • ArtistAnimation から imagemagick を用いて アニメーションGIF を出力

アニメーションは四次元目

 以上まででグラフのプロットをアニメーション GIF で表示させて共有可能となった。そもそもやりたかったのは、『つくりながら学ぶ! 深層強化学習 ~PyTorchによる実践プログラミング~』にあった迷路分析エージェントの可視化である。本書では Project Jupyter | Try Jupyter というWebサービスを使っているのだけど、Webブラウザ上でコーディングするのはやりづらいので、自前環境を構築した。

 アニメーション生成が手軽にできると視覚的に理解可能な縦横奥行きという三次元に加えて時間軸という四次元目の表現が簡易にできるのが面白い。アニメーション GIF 自体は廃れかけた技術ではあるが、 Slack や Githubwiki 等でも簡易に扱えるという意味ではむしろ有用性が上がっているようにも思えるので活用していきたい。