Azure Machine Learning でカスタムデータをアップロードしてモデルをトレーニングする

この記事の内容

  • Azure Machine Learning の Python チュートリアルシリーズ最終回として、独自データを使ったモデルトレーニングを解説します
  • トレーニングスクリプトに argparse を使って引数(ハイパーパラメーター)を受け渡せるよう改修します
  • データをスクリプト内でダウンロードする方式から、Azure Blob Storage 経由でマウントする方式に変更します
  • コントロールスクリプトにジョブ入力(Input)を定義し、データパスを外部から指定できる構造にします
  • Python のインデントエラーに起因する実行失敗とその対処方法も紹介します

はじめに

本記事は、Azure Machine Learning スタジオで Python を使って機械学習モデルをトレーニングするチュートリアルシリーズの最終回です。前回はコンピューティングクラスターを使いクラウド上でモデルをトレーニングしましたが、その際はスクリプト内でデータをダウンロードする方式を採用していました。

今回は、独自のデータを Azure にアップロードし、そのデータを使ってトレーニングする一連のフローを説明します。具体的には以下の手順を進めます。

  1. トレーニングスクリプトをパラメーター化する
  2. コントロールスクリプトにジョブ入力を定義する
  3. 実際にジョブを投入してトレーニングを実行する

トレーニングスクリプトのパラメーター化

前回のトレーニングスクリプトでは、実行のたびにデータをダウンロードするよう設定されていました。今回はこれを改修し、外部から指定したディレクトリのデータを読み取るよう変更します。

また、ハイパーパラメーターを外部から変更できるよう、argparse を使った引数の受け渡しを導入します。

変更後のスクリプトでは、以下の引数を受け取ります。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--data_path', type=str)
parser.add_argument('--learning_rate', type=float, default=0.01)
parser.add_argument('--momentum', type=float, default=0.9)
args = parser.parse_args()

オプティマイザーにもこれらの引数を反映させます。

optimizer = torch.optim.SGD(
    model.parameters(),
    lr=args.learning_rate,
    momentum=args.momentum
)

これにより、トレーニングの実行ごとに学習率やモーメンタムを外から制御できる構造になります。データのパスについても、スクリプト内でダウンロードする処理をなくし、args.data_path で渡されたパスからデータを読み取るよう変更します。


コントロールスクリプトの作成

コントロールスクリプト(run.py など)は get-started フォルダに作成します。基本的な構造は前回と同じですが、ジョブ入力(Input の定義が新たに追加されます。

from azure.ai.ml.entities import command
from azure.ai.ml.constants import AssetTypes
from azure.ai.ml import Input

my_job_inputs = {
    "data_path": Input(
        type=AssetTypes.URI_FOLDER,
        path="<データストアのパス>"
    )
}

ジョブの定義では、このインプットをコマンドの引数として渡します。

job = command(
    code="./src",
    command="python train.py --data_path ${{inputs.data_path}}",
    inputs=my_job_inputs,
    environment="<使用する環境>",
    compute="<コンピューティングクラスター名>"
)

これにより、Azure Blob Storage 上のデータストアに格納されたデータが、ジョブ実行時にマウントされてトレーニングスクリプトに渡されます。データをその都度ダウンロードするのではなく、ストレージを直接マウントして利用するのがポイントです。


実行とトラブルシューティング

スクリプトを実行すると、最初はエラーが発生しました。

IndentationError:expectedanindentedblock

Python はインデントが文法上の意味を持つため、コードを貼り付けた際にインデントがずれるとこのようなエラーが発生します。1行ずつ確認してインデントを修正することで解決しました。


実行結果の確認

修正後に再実行すると、ジョブは正常に完了しました。ログを確認すると以下の点が確認できます。

  • 指定したデータパスが正しく渡されている
  • データはスクリプト内でダウンロードされたのではなく、Blob Storage がマウントされた状態で利用されている
  • ソースコードとデータの 2 つがアップロードされ、それぞれクラウド上で処理されている

まとめ

本記事では、Azure Machine Learning で独自データをアップロードしてモデルをトレーニングする手順を解説しました。

  • トレーニングスクリプトに argparse を組み込むことで、ハイパーパラメーターやデータパスを外から制御できるようになります
  • コントロールスクリプトで Input を定義することで、Azure Blob Storage のデータストアをジョブに渡せます
  • データは実行時にマウントされるため、スクリプト内でのダウンロード処理が不要になります
  • Python はインデントが厳密なため、コードの貼り付け時には特に注意が必要です

これで Azure Machine Learning の Python チュートリアルシリーズは完了です。コンピューティングリソースの準備からはじまり、クラウドでのモデルトレーニング、そして独自データの活用まで、一連の基本的なフローを体験できました。