クイック スタート: Batch AI を使用してディープ ラーニング モデルをトレーニングする

このクイック スタートでは、Batch AI によって管理されている GPU 対応仮想マシンでサンプル ディープ ラーニング モデルをトレーニングする方法について説明します。 Batch AI は、データ サイエンティストや AI 研究者が、Azure 仮想マシンのクラスター上で、AI および機械学習モデルを大規模にトレーニングするためのマネージド サービスです。

この例では、Azure CLI を使用して、手書き数字の MNIST データベースTensorFlow サンプル ニューラル ネットワークをトレーニングする Batch AI を設定します。 このクイック スタートを完了すると、Batch AI を使用した AI または機械学習モデルのトレーニングの主要概念を理解し、さまざまなモデルをより大規模にトレーニングする準備が整います。

Azure Cloud Shell を開く

Azure Cloud Shell は無料のインタラクティブ シェルです。この記事の手順は、Azure Cloud Shell を使って実行することができます。 Cloud Shell には一般的な Azure ツールが事前にインストールされており、アカウントで使用できるように構成されています。 [コピー] ボタンを選択してコードをコピーし、Cloud Shellに貼り付けて、Enter キーを押して実行するだけです。 Cloud Shell は、次のようにいくつかの方法で開くことができます。

コード ブロックの右上隅にある [使ってみる] を選択します。 この記事の Cloud Shell
ブラウザーで Cloud Shell を開きます。 https://shell.azure.com/bash
Azure portalの右上隅にあるメニューの [Cloud Shell] ボタンを選択します。 ポータルの Cloud Shell

CLI をローカルにインストールして使用する場合、このクイック スタートでは、Azure CLI バージョン 2.0.38 以降を実行している必要があります。 バージョンを確認するには、az --version を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。

このクイック スタートでは、Cloud Shell 内またはローカル コンピューター上の Bash シェルでコマンドを実行することを前提としています。 Azure CLI を使用して Batch AI クラスターを作成するクイック スタートを既に完了している場合は、リソース グループと Batch AI クラスターを作成する最初の 2 つの手順をスキップしてください。

リソース グループを作成する

az group create コマンドでリソース グループを作成します。 Azure リソース グループとは、Azure リソースのデプロイと管理に使用する論理コンテナーです。

次の例では、myResourceGroup という名前のリソース グループを eastus2 に作成します。 米国東部 2 を選択するか、Batch AI サービスが利用可能な別の場所を選択してください。

az group create \
    --name myResourceGroup \
    --location eastus2

Batch AI クラスターを作成する

まず、az batchai workspace create コマンドを使用して、Batch AI "ワークスペース" を作成します。 Batch AI クラスターや他のリソースを整理するためのワークスペースが必要です。

az batchai workspace create \
    --workspace myworkspace \
    --resource-group myResourceGroup

Batch AI クラスターを作成するには、az batchai cluster create コマンドを使用します。 次の例では、次のプロパティを持つ 1 ノード クラスターを作成します。

  • NVIDIA Tesla K80 GPU を 1 つ備えた、NC6 VM サイズを使用します。 Azure には、さまざまな NVIDIA GPU を備えた複数の VM サイズが用意されています。
  • コンテナー ベースのアプリケーションをホストするように設計された既定の Ubuntu Server イメージを実行します。 このディストリビューションでは、ほとんどのトレーニング ワークロードを実行できます。
  • myusername という名前のユーザー アカウントを追加し、SSH キーを生成します (ローカル環境の既定のキーの場所 (~/.ssh) にまだ存在しない場合)。
az batchai cluster create \
    --name mycluster \
    --workspace myworkspace \
    --resource-group myResourceGroup \
    --vm-size Standard_NC6 \
    --target 1 \
    --user-name myusername \
    --generate-ssh-keys

コマンド出力には、クラスターのプロパティが示されます。 ノードを作成して起動するまで数分かかります。 クラスターの状態を確認するには、az batchai cluster show コマンドを実行します。

az batchai cluster show \
    --name mycluster \
    --workspace myworkspace \
    --resource-group myResourceGroup \
    --output table

クラスター作成の初期段階では、出力は次のようになり、クラスターが resizing であることが示されます。

Name       Resource Group    Workspace    VM Size       State      Idle    Running    Preparing    Leaving    Unusable
---------  ----------------  -----------  ------------  -------  ------  ---------  -----------  ---------  ----------
mycluster  myResourceGroup   myworkspace  STANDARD_NC6  resizing      0          0            0          0           0

クラスターの状態が変わる間に、次の手順に進んでトレーニング スクリプトをアップロードし、トレーニング ジョブを作成します。 状態が steady になり、単一ノードが Idle になったら、クラスターでトレーニング ジョブを実行できるようになります。

トレーニング スクリプトのアップロード

az storage account create コマンドを使用して、トレーニング スクリプトとトレーニングの出力を保存するストレージ アカウントを作成します。

az storage account create \
    --resource-group myResourceGroup \
    --name mystorageaccount \
    --location eastus2 \
    --sku Standard_LRS

az storage share create コマンドを使用して、アカウントに myshare という Azure ファイル共有を作成します。

az storage share create \
    --name myshare \
    --account-name mystorageaccount

az storage directory create コマンドを使用して、Azure ファイル共有にディレクトリを作成します。 トレーニング スクリプト用の scripts ディレクトリと、トレーニングの出力用の logs ディレクトリを作成します。

# Create /scripts directory in file share
az storage directory create \
    --name scripts \
    --share-name myshare \
    --account-name mystorageaccount

# Create /logs directory in file share 
az storage directory create \
    --name logs \
    --share-name myshare \
    --account-name mystorageaccount

Bash シェルでローカル作業ディレクトリを作成し、TensorFlow の convolutional.py サンプルをダウンロードします。 この Python スクリプトでは、0 から 9 までの 60,000 個の手書き数字の MNIST 画像セットで、畳み込みニューラル ネットワークをトレーニングします。 次に、一連のテスト サンプルでモデルをテストします。

wget https://raw.githubusercontent.com/tensorflow/models/master/tutorials/image/mnist/convolutional.py

az storage file upload コマンドを使用して、共有内の scripts ディレクトリにスクリプトをアップロードします。

az storage file upload \
    --share-name myshare \
    --path scripts \
    --source convolutional.py \
    --account-name mystorageaccount

トレーニング ジョブの送信

まず、az batchai experiment create コマンドを使用して、ワークスペースに Batch AI "実験" を作成します。 実験は、相互に関連する Batch AI ジョブの論理コンテナーとなるものです。

az batchai experiment create \
    --name myexperiment \
    --workspace myworkspace \
    --resource-group myResourceGroup

作業ディレクトリに、次の内容のトレーニング ジョブ構成ファイル (job.json) を作成します。 トレーニング ジョブを送信するときに、この構成ファイルを渡します。

この job.json ファイルには、Python スクリプト ファイルを見つけ、GPU ノード上の TensorFlow コンテナー内で実行するための設定が含まれています。 また、ジョブの出力ファイルを保存する Azure Storage 内の場所も指定されています。 <AZURE_BATCHAI_STORAGE_ACCOUNT> は、ジョブの送信時にストレージ アカウント名が指定されることを示しています。

{
    "$schema": "https://raw.githubusercontent.com/Azure/BatchAI/master/schemas/2018-05-01/job.json",
    "properties": {
        "nodeCount": 1,
        "tensorFlowSettings": {
            "pythonScriptFilePath": "$AZ_BATCHAI_JOB_MOUNT_ROOT/myshare/scripts/convolutional.py"
        },
        "stdOutErrPathPrefix": "$AZ_BATCHAI_JOB_MOUNT_ROOT/myshare/logs",
        "mountVolumes": {
            "azureFileShares": [
                {
                    "azureFileUrl": "https://<AZURE_BATCHAI_STORAGE_ACCOUNT>.file.core.windows.net/myshare",
                    "relativeMountPath": "myshare"
                }
            ]
        },
        "containerSettings": {
            "imageSourceRegistry": {
                "image": "tensorflow/tensorflow:1.8.0-gpu"
            }
        }
    }
}

az batchai job create コマンドを使用してノード上でジョブを送信し、job.json 構成ファイルとストレージ アカウントの名前を渡します。

az batchai job create \
    --name myjob \
    --cluster mycluster \
    --experiment myexperiment \
    --workspace myworkspace \
    --resource-group myResourceGroup \
    --config-file job.json \
    --storage-account-name mystorageaccount

このコマンドはジョブのプロパティを返します。コマンドが完了するまで数分かかります。 このジョブの進行状況を監視するには、az batchai job file stream コマンドを使用して、ノード上の標準出力ディレクトリから stdout-wk-0.txt ファイルをストリーミングします。 このファイルは、ジョブの実行が開始された後に、トレーニング スクリプトによって生成されます。

az batchai job file stream \
    --job myjob \
    --experiment myexperiment \
    --workspace myworkspace \
    --resource-group myResourceGroup \
    --file-name stdout-wk-0.txt

出力例:

File found with URL "https://mystorageaccount.file.core.windows.net/logs/00000000-0000-0000-0000-000000000000/myResourceGroup/workspaces/myworkspace/experiments/myexperiment/jobs/myjob/<JOB_ID>/stdouterr/stdout-wk-0.txt?sv=2016-05-31&sr=f&sig=Kih9baozMao8Ugos%2FVG%2BcsVsSeY1O%2FTocCNvLQhwtx4%3D&se=2018-06-20T22%3A07%3A30Z&sp=rl". Start streaming
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting data/train-images-idx3-ubyte.gz
Extracting data/train-labels-idx1-ubyte.gz
Extracting data/t10k-images-idx3-ubyte.gz
Extracting data/t10k-labels-idx1-ubyte.gz
Initialized!
Step 0 (epoch 0.00), 14.9 ms
Minibatch loss: 8.334, learning rate: 0.010000
Minibatch error: 85.9%
Validation error: 84.6%
Step 100 (epoch 0.12), 9.7 ms
Minibatch loss: 3.240, learning rate: 0.010000
Minibatch error: 6.2%
Validation error: 7.7%
Step 200 (epoch 0.23), 8.3 ms
Minibatch loss: 3.335, learning rate: 0.010000
Minibatch error: 7.8%
Validation error: 4.5%
Step 300 (epoch 0.35), 8.3 ms
Minibatch loss: 3.157, learning rate: 0.010000
Minibatch error: 3.1%
...
Step 8500 (epoch 9.89), 8.3 ms
Minibatch loss: 1.605, learning rate: 0.006302
Minibatch error: 0.0%
Validation error: 0.9%
Test error: 0.8%

ジョブが完了すると、ストリーミングが停止します。 サンプル スクリプトでは、10 "エポック" のトレーニングを実行します (トレーニング データ セットを学習させます)。 この例では、10 エポック後、トレーニングされたモデルは、わずか 0.8% のテスト誤差で実行されています。

ジョブ出力の取得

Batch AI では、ジョブの出力ごとに固有のフォルダー構造をストレージ アカウントに作成します。 このパスで JOB_OUTPUT_PATH 環境変数を設定します。 次に、az storage file list コマンドを使用して、ストレージ内の出力ファイルを表示します。

export JOB_OUTPUT_PATH=$(az batchai job show --name myjob --experiment myexperiment --workspace myworkspace --resource-group myResourceGroup --query jobOutputDirectoryPathSegment --output tsv)

az storage file list \
    --share-name myshare/logs \
    --account-name mystorageaccount \
    --path $JOB_OUTPUT_PATH/stdouterr \
    --output table

出力は次のようになります。

Name               Content Length  Type    Last Modified
---------------  ----------------  ------  ---------------
execution.log               14866  file
stderr-wk-0.txt              1527  file
stdout-wk-0.txt             11027  file

az storage file download コマンドを使用して、ローカル作業ディレクトリに 1 つ以上のファイルをダウンロードします。 次に例を示します。

az storage file download \
    --share-name myshare/logs \
    --account-name mystorageaccount \
    --path $JOB_OUTPUT_PATH/stdouterr/stdout-wk-0.txt

リソースをクリーンアップする

Batch AI のチュートリアルとサンプルを続行する場合は、このクイック スタートで作成した Batch AI ワークスペース、クラスター、ストレージ アカウントを使用します。

ノードの実行中は、Batch AI クラスターに対して課金されます。 実行するジョブがないときにクラスター構成を保持する場合は、クラスターのサイズを 0 ノードに変更します。

az batchai cluster resize \
    --name mycluster \
    --workspace myworkspace \
    --resource-group myResourceGroup \
    --target 0

後でジョブを実行するときは、サイズを 1 ノード以上に変更します。 クラスターが不要になったら、az batchai cluster delete コマンドを使用して削除します。

az batchai cluster delete \
    --name mycluster \
    --workspace myworkspace \
    --resource-group myResourceGroup

Batch AI およびストレージ リソースのリソース グループが不要になったら、az group delete コマンドを使用して削除できます。

az group delete --name myResourceGroup

次のステップ

このクイック スタートでは、Azure CLI を使用し、Batch AI を使って 1 つの GPU VM 上で TensorFlow サンプル ディープ ラーニング モデルをトレーニングする方法を説明しました。 大規模な GPU クラスター上でモデル トレーニングを分散する方法については、Batch AI のチュートリアルに進んでください。