Azure Batch AIでCNTKのサンプルプログラムを動かしてみる（その3:ジョブ実行編）

# はじめに
本稿では[前回](https://qiita.com/masa_sato/items/c8f93b20fc25398b3fe6)までに引き続き、Azure Batch AIでCNTKのサンプルジョブを実行してみます。
今回は、BatchAIクラスターでのジョブ実行を試してみます。

# Batch AIサンプルジョブ実行
今回は、Github上でMicrosoftが公開している[サンプルプログラム](https://github.com/Azure/BatchAI/tree/master/recipes/CNTK/CNTK-GPU-BrainScript)を利用して、MNISTデータセットを使ったCNNの学習処理を行うジョブを作成してみます。
## ジョブ実行手順
### 1. サンプルプログラムのデータをダウンロード
　i. [こちら](https://batchaisamples.blob.core.windows.net/samples/mnist_dataset.zip?st=2017-09-29T18%3A29%3A00Z&se=2099-12-31T08%3A00%3A00Z&sp=rl&sv=2016-05-31&sr=c&sig=PmhL%2BYnYAyNTZr1DM2JySvrI12e%2F4wZNIwCtf7TRI%2BM%3D)からMNISTデータセットのファイルをダウンロードします。
　※Zipファイルになっており、展開するとTrain-28x28_cntk_text.txt、Test-28x28_cntk_text.txtの2ファイルが入っています。
　ii. [こちら](https://github.com/Azure/BatchAI/blob/master/recipes/CNTK/CNTK-GPU-BrainScript/ConvNet_MNIST.cntk)からConvNet_MNIST.cntkを取得します。
　※[こちら](https://github.com/Azure/BatchAI)の「Clone or download」ボタンから、関連ファイル一式をまとめてダウンロードできます。
### 2. プログラムとデータをAzure File Storageにアップロード
　i.  Azure File Storageにディレクトリ作成
　　[前回](https://qiita.com/masa_sato/items/c8f93b20fc25398b3fe6)作成したファイル共有に、ディレクトリを3つ作成します。(「external」「cntk_samples」「mnist_dataset」)
　　![06_02_ファイルアップロード01.png](https://qiita-image-store.s3.amazonaws.com/0/204058/735504e9-ec6a-3333-bd73-132b045406e8.png)
　　![06_02_ファイルアップロード02.png](https://qiita-image-store.s3.amazonaws.com/0/204058/df4233c6-6af4-9b0e-3552-c041328783e9.png)
　ii. mnist_datasetに1-i.で取得したTrain-28x28_cntk_text.txt、Test-28x28_cntk_text.txtを、cntk_samplesに1-ii.で取得したConvNet_MNIST.cntkを、それぞれアップロードします。
　　![06_02_ファイルアップロード04.png](https://qiita-image-store.s3.amazonaws.com/0/204058/445e2614-d6db-cab9-e565-f050dd11deb9.png)

### 3. ジョブの作成・実行 
　i. まず、ポータルの[すべてのサービス]→[バッチ AI]→[概要]→前回作成したBatch AIクラスター名を選択します。 
　　![06_01_BatchAIジョブ作成01.png](https://qiita-image-store.s3.amazonaws.com/0/204058/1c32dece-3025-8f99-0f43-50342c7db107.png)

　ii. [概要]→[+追加 Batch AI ジョブ]から、ジョブを作成します。
　　![06_01_BatchAIジョブ作成02.png](https://qiita-image-store.s3.amazonaws.com/0/204058/e74bd3f2-cd12-bf6f-1f4e-b903c53db8e0.png)

　iii. ジョブ名称(任意の名称)を入力し、サブスクリプション・優先度・ノード数・利用するBatch AIクラスター(前回の手順で作成したもの)を選択します。
　　※実験名は空欄でも実行できます。
　　![06_01_BatchAIジョブ作成03.png](https://qiita-image-store.s3.amazonaws.com/0/204058/30bbe092-27be-d9f7-76b0-0f68b64158a1.png)

　iv. [ツールの種類]で「CNTK」を選択すると、CNTK実行のための設定項目が表示されます。
　　・ [言語の種類]では、今回BrainScriptを利用するので「BrainScript」を選択します。
　　・ [構成ファイル]では、実行するCNTKファイルのパスを入力します。
　　　（今回は「\$AZ_BATCHAI_INPUT_CONFIG/Convnet_MNIST.cntk」と入力します。）
　　・ [コマンドライン引数]では、CNTKファイル実行時の引数を指定します。
　　　（今回は、「rootDir=. dataDir=\$AZ_BATCHAI_INPUT_DATASET outputDir=\$AZ_BATCHAI_OUTPUT_MODEL」と入力します。）
　　　※「\$AZ_BATCHAI_INPUT_CONFIG」「\$AZ_BATCHAI_INPUT_DATASET」「\$AZ_BATCHAI_OUTPUT_MODEL」については、後述します。
　　![06_01_BatchAIジョブ作成04.png](https://qiita-image-store.s3.amazonaws.com/0/204058/3f271d85-3834-3bef-2888-0a395463d194.png)

　v. 標準出力の出力先と入力ディレクトリ(CNTKファイルやデータセットの参照先)を指定します。
　　今回は、
　　・ ID: CONFIG、 パスプレフィックス：\$AZ_BATCHAI_MOUNT_ROOT/external、パスのサフィックス： cntk_samples
　　・ ID: DATASET、 パスプレフィックス：\$AZ_BATCHAI_MOUNT_ROOT/external、パスのサフィックス： mnist_dataset
　　の2つを登録します。
　　※IDは $AZ_BATCHAI_(INPUT or OUTPUT)_[ID名]として、変数に追加されます。
　　※パスのサフィックスは、2.で作成したディレクトリ名です。
　　※[追加]ボタン押下後、ID/パスが空欄だと[選択]を押せないケースがあるようです。
　　　その場合、ID/パスのところに任意の適当な文字を入れておくと、[選択]を押せるようになります。
　　　(実際に登録されるのは、入力欄の下に表示された項目のみです。)
　　![06_01_BatchAIジョブ作成05.png](https://qiita-image-store.s3.amazonaws.com/0/204058/37526e8e-f895-43ea-ea01-6533ce5d85bc.png)

　vi. 出力ディレクトリ(モデルファイルの出力先)を指定します。
　　![06_01_BatchAIジョブ作成06.png](https://qiita-image-store.s3.amazonaws.com/0/204058/d38ef67a-2e67-a783-1d01-69f41cc1f5f4.png)

　vii. コンテナーの設定で、CNTK実行環境のコンテナイメージを選択します。
　　今回は、「microsoft/cntk:2.1-gpu-python3.5-cuda8.0-cudnn6.0」のイメージを選択します。
　　![06_01_BatchAIジョブ作成07.png](https://qiita-image-store.s3.amazonaws.com/0/204058/1f75d220-d9ea-087a-91f0-dd4279bc2291.png)
　[OK]ボタンを押すと、ジョブが登録され、クラスタ上で実行されます。
　　※クラスターメニューの[ジョブ]から、登録したジョブ名を選択すると、実行状況を確認することが出来ます。
　　![06_02_ジョブ実行03.png](https://qiita-image-store.s3.amazonaws.com/0/204058/dec6fb03-251b-72e1-91d9-bb2c7576bcaf.png)
　　ファイル共有を確認すると、サブスクリプションID名のディレクトリが作成されており、その下層をたどっていくと、出力されたモデルファイルやログが格納されています。
　![06_02_ジョブ実行04.png](https://qiita-image-store.s3.amazonaws.com/0/204058/215385eb-e04e-9056-a801-de9781c014b2.png)

これまで、CNTKを呼び出すにはpython等で色々コードを書く必要がありましたが、BatchAIではGUIが拡充されており、
コードをあまり書かなくても、モデル作成まで実施できるようになっています。
クラスタの増減も簡単にできる為、DeepLearningをちょっと試してみたい、という時にはかなり便利かもしれません。

## 補足
クラスタを使わないときは、Batch AIのクラスターメニュー→[スケール]から、[ノードのターゲット数]を「0」に指定するとノードが削除されるため、ノードの課金が停止されます。
　※[ノードのターゲット数]が1以上だと、ノード数分の課金がかかり続けるので注意が必要です。
　　(特に、GPUを使えるNシリーズは単価が高いのでご注意ください..)
　　![06_05_クラスタ削減.png](https://qiita-image-store.s3.amazonaws.com/0/204058/39d3ff7c-a62a-4009-da21-a53ca1059e20.png)