Google Compute Engine 上で matplotlib を使う方法 / How to use matplotlib on Google Compute Engine part of Google Cloud

Google Compute Engine 上で matplotlib を使う方法 / How to use matplotlib on Google Compute Engine part of Google Cloud

そうだ、クラウドで matplotlib しよう。

** Sorry, this note is Japanese only, but please take a look at some code snippets. Hope it helps you.

・・・

参考: python - matplotlib wont draw python3 - Stack Overflow

機械学習 してる時によくある(?)こと

最近、TensorFlow とかその他の機械学習 のプログラムを走らせていると、ずーっと計算してるので手元の macbook で他の作業をするのがしんどくなることがあります。
それでクラウド上の環境で 機械学習 のプログラムを動かしたりするのですが、その時に軽く plot(data) してグラフをみたい時があります。

最近は jupyter notebook や Rodeo のような 機械学習 や データサイエンティストのための Python 環境が整ってきていますが、わたしは interactiver shell でちょこちょこ書きながらチャート表示したりもするので、それはそれとして、これはこれだったりします。
datalove.hatenadiary.jp

環境がクラウドになっても、X Window System 入ってたら同じで、サーバ側で実行した plot の結果を手元でみれるだろう、と思ってたら意外にハマってしまいました・・・
ハマった理由は、

  • python は python3+ 。python2.7 は使いたくない
  • plot の結果は画像ファイル出力とかじゃなく、その場で見たい
  • 実行環境はクラウド( Google Compute Engine )上で、手元の macOS から ssh 接続してリモートで実行する

という条件が重なったためでした。どうにか解決したので備忘録を残しておきます。
なお、今回はたまたま Google のクラウドである、Google Compute Engine を使った話です。でも、Amazon AWS とかでもだいたい同じだと思います。

Google Compute Engine 上で matplotlib を使うための手順

Debian か Ubuntu など、apt が使える OS のインスタンスが準備できている前提で、以下そこからの手順です。大まかには、

  • 手元の環境に X Window に対応した Client アプリをインストールする( 今回は macOS なので、XQuartz です)
  • クラウド側に X Window System のインストール
  • X Window System をリモートから使えるように設定する
  • python と matplotlib のインストール
  • matplotlib の backend を設定する
  • python のプログラムから matplotlib.pyplot.plot を実行する

という流れです。ちなみに、今回の環境は、

  • Server : Debian 3.16.39 x86_64 GNU/Linux on Google Compute Engine
  • Client : macOS + XQuartz

です。

X Window System のインストール

まずはじめに X Window System をインストールします。わたしは別の目的があって、LXDE というデスクトップ環境をインストールしていますが、普通は apt-get install x-window-system とかでインストールできると思います。

$ sudo apt-get install xinit xauth lxde lxde-core  

その後に Xorg -configure で X Window System の設定を行います。

$ sudo Xorg -configure

また、リモートからログインしても X Window System を使えるように、Xwrapper.config というファイルの設定を変更します。

$ sudo vim /etc/X11/Xwrapper.config  
allowed_users=anybody <-- もともと値が console だと思うので、anybody に変更する  

最後に、ssh の ポートフォワード を利用して X Window System に関する通信を行うので、sshd_config の X11 に関する設定を変更します。

$ sudo vim /etc/ssh/sshd_config  
X11Forwarding yes  
X11DisplayOffset 10  
X11UseLocalhost no  

$ sudo systemctl reload sshd  

matplotlib と その他必要な python 環境のインストール

apt-get で python もインストールします。ついでに venv で仮想環境作ってます。

$ sudo apt-get install python3 python3-venv python3-tk python3-matplotlib  
$ python3 -m venv myenv  
$ source myenv/bin/activate  

この時、

  • python3-tk をインストールする
  • matplotlib は pip ではなく、apt-get でインストールする

という点が隠し味です。matplotlib は pip でもインストールして使うことはできますが、python3-tk と一緒に apt でインストールすることで、GUI 環境に必要な依存ライブラリとかまとめてインストールしてくれるので楽です。

matplotlib の backend を変更する

matplotlib が用いる backend を TkAgg に変更します。GTK とかでも、PyGTK とか PyGObject をうまくインストールするとできるのかもしれませんが・・・わたしはうまくできませんでした・・・

$ mkdir -p ~/.config/matplotlib && cd $_  
$ cp /YOUR_PYTHON_PATH/site-packages/matplotlib/mpl-data/matplotlibrc .  
$ vim matplotlibrc  
  
...(途中略します)...  
# backend      : agg # <-- こっちをコメントアウトして  
backend      : TkAgg # <-- これを追加  

これで準備完了です。

Google Compute Engine に ssh ログインしていよいよ plot する

インストールなどの準備はこれで全部なので、いよいよクライアント( macOS )側から XQuarts を利用して Google Compute Engine のインスタンスに接続するわけですが、ここでまた隠し味がひとつ。
Google Compute Engine のインスタンスに接続するときに、X の通信をフォワードするために、ssh のオプション -X と -Y をつけて接続する必要があります。

$ gcloud compute ssh --ssh-flag="-X -Y" <自分のインスタンス>  

インスタンスにログインできたら、python を実行して matplotlib の機能を確認します。インタラクティブ シェルを起動して以下を実行してみると・・・

>>> import matplotlib.pyplot as plt  
>>> import numpy as np  
>>> x = np.linspace(-1.0, 1.0, 100)  
>>> y = np.sin(x * np.pi)  
>>> plt.plot(x, y)  
[<matplotlib.lines.Line2D object at 0x7f0536bb7550>]  
>>> plt.show()  

できました!
こんな感じで無事にグラフが表示されると思います。
Google Compute Engine 上で matplotlib を使う方法 / How to use matplotlib on Google Compute Engine part of Google Cloud

Python・機械学習 関連の他の記事

datalove.hatenadiary.jp datalove.hatenadiary.jp datalove.hatenadiary.jp datalove.hatenadiary.jp