MXNet How To : MXNet のための Amazon EC2 / S3 クラウド・セットアップ

MXNet How To : MXNet のための Amazon EC2 / S3 クラウド・セットアップ (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
日時 : 02/27/2017

* 本ページは、MXNet 本家サイトの “Cloud Setup for MXNet” を翻訳した上で適宜、補足説明したものです:
    http://mxnet.io/how_to/cloud.html

How to set up MXNet on the AWS Cloud using Amazon EC2 and Amazon S3 – AWS で MXNet を使用するためのステップバイステップの説明を提供します。それは Amazon Simple Storage Service (Amazon S3) と Amazon Elastic Compute Cloud (Amazon EC2) と MXNet がこの環境に依存するライブラリを使用するための前提条件を説明します。どのようにセットアップしビルドしインストールしテストし、そして MXNet を実行するかを説明し、クラウドで複数の GPU 上で MXNet をどのように実行するかも説明します。

 

AWS GPU クラスタをスクラッチからセットアップする

このトピックでは、MXNet で AWS クラスタをどのようにセットアップするかについての step-by-step チュートリアルを提供します。どのように次を行なうかを示します :

  • データをホストするために Amazon S3 を使用する
  • 全ての依存関係のインストールとともに EC2 GPU インスタンスをセットアップする
  • 単一のコンピュータ上で MXNet をビルドして実行する
  • 分散トレーニングのために EC2 GPU クラスタをセットアップする

データをホストするために Amazon S3 を使用する

S3 は分散データ・ストレージを提供し、これは巨大なデータセットをホストするのに便利です。S3 を使用するためには AWS credentials が必要でこれは ACCESS_KEY_ID と SECRET_ACCESS_KEY を含みます。S3 で MXNet を使用するためには、次の2行を ~/.bashrc に (文字列は正しいものに置き換えた上で) 追加して環境変数 AWS_ACCESS_KEY_ID と AWS_SECRET_ACCESS_KEY をセットします :

export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

S3 にデータをアップロードするには幾つかの方法があります。単純な方法は s3cmd を使用することです。例えば :

wget http://data.mxnet.io/mxnet/data/mnist.zip
unzip mnist.zip && s3cmd put t*-ubyte s3://dmlc/mnist/

EC2 GPU インスタンスをセットアップする

MXNet は次のライブラリを必要とします :

  • C++ compiler with C++11 support, such as gcc >= 4.8
  • CUDA (CUDNN in optional) for GPU 線形代数
  • BLAS (cblas, open-blas, atblas, mkl, あるいは他) for CPU 線形代数
  • opencv for 画像拡張
  • curl と openssl for Amazon S3 read/write

EC2 インスタンス上の CUDA のインストールは少し努力が必要です。Ubuntu 14.04 で CUDA 7.0 をどのようにインストールするかについては Caffe に良い チュートリアル があります。

Note: Nov 7, 2015 に CUDA 7.5 を試しましたが、問題があるようです。(訳注 : この情報はおそらく古いもので、Feb 27, 2017 時点で CUDA 8.0 でサンプルが動作しています。)

残りはパッケージ・マネージャを使用してインストールできます。例えば、Ubuntu では :

sudo apt-get update
sudo apt-get install -y build-essential git libcurl4-openssl-dev libatlas-base-dev libopencv-dev python-numpy

Amazon Machine Image ami-12fd8178 は上にリストされたパッケージをインストールして持ちます。
* 訳注: 27-feb-17 現在、利用可能ではありませんでした。

GPU インスタンスで MXNet をビルドして実行する

次のコマンドは MXNet を CUDA/CUDNN、Amzon S3、そして分散トレーニングと共にビルドしています。

git clone --recursive https://github.com/dmlc/mxnet
cd mxnet; cp make/config.mk .
echo "USE_CUDA=1" >>config.mk
echo "USE_CUDA_PATH=/usr/local/cuda" >>config.mk
echo "USE_CUDNN=1" >>config.mk
echo "USE_BLAS=atlas" >> config.mk
echo "USE_DIST_KVSTORE = 1" >>config.mk
echo "USE_S3=1" >>config.mk
make -j$(nproc)

全てが正しくインストールされたかをテストするためには、GPU を使用して MNIST 上で畳込みニューラルネットワーク (CNN) をトレーニングします :

python tests/python/gpu/test_conv.py

* 訳注 : 現在では python/train にあります。

MNIST データを s3://dmlc/mnist に置いたのであれば、次のコマンドで Amazon S3 上にストアされたデータを直接読めます :

sed -i.bak "s!data_dir = 'data'!data_dir = 's3://dmlc/mnist'!" tests/python/gpu/test_conv.py

Note: opencv error libdc1394 error: Failed to initialize libdc1394 を修正するためには “sudo ln /dev/null /dev/raw1394” が使用できます。

分散トレーニングのために EC2 GPU クラスタをセットアップする

クラスタは複数のコンピュータから構成されます。MXNet がインストールされたコンピュータを root コンピュータとしてジョブを submit するために使用して、そしてジョブを実行するために幾つかのスレーブ・コンピュータを launch することができます。例えば、依存関係がインストールされた AMI, e.g., ami-12fd8178 を利用して複数のインスタンスを起動します。2つのオプションがあります :

  • type 設定で(root と同様に)全てのスレーブのポートをアクセス可能にします: セキュリティ・グループの設定において All TCP, 送信元: Anywhere。
  • 全てのスレーブコンピュータにアクセスするために root コンピュータと同じ pem を使用し、そして pem ファイルを root コンピュータの ~/.ssh/id_rsa にコピーします。これを行なえば、全てのスレーブコンピュータは root から SSH でアクセス可能です。

さて複数のコンピュータ上で CNN を実行します。MXNet は ~/mxnet としてビルドされ、~/train のような、root コンピュータの作業ディレクトリにいると仮定します。

  1. 簡単な同期のために MXNet Python ライブラリをこの作業ディレクトリにパックします :
cp -r ~/mxnet/python/mxnet .
cp ~/mxnet/lib/libmxnet.so mxnet/

そしてトレーニング・プログラムをコピーします :

cp ~/mxnet/example/image-classification/*.py .
cp -r ~/mxnet/example/image-classification/common 
  1. 全てのスレーブのプライベート IP を保持するホストファイルを準備します。例えば、cat hosts :
172.30.0.172
172.30.0.171
  1. 2つのコンピュータがあり、2つのワーカーを使用して CNN をトレーニングすると仮定します :
../../tools/launch.py -n 2 -H hosts --sync-dir /tmp/mxnet python train_mnist.py --kv-store dist_sync

Note: ルートノードで Ctrl-C を押しても時々ジョブはスレーブコンピュータに居残ります。それらを terminate するには、次のコマンドを使用します :

cat hosts | xargs -I{} ssh -o StrictHostKeyChecking=no {} 'uname -a; pgrep python | xargs kill -9'

Note: 前のサンプルはトレーニングするためには非常に簡単なので、それゆえに、分散トレーニングに対して良いベンチマークにはなりません。他の サンプル の使用も考えてください。

 

複数のデータ・シャードを使用する

データセットを複数のファイルにパックすることは、特に分散環境で作業する際には一般的です。MXNet は複数のデータ・シャードから直接ロードすることをサポートしています。レコードファイルをフォルダに置き、そしてフォルダにデータパスをポイントします。

 

YARN と SGE を使用する

クラスタ・スケジューリング・フレームワークを持たない時に SSH の利用は単純ですが、MXNet は Hadoop (YARN) と SGE を含む、様々なプラットフォームに可搬であるように設計されています。貴方のお気に入りの分散プラットフォーム上で MXNet を実行する例の貢献を歓迎します。

 

以上