Azure Batch AIでCNTKのサンプルプログラムを動かしてみる（その1:BatchAI準備編）

# はじめに
機械学習・深層学習をする際は、まずグラフィックボード入りの端末や仮想マシンを準備して、必要に応じてクラスタ構成を組む、等のインフラ側の準備が必要ですが、最近これらのインフラ構築を簡略化するサービスが出始めています。
今回は、それらのサービスのうち、Azure Batch AIを利用して、深層学習プログラムを実行してみたいと思います。
※Batch AIのサービス利用開始までの準備作業手順が多いため、準備編とジョブ実行編に分けて掲載します。

# Azure Batch AIとは？
Microsoft Azure上で、深層学習・機械学習向けの仮想インフラ構築が出来るサービスです。2017年5月に "Azure Batch AI Training" (Private Preview)という名称で発表されていましたが、2017年10月にPublic Previewとなった際に名称変更されたようです。
(本稿ではこれ以降、「Batch AI」と記載します。)
[参考]
・ https://azure.microsoft.com/ja-jp/updates/public-preview-azure-batch-ai/
・ https://docs.microsoft.com/en-us/azure/batch-ai/
## Batch AI でできること
Batch AIでは、機械学習・深層学習のトレーニングやモデル作成を行う為のリソース管理とジョブスケジューリングの機能を利用することができます。
[参考]
・ https://docs.microsoft.com/ja-jp/azure/batch-ai/overview

主な機能は下記の通りです。
- **リソース管理**
　* VMクラスタの作成(VMはGPU有り/CPUのみのどちらも選択可能。)
　* クラスタの自動or手動スケーリング　
　* VM間のSSH通信設定とリモートアクセス
　* (Azure Storageへ出力する場合)streamingを含む各種ログ・出力ファイルへのアクセスが可能(出力ログ/stdout/stderr/モデル)
- **ジョブ実行管理**
　* バッチジョブの実行、繰り返し、インタラクティブトレーニング
　* 優先度を考慮したジョブキュー設定が可能
　* 低優先度VM（共有インスタンス）やリザーブドインスタンスが利用可能。(ジョブ優先度に応じて使い分け、コスト抑制が可能)
　* VM障害発生時に再起動とジョブステータス提供が可能
- **サポートされるリソース**
　* 深層学習・機械学習フレームワーク
　　+ CNTK、TensorFlow、Chainer等をサポート
　* ストレージ
　　+ Azure Files、マネージドNFSサーバ等をストレージとして利用可能
　　+ リモートファイル共有をVMやコンテナからマウント可能
　* 管理プログラム開発
　　+ Azure CLI、Batch AI SDK(Python・C#・Java)での開発が可能
　　+ Azureポータルの監視機能を利用可能
　　+ Microsoftの各種AI(開発)ツールとの統合
　　+ 認証・役割ベースのアクセス制御としてAzure Active Directoryを利用可能

# Batch AI利用のための準備
##前提条件
Batch AIを利用するためには、下記が必要となります。
1. **Azureサブスクリプション**：無料トライアルサブスクリプション、MSDN、各種有償サブスクリプションのどれでも可。
2. **Azure-Python SDK (azure-mgmt-batchai)もしくはAzure CLI 2.0**：Python Jupyter notebookを使用する場合は[Azure-Python SDK](https://docs.microsoft.com/ja-jp/azure/python-how-to-install)、コマンドラインから実行したい場合は[Azure CLI 2.0](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest#install-on-windows)を使用します。 インストール方法は、それぞれのリンク先をご参照ください。
3. **Azure Storageアカウント**： 作成方法は[こちら](https://docs.microsoft.com/ja-jp/azure/storage/common/storage-create-storage-account)をご参照ください。※本稿時点(2018年3月)ではBatch AIを利用可能なリージョンが限られているので、米国東部リージョンなどでの作成をおススメします。

## Batch AIのサービスを利用するための準備
Batch AIを利用するためには、(利用するサブスクリプションに対して初回のみ)下記手順を実行する必要があります。

#### **BatchAIリソースプロバイダの登録**
　1. [Azureポータル](https://portal.azure.com)にログインします。
　2. [すべてのサービス]→[サブスクリプション]を選択します。
　　　<img width="343" alt="04_BatchAI_01_事前準備_12_サブスクリプション選択.png" src="https://qiita-image-store.s3.amazonaws.com/0/204058/95473139-3b69-ec51-411a-57250cad57ff.png">
　3. BatchAIで利用するサブスクリプションを選択し、メニューから[リソースプロバイダ]を選択します。
　4. [Microsoft.BatchAI]と[Microsoft.Batch]の[登録]をそれぞれクリックすると、サブスクリプションにリソースプロバイダが登録されます。
　　(リソースプロバイダは種類が多いですが、検索窓に"Batch"等の単語を入力して絞り込むことが可能です。)
　　　<img width="583" alt="04_BatchAI_02_事前準備_02_リソースプロバイダ登録.png" src="https://qiita-image-store.s3.amazonaws.com/0/204058/2086cf2a-cec2-a8d7-3f61-99a826d741ac.png">
　　※プロバイダの登録には最大15分程度かかります。
　　　　<img width="286" alt="04_BatchAI_02_事前準備_03_リソースプロバイダ登録2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/204058/ea4e95a2-4240-a413-4a16-24b069d08fb8.png">
　　　登録完了すると、[状態]の項目が[Registering]→[Registered]となります。
　　　　<img width="282" alt="04_BatchAI_02_事前準備_04_リソースプロバイダ登録3.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/204058/24d4246d-4dd8-a14c-796b-d47223bebef3.png">

#### **サービスプリンシパル認証の資格情報を作成する**
Python SDKを利用する場合、アカウント認証ではなく、サービスプリンシパル認証を利用する必要があります。
設定手順は下記の通りです。
　　1. [Azureポータル](https://portal.azure.com)にログインします。
　　2. [すべてのサービス]→[Azure Active Directory]を選択します。
　　　　<img width="343" alt="04_BatchAI_01_事前準備_02_AAD選択.png" src="https://qiita-image-store.s3.amazonaws.com/0/204058/e293ca9c-ab5e-372b-d9eb-2bbbbfbd19c3.png">
　　3. Azure Active Directoryの[プロパティ]を選択し、ディレクトリIDをコピーします。
　　　　<img width="448" alt="04_BatchAI_01_事前準備_03_AAD_ID取得.png" src="https://qiita-image-store.s3.amazonaws.com/0/204058/5837a719-6adc-425e-3c6a-b1bc16ff3067.png">
　　4. Azure Active Directoryのメニューから、[アプリの登録]→[＋新しいアプリケーションの登録]を選択します。
　　　　<img width="673" alt="04_BatchAI_01_事前準備_04_AAD_新規アプリ作成.png" src="https://qiita-image-store.s3.amazonaws.com/0/204058/2437a013-9a12-c741-1a3f-288b9ed62998.png">
　　5. アプリケーションの名前（任意の名称でOK）とURL(とりあえず架空のURLでも作成可能)を入力します。
　　　　[アプリケーションの種類]は[Webアプリ/API]を選択します。
　　　　各項目を設定したら、[作成]を選択します。
　　　　<img width="170" alt="04_BatchAI_01_事前準備_05_AAD_新規アプリ作成2.png" src="https://qiita-image-store.s3.amazonaws.com/0/204058/dee1f1be-a4a3-f21f-7c0e-8cf078caf58e.png">
　　6. Azure Active Directoryのアプリケーション登録から、アプリケーションを選択します。
　　　 ※上記で作成したアプリがリストに表示されない場合は、プルダウンメニューから[すべてのアプリ]を選択してください。
　　　　<img width="415" alt="04_BatchAI_01_事前準備_06_AAD_作成アプリ選択1.png" src="https://qiita-image-store.s3.amazonaws.com/0/204058/51b5a69a-889e-5778-afc8-9c0d0411754b.png">
　　　　<img width="424" alt="04_BatchAI_01_事前準備_07_AAD_作成アプリ選択2.png" src="https://qiita-image-store.s3.amazonaws.com/0/204058/9781fc43-27e0-464d-3e3d-45d07b207b79.png">
　　7. 作成したアプリを選択すると、アプリケーションの概要が表示されるので、
　　　　「アプリケーションID」の項目をコピーします。これがAzure Active DirectoryクライアントIDです。
　　　　<img width="345" alt="04_BatchAI_01_事前準備_08_AAD_アプリID取得.png" src="https://qiita-image-store.s3.amazonaws.com/0/204058/679ff9b2-b33a-5b0d-5ca6-38c30fab562c.png">
　　8. 作成したアプリの認証キーを生成するため、[設定]→[キー]を選択します。
　　　　<img width="447" alt="04_BatchAI_01_事前準備_09_AAD_アプリキー取得.png" src="https://qiita-image-store.s3.amazonaws.com/0/204058/b66217f6-4d89-b750-9dac-3e9e441326ae.png">

　　9. キーの[説明]　(任意の名称)と[有効期限]　(1年/2年/期限なし)を入力します。入力したら、[保存]を選択します。
　　　　<img width="588" alt="04_BatchAI_01_事前準備_10_AAD_アプリキー取得2.png" src="https://qiita-image-store.s3.amazonaws.com/0/204058/ea968a41-cc1d-29ca-ac5d-2935c425ea4d.png">
　　10. キーを保存すると、キーの値が表示されます。(図のグレーの箇所に表示されます。)
　　　　画面遷移してしまうと、後からキーの値を再表示することが出来ないため、この場で忘れずにキーの値をコピーしてください。
　　　　<img width="427" alt="04_BatchAI_01_事前準備_11_AAD_アプリキー取得3.png" src="https://qiita-image-store.s3.amazonaws.com/0/204058/95315f8e-c346-d942-51f9-440cd024bd2a.png">
　　11. 作成したアプリにサブスクリプションのロールを割り当てます。（[すべてのサービス]→[サブスクリプション]を選択します。）
　　　　<img width="343" alt="04_BatchAI_01_事前準備_12_サブスクリプション選択.png" src="https://qiita-image-store.s3.amazonaws.com/0/204058/4c68696d-9aaa-dd7f-aa79-ab037e06491a.png">
　　12. Azure Batch AIに使用するサブスクリプションを選択し、[アクセス制御(IAM)]→[追加]を選択します。
　　　　<img width="588" alt="04_BatchAI_01_事前準備_13_サブスクリプションIAM追加.png" src="https://qiita-image-store.s3.amazonaws.com/0/204058/e8d40281-9af1-85db-7453-8377d6fc8df5.png">
　　13. [アクセス許可の追加]にて、[役割]に[共同作成者]、[アクセスの割り当て先]に[Azure ADのユーザー、グループ、またはアプリケーション]を選択します。
　　　　[選択]の項目に、上記で作成したアプリの名称を入力すると、下のリスト領域にアプリが表示されるので、そちらを選択します。
　　　　(アプリ名の先頭数文字を入力するだけで検索可能です。また、リスト領域にはADユーザー等が表示されますが、アプリは[選択]から検索をかけないと表示されないようです。)
　　　　<img width="210" alt="04_BatchAI_01_事前準備_14_サブスクリプションIAM追加2.png" src="https://qiita-image-store.s3.amazonaws.com/0/204058/2c17996a-4a59-6e81-7635-d639d415ab82.png">
　　14. 「保存」を選択してロールの割り当てを完了します。
　　　　<img width="207" alt="04_BatchAI_01_事前準備_15_サブスクリプションIAM追加3.png" src="https://qiita-image-store.s3.amazonaws.com/0/204058/2d295086-c75e-52ef-e087-f28068fc5243.png">
　　15. [アクセス制御(IAM)]画面に戻ると、上記で割り当てたロールのリストに、今回作成したアプリが表示されます。
　　　　<img width="309" alt="04_BatchAI_01_事前準備_16_サブスクリプションIAM追加4.png" src="https://qiita-image-store.s3.amazonaws.com/0/204058/61440a0c-e074-dd7c-182f-40d8a1e0d7ab.png">
※上記で取得したAzure Active DirectoryクライアントIDとアプリケーションキーを、Pythonプログラム内での認証に利用します。

#### **サブスクリプションにBatch AIの"Network共同作成者"ロールを付与する**
　1. BatchAIで利用するサブスクリプションを選択し、メニューから「アクセス制御(IAM)」→「＋追加」を選択します。
　　　　<img width="576" alt="04_BatchAI_03_事前準備_03_ロール付与(IAM追加).png" src="https://qiita-image-store.s3.amazonaws.com/0/204058/b5ac9bee-2259-a960-02dd-c6a606c25cc0.png">
　2. [アクセス許可の追加]にて、[役割]に[ネットワーク共同作成者]、[アクセスの割り当て先]に[Azure ADのユーザー、グループ、またはアプリケーション]を選択します。
　3. [選択]の項目に文字("Microsoft Azure BatchAI"の先頭数文字)を入力すると、下のリスト領域にアプリが表示されるので、その中から[Microsoft Azure BatchAI]を選択します。
　　　　(こちらも上記と同じく、[選択]から検索をかけないとリスト領域に表示されないようです。)
　　　　<img width="209" alt="04_BatchAI_03_事前準備_04_ロール付与(IAM追加)2.png" src="https://qiita-image-store.s3.amazonaws.com/0/204058/33ae715a-aaa2-3eb3-777d-af8b6a8fc855.png">
　4. 「Save」を選択すると、ロールが割り当てられます。
　　　　<img width="210" alt="04_BatchAI_03_事前準備_05_ロール付与(IAM追加)3.png" src="https://qiita-image-store.s3.amazonaws.com/0/204058/52d87910-557a-731f-b3af-e940e2a6bf72.png">
　　　

## Batch AI開発環境の準備
#### **Batch AI管理クライアントのインストール**
コマンドプロンプト等から下記コマンドを使用して、Batch AI管理クライアントをインストールします。
(事前にPythonをインストールしておく必要があります。) 

``` cmd
pip install azure-mgmt-batchai
```

#### **Azure Python SDKをインストールする**
Batch AIではAzureの各種サービス（Azureストレージ、資格情報など）のAPIを利用するため、Azure Python SDKのパッケージをインストールする必要があります。
※インストール方法は[こちら](https://docs.microsoft.com/ja-jp/azure/python-how-to-install)をご参照ください

#### **Jupyterノートブックをインストールする**
Jupyter Notebookを[こちら](https://jupyter.org/)からインストールするか、下記コマンドを実行してください。

```CMD
python -m pip install jupyter
```

ここまででBatch AIを利用するための準備は完了です。
クラスタ作成～ジョブの実行については、次回に記載します。

#次回
Azure Batch AIのクラスタを作成し、サンプルジョブを実行してみます。