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()
できました!
こんな感じで無事にグラフが表示されると思います。
Python・機械学習 関連の他の記事
datalove.hatenadiary.jp datalove.hatenadiary.jp datalove.hatenadiary.jp datalove.hatenadiary.jp