Azure Batch AI で CNTK ジョブを実行する #batchai #cntk

Azure Batch AI は、名前の通り AI 用の Azure Batch サービスです。

高性能な GPU マシンを、学習モデルをトレーニングする時だけデプロイして使用できるもの です。
ジョブを開始すると自動的にデプロイされて、トレーニングが終了すると自動的にリソースが解放されるので、仮想マシンやリソースの課金を極力抑えることができます。しかも自動的にスケールする機能も持っています。

開発やデバッグを行うための環境ではないので、ローカルPCや DSVM (Data Science Virtual Machine) を使って事前にスクリプトやデータがきちんと用意する必要はあります。ハイパーパラメーターを変えながら、何度もトレーニングを繰り返す時に便利です。

Azure CLI で、Get-Started 通りに、環境を作るところからジョブ実行、最後に実行結果の取得までをやってみたので、ステップバイステップで画面キャプチャーとともに紹介します。
せっかくなので(?)、コマンド実行後に何が起こるのか、Azure の管理ポータルでの表示も併せて載せてみます。(多分コマンドプロンプトで操作するほうが楽ですが、逆に管理ポータルでも同じような操作でジョブ実行ができるということです)


■ Azure CLI インストール(※Batch AI 使用の初回のみ)

まず Azure CLI をインストールします。ローカルPC ごとに、初めて Batch AI を使用する時に一度だけ実行すれば OK。

このページ に OS ごとのインストール方法が載っていますので、それに沿ってインストールします。
Windows の場合は、インストーラーをダウンロードして実行します。


■ ログイン

Azure CLI のコマンドプロンプトを開いてログインします。
あとでスクリプトやデータをストレージにアップロードするので、その作業用のディレクトリーに移動して実行するのがいいかも(もちろん必須ではありませんが)。

az login

 

az_login

デバイスログインページの URL (https://aka.ms/devicelogin) と認証用のコードが返されるので指示に従います。認証されたらブラウザーは閉じてもかまいません。

devicelogin_page

コマンドプロンプトにサブスクリプション情報が返されます。

devicelogin_ok

この出力は見づらいので SubscriptionId が見やすいように次のコマンドを実行します。

az account list -o table

az_account_list

Batch AI で使うサブスクリプションを指定します。

az account set -s <subscriptionId>

az_account_set

必須ではありませんが、適切なサブスクリプションを指定されたか確認するには、次のコマンドを実行します。

az account show

az_account_show


■ Batch AI のプロバイダーを登録 (※Batch AI を実行するサブスクリプションごとに一度だけ)

サブスクリプションごとに一度だけ、Batch AI のプロバイダーを登録します。(※私の環境では既に登録済みのため、下の画面キャプチャーではその旨のメッセージになっています)

az provider register -n Microsoft.BatchAI
az provider register -n Microsoft.Batch

register_provider

プロバイダー登録には時間がかかります。
Get Started ページには「15分くらい」と書いていますが、場合によってはもう少しかかるかも。
登録完了を確認するには、以下のコマンドを実行してください。なにやら JSON なレスポンスが返ってきたら登録完了です。

az provider show -n Microsoft.BatchAI
az provider show -n Microsoft.Batch

az_provider_show


■ リソースグループの作成

リソースグループを作ります。

az group create --name BatchAiTestGroup --location westus2

az_group_create

“–name” のあとがリソースグループ名、”–location” のあとがリージョンです。米国西部2 が比較的リーズナブルですかね。(Batch AI だと、実際の課金はリージョンによってそれほど大きくは違わないとはいえ、少しでもお安いほうがいいですね)

管理ポータルで見ると、確かにリソースグループが作られています。

portal_resoucegroupportal_resoucegroup_empty

この後の作業で、間違って他のリソースグループ、他のリージョンを使わないように、デフォルトを設定しておきます。

az configure --defaults group=BatchAiTestGroup
az configure --defaults location=westus2

az_configure_defaults


■ ストレージアカウントおよびファイルシェアの作成

次に、ジョブとして実行するスクリプトファイルや(必要に応じて)入力ファイルを配置するストレージアカウントを作成します。

az storage account create --name <ストレージアカウント名> --sku Standard_LRS

storageaccount_create

ストレージ冗長は LRS でいいでしょう。ジョブ実行に失敗したとしてももう一度実行しなおせばいいわけですし。

ポータルで見ると、当然こうなります。

portal_storageaccount

ストレージアカウントが作成できたら、この後の手順で必要になるキーを確認しておきます。

az storage account keys list --account-name <ストレージアカウント名>

storageaccount_keyslist

ストレージアカウントにファイルシェアを作成します。

az storage share create --account-name <ストレージアカウント名> --name batchaiquickstart
az storage directory create --account-name <ストレージアカウント名> --account-key <キー> --share-name batchaiquickstart --name mnistcntksample

storageshare_create

ファイルシェア名、ディレクトリ名は、もちろんご自由に。

ポータルで見ても、確かにできてます。

portal_storageaccount_for_fileshareportal_storageaccount_fileshare

 

以上で、環境の構築は完了です。続いてジョブ実行の準備に進みます。


■ ファイルのアップロード

バッチジョブで実行するスクリプトファイル、および今回の例では入力データをストレージにアップロードします。

今回はチュートリアルで用意されたファイルをそのまま使います。こちらからダウンロード できます。ダウンロードした ZIP ファイルはあらかじめ展開しておきます。

アップロードするファイル 3個が用意できたところで、アップロードを行います。

az storage file upload --account-name <ストレージアカウント名> --account-key <キー> --share-name batchaiquickstart --source Train-28x28_cntk_text.txt --path mnistcntksample
az storage file upload --account-name <ストレージアカウント名> --account-key <キー> --share-name batchaiquickstart --source Test-28x28_cntk_text.txt --path mnistcntksample
az storage file upload --account-name <ストレージアカウント名> --account-key <キー> --share-name batchaiquickstart --source ConvNet_MNIST.py --path mnistcntksample

files_upload

ポータルで見るとこうなります。

portal_uploaded_files


■ バッチ実行用のクラスター作成(実際にはシングルノード)

バッチ実行のための仮想マシンを作成します。Batch AI のメリットとして自走スケールがあるのですが、現時点ではシングルノードです。(私がやり方を知らないだけ)

az batchai cluster create --name mycluster --vm-size STANDARD_NC6 --image UbuntuLTS --min 1 --max 1 --storage-account-name <ストレージアカウント名> --afs-name batchaiquickstart --afs-mount-path azurefileshare --user-name <ユーザー名> --password <パスワード>

cluster_create

ポータルを見るとちゃんとクラスターができています。

portal_cluster_createdportal_cluster_preparing

作成には時間がかかるので、時々以下のコマンドを実行して状況を確認します。

az batchai cluster list -o table

“Idle” が 1 になれば、クラスターは完成です。

cluster_list_table

ポータルでも作成中は “Prepare” ですが、完成すれば “Idle” になります。

portal_cluster_idle

ようやくクラスターまで完成しました。これでジョブを実行する準備は終了です。

ここまでの手順はジョブの定義ごとに一度だけでいい内容なので、Azure 管理ポータルでやってもいいかもしれません。


■ ジョブの作成

いよいよジョブを作成して、実行します。

まずはジョブ作成から。

以下の内容を、”job.json” というファイル名でローカルに保存します。UTF-8 にするのをお忘れなく。

{
 "properties": {
     "stdOutErrPathPrefix": "$AZ_BATCHAI_MOUNT_ROOT/azurefileshare",
    "inputDirectories": [{
         "id": "SAMPLE",
         "path": "$AZ_BATCHAI_MOUNT_ROOT/azurefileshare/mnistcntksample"
     }],
     "outputDirectories": [{
         "id": "MODEL",
         "pathPrefix": "$AZ_BATCHAI_MOUNT_ROOT/azurefileshare",
         "pathSuffix": "model",
         "type": "custom"
     }],
     "containerSettings": {
         "imageSourceRegistry": {
             "image": "microsoft/cntk:2.1-gpu-python3.5-cuda8.0-cudnn6.0"
         }
     },
     "nodeCount": 1,
     "cntkSettings": {
         "pythonScriptFilePath": "$AZ_BATCHAI_INPUT_SAMPLE/ConvNet_MNIST.py",
         "commandLineArgs": "$AZ_BATCHAI_INPUT_SAMPLE $AZ_BATCHAI_OUTPUT_MODEL"
     }
 }
}

CNTK のバージョンが 2.1 になっています。この辺りは改めて見てみたいと思っています。

ジョブ内容を定義するファイルを作ります。
以下の内容を、ローカル PC に job.json という名前で保存します。UTF-8 にするのをお忘れなく。

job.json を保存したフォルダーで、以下を実行します。クラスターでジョブが実行されます。

az batchai job create --name myjob --cluster-name mycluster --config job.json

job_create

次のコマンドでジョブの実行状態を確認できます。

az batchai job list -o table

job_list_table_runningportal_job_running

“Running” だと実行中です。ポータルで見ても同じ。

少し待ってから改めてコマンドを実行すると “Succeeded” になります。これでジョブ実行が成功。ポータルでは、”Running” から “Idle” に戻ればジョブが終了しています。

job_list_succeeded

実行結果(標準出力、標準エラー出力)は以下のコマンドで取得できます。

az batchai job stream-file --job-name myjob --output-directory-id stdouterr --name stderr.txt

job_outerr

ポータルでは、バッチの準備で作ったストレージアカウントにファイルがあるのが見えます。これをダウンロードすれば実行結果が分かります。

portal_outerr

なお、多少前後しますが、ジョブ実行に終了すると、ポータルの Batch AI Job ブレードでは実行時間が分かります。
また、実行結果の標準出力、標準エラー出力のファイルはここでも見ることができます。

portal_job_result

おつかれさまでした、Batch AI で準備、実行、結果の確認ができました。

これで高速に、でも、できるだけコストをかけずに学習できますね。
Azure Machine Learning Workbench で Batch AI が使えるようになるともっと便利になりますね。これについては、Batch AI 側も Workbench 側も更新を待ちましょう。


■ リソースの削除

最後に、不要になったリソースを削除する手順。

以下のコマンドを実行します。
見た通りですが、ジョブを削除して、クラスターを削除して、リソースグループを削除します。

az batchai job delete --name myjob
az batchai cluster delete --name mycluster
az group delete --name myResourceGroup

が、ポータルでリソースグループごと削除するのが簡単ですね。

広告
カテゴリー: Batch AI, CNTK, 深層学習 タグ: , , パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

w

%s と連携中