【Azure Machine Learning】機械学習モデルをトレーニングする

この記事の内容

  • Azure Machine Learning を使って、Python でニューラルネットワークモデルのトレーニングスクリプトを作成する方法を紹介します
  • ローカル環境でトレーニングスクリプトの動作確認を行う手順を解説します
  • 再現可能なバージョン管理された Python 環境を Azure ML 上に定義・登録する方法を説明します
  • コントロールスクリプトを使ってクラウドにジョブを送信し、実行する手順を紹介します
  • MLflow を使ったメトリック追跡の設定方法についても触れます

はじめに

この記事は、Azure Machine Learning のチュートリアルシリーズの第2回目です。前回は環境を整えて、コントロールスクリプトから簡単な Hello World スクリプトをジョブとして実行するところまで進めました。

今回は、いよいよ機械学習モデルをトレーニングするという本題に入ります。トレーニングスクリプトの作成から始まり、ローカルでのテスト、Azure ML 上の環境定義、クラウドへのジョブ送信、そしてメトリックのログ記録まで、一連の流れを追っていきます。


トレーニングスクリプトの作成

まず、ニューラルネットワークのアーキテクチャを定義する model.py と、実際のトレーニング処理を行う train.py の2つのスクリプトを作成します。これらはすべて src サブフォルダーに配置します。

model.py の作成

src サブフォルダー内に model.py ファイルを新規作成し、ニューラルネットワークのアーキテクチャ定義コードを記述します。このファイルではネットワークのクラス(Net)が定義されており、後述の train.py からインポートして使用します。

train.py の作成

同じく src サブフォルダーに train.py を作成します。このスクリプトは以下の処理を行います。

  • CIFAR-10 データセットをダウンロード・読み込む
  • model.py で定義したニューラルネットワークを初期化する
  • SGD オプティマイザーとクロスエントロピー損失を使用する
  • 2エポック分のトレーニングを実行する

スクリプト冒頭で model.py からクラスをインポートする際は、以下のように記述します。

from model import Net

ローカルでのテスト

スクリプトが完成したら、クラウドに送信する前にローカル環境で動作確認を行います。ノートブック上でスクリプトを直接実行してみましょう。

最初の実行では No module named 'model' というエラーが発生することがあります。これは train.pymodel モジュールを正しく参照できていないためです。インポート文を確認し、ファイル名とクラス名が一致しているかを見直してください。

修正後に再実行すると、CIFAR-10 のデータがダウンロードされ、トレーニングが完了します。これで、1台の PC 上でトレーニングが正常に動作することが確認できます。


Python 環境の作成

クラウド上での実行では、再現可能でバージョン管理された環境が必要です。Azure Machine Learning では「環境」という概念が提供されており、ライブラリのバージョンを固定した状態で実験を実行できます。

conda.yml の作成

まず、パッケージの依存関係を記述した conda.yml(または requirements.txt)ファイルを作成します。必要なライブラリのバージョンをここに記載しておくことで、環境の再現性が確保されます。

channels:
  - defaults
dependencies:
  - python=3.x
  - pip:
    - torch
    - torchvision
    - mlflow
    - azureml-mlflow

コントロールスクリプトへの環境定義の追加

コントロールスクリプト(job.py 等)に環境の定義を追加します。前回のチュートリアルと比較すると、環境に関する以下のセクションが新しく追加されています。

from azure.ai.ml.entities import Environment

env = Environment(
    name="pytorch-env",
    image="mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04",
    conda_file="./conda.yml",
)

ml_client.environments.create_or_update(env)

ベースイメージとして Microsoft が公開している Docker イメージを使用し、その上に conda.yml で定義した依存関係を追加することで、カスタム環境が構築されます。


クラウドへのジョブ送信と実行

コントロールスクリプトを実行すると、ジョブが Azure Machine Learning に送信されます。

python job.py

ジョブが送信されると、Azure ML ポータル上でステータスを確認できます。最初のジョブ実行時はカスタム環境のビルドが行われるため、通常より時間がかかります。

Azure ML の「環境」タブを確認すると、スクリプトで定義したカスタム環境が登録されていることが確認できます。conda.yml ファイルの内容も正しく反映されています。

ジョブが完了すると、ログタブからビルドログやシステムログ、ユーザーログを確認できます。ユーザーログには、ローカルで実行したときと同じトレーニングの出力結果が表示されます。


パフォーマンスメトリックの追跡(MLflow)

現時点のトレーニングスクリプトはメトリックをターミナルに出力するだけですが、Azure Machine Learning では MLflow を使ったメトリックの記録がサポートされています。数行のコードを追加するだけで、Azure ML Studio 上でメトリックを可視化したり、複数のジョブ間でメトリックを比較したりできるようになります。

train.py への MLflow の追加

train.py に以下の変更を加えます。

import mlflow

# トレーニングコードの前に自動ログを有効化
mlflow.autolog()

または、手動でメトリックを記録する場合は以下のように記述します。

import mlflow

mlflow.log_metric("loss", loss_value)

conda.yml への mlflow の追加

MLflow を使用するため、conda.ymlmlflowazureml-mlflow を追加し、コントロールスクリプトで参照する環境を更新します。

変更後にコントロールスクリプトを再実行すると、新しい環境でジョブが実行されます。ジョブが完了すると、Azure ML ポータルの「メトリック」タブに記録されたメトリックが表示される予定です。

注意: 動画の収録時点では、mlflow.autolog() を設定してもメトリックが Azure ML Studio に表示されないという事象が発生しました。コードの記述には問題がないように見えますが、原因は特定できませんでした。同様の事象が発生した場合は、MLflow の公式ドキュメントや Azure ML のドキュメントを合わせて参照してみてください。


まとめ

今回は Azure Machine Learning を使って機械学習モデルをトレーニングするチュートリアルを実施しました。

  • model.pytrain.py という2つのトレーニングスクリプトを src フォルダーに作成しました
  • ローカル環境でスクリプトの動作確認を行い、インポートエラーの修正方法を確認しました
  • conda.yml を使って依存関係を定義し、コントロールスクリプトから再現可能なカスタム環境を Azure ML に登録しました
  • クラウド上でジョブを実行し、ローカルと同じトレーニング結果が得られることを確認しました
  • MLflow を使ったメトリック追跡の設定方法を試しました

次回はデータの持ち込みについて扱う予定です。引き続きシリーズをご覧ください。