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な状態で提供されています。バージョンや組み合わせの心配をしなくて良いので気楽に試すことができます。
その代わりと言ってはなんですが、このAMIを利用するには費用がかかります。インスタンスの種別やリージョンによって価格が異なります。たとえばN.Virginiaでp2.xlargeだと、$0.90/Hour です。
後で説明するスポットインスタンスで利用するための注意点ですが、AMIを「コミュニティAMI」から選択する必要があるようです。「AWS Marketplace」から検索して見つかったAMIを選択するとスポットインスタンスのチェックボックスが有効にならず、指定することができませんでした。理由はわかりませんが、ご注意ください。
AMI選択に引き続き、インスタンスタイプとしてp2.xlarge
を選択します。
スポットインスタンス
GPUインスタンスは、通常のオンデマンドインスタンスだと、$0.9/Hour の価格です。一方スポットインスタンスの価格は $0.15~0.3/Hour と、オンデマンドに比べて数分の1で利用することができるようです。この価格なら気楽に試すことができます。もちろん価格は変動しますし、需給状態によっては大きく変動しまし、もし指定した最高価格を超えた場合にはインスタンスが停止させらてしまいますので注意が必要です。
スポットインスタンスを利用するには、いくつか方法がありますが、Amazon Management Consoleからインスタンスを起動する際に、「インスタンスの詳細の設定」の画面でスポットインスタンスのリクエストにチェックを入れるのが最も簡単です。現在の価格と、最高価格を適宜入力します。あとは通常通りでOKです。(一部のAZで価格が最高価格を超えていた場合で、かつそのAZに割り当てられてしまうとスポットインスタンスのリクエストが通らないケースがあります。その場合は、サブネットを適宜選択することで別のAZへの割り当てを指示できるようです)
なおデフォルトのままで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
を開きます。
いくつかファイルがありますが、みんな大好き、いつもの手書き文字認識MNISTのチュートリアルを試してみます。
ノートブックには、モジュールのインポート、学習のロード、モデルの定義、学習が定義されています。上から順にShift-Returnキーを押して、セルを評価していきます。
たとえばこのセルでは、モデルとして多層パーセプトロン(Multi Layer Perceptron:MLP)を使った学習をしています。ここは軽量なモデルのためCPUを使っています。
こちらでは、CNN(Covolutional Neural Network)のであるLeNetを使っています。こちらはGPUによる処理を行なっています。
この式の中で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)で試しました。