Azure Machine Learning でカスタムデータをアップロードしてモデルをトレーニングする
この記事の内容
- Azure Machine Learning の Python チュートリアルシリーズ最終回として、独自データを使ったモデルトレーニングを解説します
- トレーニングスクリプトに
argparseを使って引数(ハイパーパラメーター)を受け渡せるよう改修します - データをスクリプト内でダウンロードする方式から、Azure Blob Storage 経由でマウントする方式に変更します
- コントロールスクリプトにジョブ入力(
Input)を定義し、データパスを外部から指定できる構造にします - Python のインデントエラーに起因する実行失敗とその対処方法も紹介します
はじめに
本記事は、Azure Machine Learning スタジオで Python を使って機械学習モデルをトレーニングするチュートリアルシリーズの最終回です。前回はコンピューティングクラスターを使いクラウド上でモデルをトレーニングしましたが、その際はスクリプト内でデータをダウンロードする方式を採用していました。
今回は、独自のデータを Azure にアップロードし、そのデータを使ってトレーニングする一連のフローを説明します。具体的には以下の手順を進めます。
- トレーニングスクリプトをパラメーター化する
- コントロールスクリプトにジョブ入力を定義する
- 実際にジョブを投入してトレーニングを実行する
トレーニングスクリプトのパラメーター化
前回のトレーニングスクリプトでは、実行のたびにデータをダウンロードするよう設定されていました。今回はこれを改修し、外部から指定したディレクトリのデータを読み取るよう変更します。
また、ハイパーパラメーターを外部から変更できるよう、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 上のデータストアに格納されたデータが、ジョブ実行時にマウントされてトレーニングスクリプトに渡されます。データをその都度ダウンロードするのではなく、ストレージを直接マウントして利用するのがポイントです。
実行とトラブルシューティング
スクリプトを実行すると、最初はエラーが発生しました。
Python はインデントが文法上の意味を持つため、コードを貼り付けた際にインデントがずれるとこのようなエラーが発生します。1行ずつ確認してインデントを修正することで解決しました。
実行結果の確認
修正後に再実行すると、ジョブは正常に完了しました。ログを確認すると以下の点が確認できます。
- 指定したデータパスが正しく渡されている
- データはスクリプト内でダウンロードされたのではなく、Blob Storage がマウントされた状態で利用されている
- ソースコードとデータの 2 つがアップロードされ、それぞれクラウド上で処理されている
まとめ
本記事では、Azure Machine Learning で独自データをアップロードしてモデルをトレーニングする手順を解説しました。
- トレーニングスクリプトに
argparseを組み込むことで、ハイパーパラメーターやデータパスを外から制御できるようになります - コントロールスクリプトで
Inputを定義することで、Azure Blob Storage のデータストアをジョブに渡せます - データは実行時にマウントされるため、スクリプト内でのダウンロード処理が不要になります
- Python はインデントが厳密なため、コードの貼り付け時には特に注意が必要です
これで Azure Machine Learning の Python チュートリアルシリーズは完了です。コンピューティングリソースの準備からはじまり、クラウドでのモデルトレーニング、そして独自データの活用まで、一連の基本的なフローを体験できました。