MXNetをAmazon Deep Learning AMIとスポットインスタンスのGPUで試してみる

はじめに

ディープラーニングフレームワークであるMXNetを、Amazon Deep Learning AMIとGPUインスタンスで試してみました。あらかじめ用意されているAMIを使うことで、インストール作業を全くすること無しに、すぐに動作させることができます。ディープラーニングに必須アイテムとも言えるGPUですが、スポットインスタンスを使えばお安く試すことができます。

Deep Learning AMI

GPUを使ったディープラーニングをすぐに使えるようにするDeep Learning AMIが提供されています。以下のように、たくさんのディープラーニングフレームワークがあらかじめインストール済みとなっています。

  • MXNet
  • Caffe
  • Caffe2
  • TensorFlow
  • Theano
  • CNTK
  • Torch
  • Keras

これらのフレームワークに加えて、GPUを使うためのCuda関連のドライバやライブラリがインストール済みの、GPU Readyな状態で提供されています。バージョンや組み合わせの心配をしなくて良いので気楽に試すことができます。

amazon-deeplearning-ami

その代わりと言ってはなんですが、このAMIを利用するには費用がかかります。インスタンスの種別やリージョンによって価格が異なります。たとえばN.Virginiaでp2.xlargeだと、$0.90/Hour です。

software-pricing

software-pricing2

後で説明するスポットインスタンスで利用するための注意点ですが、AMIを「コミュニティAMI」から選択する必要があるようです。「AWS Marketplace」から検索して見つかったAMIを選択するとスポットインスタンスのチェックボックスが有効にならず、指定することができませんでした。理由はわかりませんが、ご注意ください。

select-deep-learning-ami

AMI選択に引き続き、インスタンスタイプとしてp2.xlargeを選択します。

select-gpu-instance-type

スポットインスタンス

GPUインスタンスは、通常のオンデマンドインスタンスだと、$0.9/Hour の価格です。一方スポットインスタンスの価格は $0.15~0.3/Hour と、オンデマンドに比べて数分の1で利用することができるようです。この価格なら気楽に試すことができます。もちろん価格は変動しますし、需給状態によっては大きく変動しまし、もし指定した最高価格を超えた場合にはインスタンスが停止させらてしまいますので注意が必要です。

スポットインスタンスを利用するには、いくつか方法がありますが、Amazon Management Consoleからインスタンスを起動する際に、「インスタンスの詳細の設定」の画面でスポットインスタンスのリクエストにチェックを入れるのが最も簡単です。現在の価格と、最高価格を適宜入力します。あとは通常通りでOKです。(一部のAZで価格が最高価格を超えていた場合で、かつそのAZに割り当てられてしまうとスポットインスタンスのリクエストが通らないケースがあります。その場合は、サブネットを適宜選択することで別のAZへの割り当てを指示できるようです)

request-spot-instance

なおデフォルトのままでOKのはずですが、インスタンスはSSH経由で利用するので、セキュリティグループの設定に留意してください。

SSHで接続する

インスタンスが起動したらまずはSSHで接続してみます。

$ ssh -i your-key.pem ec2-user@ec2-XXX-XXX-XXX-XXX.compute-1.amazonaws.com
Last login: Wed Jun 28 03:20:10 2017 from XX.XX.XX.XX

=============================================================================
__| __|_ )
_| ( / Deep Learning AMI for Amazon Linux
___|\___|___|

The README file for the AMI ➜➜➜➜➜➜➜➜➜➜➜➜➜➜➜➜➜➜➜➜ /home/ec2-user/src/README.md
Tests for deep learning frameworks ➜➜➜➜➜➜➜➜➜➜➜➜ /home/ec2-user/src/bin
=============================================================================

Amazon Linux version 2017.03 is available.
[ec2-user@ip-XXX-XXX-XXX-XXX ~]$

ちゃんとDeep Learning AMIが起動しているようです。

MXNetの動作確認のため、Pythonでmxnetをimportしてみます。

$ python
Python 3.5.0 (default, Jun 1 2017, 23:05:08)
[GCC 4.8.3 20140911 (Red Hat 4.8.3-9)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import mxnet as mx
>>>

正常にimportできたので、ちゃんとMXNetが使える状態になっているようです。

Jupyter notebookでチュートリアルを試す

MXNetを実際に動作させてみるため、下記のチュートリアルを試してみました。

https://github.com/dmlc/mxnet-notebooks

gitでcloneしてファイルを用意しておきます。

$ git clone https://github.com/dmlc/mxnet-notebooks

WebブラウザからJupyter notebookに接続するために、SSHポートフォワードすることにします。一度SSH接続を閉じて、-Lオプションを付けて再接続します。リモートの8888をローカルの8888に接続する指定です。

$ ssh -i your-key.pem ec2-user@ec2-XXX-XXX-XXX-XXX.compute-1.amazonaws.com -L 8888:localhost:8888

接続したらGPUインスタンス上でjupyter notebookを起動します。Deep Learning AMIにはjupyter notebookもインストールされていますので、即座に使えます。

$ jupyter notebook
...
Copy/paste this URL into your browser when you connect for the first time,
to login with a token:
http://localhost:8888/?token=ec15e3ab07e3fbb9696341cd2bab49f4569bb963084e59d1

ローカルのWebブラウザで、表示されたトークン付きのURLを開きます。接続に成功すると、Jupyter notebookの画面が現れます。ディレクトリを辿ってmxnet-notebooks/python/outline.ipynbを開きます。

jupyter-mxnet-totorial

いくつかファイルがありますが、みんな大好き、いつもの手書き文字認識MNISTのチュートリアルを試してみます。

tutorial-mxnet-mnist

ノートブックには、モジュールのインポート、学習のロード、モデルの定義、学習が定義されています。上から順にShift-Returnキーを押して、セルを評価していきます。

たとえばこのセルでは、モデルとして多層パーセプトロン(Multi Layer Perceptron:MLP)を使った学習をしています。ここは軽量なモデルのためCPUを使っています。

multilayer-perceptron

こちらでは、CNN(Covolutional Neural Network)のであるLeNetを使っています。こちらはGPUによる処理を行なっています。

jupyter-mxnet-lenet

この式の中でctx = mx.gpu(0),をコメントアウトすると、GPUではなく、CPUによる処理を行います。実際に試してみると、GPUでは25秒程度で処理が完了しましたが、CPUでは10分程度を要しました。GPUは効いているようです。

まとめ

Deep Learning AMIとGPUインスタンスを使って、MXNetを試してみました。Jupyter notebook環境でチュートリアルを動作させることができました。Jupyter notebookは試行錯誤にも便利ですのでお勧めです。1時間程度の短時間でも試せますので、ぜひトライしてみてください。

補足

ちなみに今回東京リージョン(ap-northeast)で試そうとしたところスポットインスタンスの価格が上限に張り付いた状態でした。このため今回は北部バージニア(us-east)で試しました。

varrying-spot-price