Azure + Tensorflow + Kerasで画像認識

クラウドでGPUを使ったディープラーニングを実行するための環境構築法をまとめました。

こちらの記事を参考に日本リージョンに合わせて設定を行います。細かい点が知りたい場合は以下リンクを参照してください。

Azure GPU Tensorflow Step-by-Step Setup

キーワード

まずは今回使う各単語をさっくり端的に説明します。参考リンクを貼って置くので詳しいことを知りたい方はリンク先を参照してください。

GPUとは

CPUと比較して並列処理が得意。もともと画像処理がメインの仕事だったが、大量に計算をする機械学習で活躍する。

Deep learningに必須なハード:GPU

Azureとは

Microsoftが提供するクラウドサービス。仮想環境にサーバを立てることなどができる。

そもそも Microsoft Azure とは?

Tensorflowとは

Googleが開発したディープラーニング用のライブラリ。

ビッグデータを分散学習するDeep LearningライブラリTensorFlowとは

Kerasとは

TensorflowやTheaoなど初心者には手を出しにくいライブラリを簡単に扱えるようにするラッパーライブラリ。

Deep learningで画像認識⑤〜Kerasで畳み込みニューラルネットワーク vol.1〜

MNISTとは

手書き文字の画像データセットで、画像認識を試す際によく使われます。

Deep learningで画像認識⑤〜Kerasで畳み込みニューラルネットワーク vol.1〜

Azure VMでGPUインスタンスを作成

AzureのVirtual Machineを立てます。

GPUを使えるインスタンスは限られているので気をつけましょう。日本では今の所NVシリーズから選ばなくてはいけません。

Nシリーズについては先日NVIDIA, Microsoft主催のローンチイベントに参加して詳しくまとめたので詳しく知りたい方は以下の記事をご確認ください。

Japan Azure NV シリーズ ローンチイベントに参加しました

まずはAzureにログインし、ポータルを開きます。まずはAzureにログインし、ポータルを開きます。

左のメニューバーから「Virtual Machine」を選択します。
するとVMの画面が開かれるので、左上の「追加」ボタンからVMを作成します。

まずはOSを選択します。
「Ubuntu 16.04 LTS」にします。

デプロイモデルは特にいじらず、そのまま「作成」を押します。

名前や認証情報などの必須項目を入力します。
注意点ですが、「VMディスクの種類」はSSDからHDDに変更します。

インスタンスのタイプを決定します。
1つ前の設定で東日本リージョンを選んだ場合はNVシリーズから選択します。

2017年6月現在、NVシリーズには「NV6」、「NV12」、「NV24」の3種類があります。
数字が大きいほどコア、RAMなど性能が高くなりますが、その分利用料も高くなるので用途に合わせて使いましょう。

今回のようにとりあえず使ってみる場合はNV6で十分です。

3、4で内容を確認して「OK」すれば、ポータルのトップ画面に戻りインスタンスの作成が始まります。
しばらく時間がかかるので待ちます。

Tensorflowセットアップ

この間に後ほど使うものを準備します。

NVIDIAのサイトからcuDNNをダウンロードします。

ダウンロードリンクは以下のものですが、まずはメンバー登録する必要があります。リンク先の指示に従ってください。

cuDNN Download

CUDAやcuDNNについては以下のリンクを参照ください。

Deep learningに必須なハード:GPU

「Download cuDNN v5.1 (Jan 20, 2017), for CUDA 8.0」を開き、
「cuDNN v5.1 Library for Linux」をダウンロードします。

ダウンロードが終わる頃にはインスタンスが起ち上がっていると思います。

以降の作業はインスタンスにSSH接続して行います。

Microsoft社員のLee StottさんがGithubに公開しているシェルスクリプトを使います。

Githubからcloneしてきて、まずはpart1を実行します。

ドライバなどのインストールを自動で行ってくれます。

git clone https://github.com/leestott/Azure-GPU-Setup.git
./gpu-setup-part1.sh
part1

gpu-setup/ ディレクトリに先ほどNVIDIAからダウンロードしたcudnn-8.0-linux-x64-v5.1.tgzをscpなりftpなりで置きましょう。

part2を実行します。

./gpu-setup-part2.sh
part2

テストコードを実行してみます。

source ~/.bashrc
python gpu-test.py
test

こんな感じで実行結果が出ます。

これでセットアップ完了です。

GPUマシンが用意でき、TensorflowでGPUを利用することができるようになりました。

Python環境、Kerasセットアップ

次はKerasを用意してMNISTを実行してみます。

今回はpyenvも併用します。

sudo apt-get install git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
cd /usr/local/bin
git clone git://github.com/yyuu/pyenv.git ./pyenv
sudo mkdir -p ./pyenv/versions ./pyenv/shims
echo 'export PYENV_ROOT="/usr/local/bin/pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
pyenv

続いてpyenvを使ってanacondaをインストールします。

利用するバージョンをanacondaに変更して、pipでtensorflowとkerasをインストールします。

pyenv install anaconda3-4.3.0
pyenv rehash
pyenv global anaconda3-4.3.0
pip install tensorflow-gpu keras
anaconda

準備が完了したので、以下のサイトを参考にMNISTを実行します。

Python: Keras/TensorFlow の学習を GPU で高速化する (Mac OS X)

まずは対話モードを開いて、MNISTのデータセットをダウンロードします。

python
>>> from keras.datasets import mnist
>>> mnist.load_data()
mnist_data

次にサンプルプログラムをダウンロードします。

参考サイトの忠告通りにリソースの解放を追記します。

curl -O https://raw.githubusercontent.com/fchollet/keras/master/examples/mnist_cnn.py
echo 'K.clear_session()' >> mnist_cnn.py
mnist_code

プログラムを実行しましょう。

timeコマンドを使うことで実行に要した時間を計測できます。

time python mnist_cnn.py
test_mnist

実行にかかった時間は2分弱でした。
ちなみに同様にMac book Proでプログラムを実行したところ1時間ほどかかりました。

約30分の1と、圧倒的ですね。

以上、クラウドのGPUを使ってディープラーニングを行う環境構築についてまとめました。

未だ気軽に購入するには高価なGPUですが、クラウドなら利用した時間分の課金で済みます。

AzureのNV6ならば¥162.18/時間です(東日本リージョン)。

ちょっと試してみるには経済的に済みますのでおすすめです。

ただし、使い終わったVMを停止するのを忘れないようにしましょう。

うっかり付けっ放しで放置したら、1日につき4000円弱が飛んでいきます。