チュートリアル: Azure Machine Learning でモデルをトレーニングする

適用対象: Python SDK azure-ai-ml v2 (現行)

データ サイエンティストがどのように Azure Machine Learning を使用してモデルをトレーニングするかについて説明します。 この例では、関連付けられているクレジット カードのデータセットを使用して、分類の問題に Azure Machine Learning を使用する方法を示します。 目的は、顧客のクレジットカード支払いが不履行となる可能性が高いかどうかを予測することです。

"トレーニング スクリプト" では、データの準備を行った後、モデルをトレーニングして登録します。 このチュートリアルでは、クラウドベースのトレーニング ジョブ (コマンド ジョブ) を送信する手順について説明します。 Azure にデータを読み込む方法の詳細については、「チュートリアル: Azure Machine Learning でデータをアップロード、アクセス、探索する」を参照してください。 手順は次のとおりです。

  • Azure Machine Learning ワークスペースへのハンドルを取得する
  • コンピューティング リソースとジョブ環境を作成する
  • トレーニング スクリプトを作成する
  • 適切なジョブ環境とデータ ソースを使用して構成されたコンピューティング リソースでトレーニング スクリプトを実行するコマンド ジョブを作成して実行する
  • トレーニング スクリプトの出力を表示する
  • 新しくトレーニングされたモデルをエンドポイントとしてデプロイする
  • 推論のために Azure Machine Learning エンドポイントを呼び出す

このビデオでは、チュートリアル内の手順に従うことができるように、Azure Machine Learning スタジオ内で作業を開始する方法について説明します。 この動画では、ノートブックの作成、コンピューティング インスタンスの作成、ノートブックの複製を行う方法について説明します。 それらの手順については、以下のセクションでも説明します。

前提条件

  1. Azure Machine Learning を使用するには、まずワークスペースが必要です。 まだない場合は、作業を開始するために必要なリソースの作成を完了し、ワークスペースを作成してその使用方法の詳細を確認してください。

  2. スタジオにサインインして、ワークスペースを選択します (まだ開いていない場合)。

  3. ワークスペースでノートブックを開くか作成します。

カーネルを設定する

  1. コンピューティング インスタンスがまだない場合は、開いているノートブックの最上部のバーで作成します。

    Screenshot shows how to create a compute instance.

  2. コンピューティング インスタンスが停止している場合は、[コンピューティングの開始] を選択して、実行されるまで待ちます。

    Screenshot shows how to start compute if it is stopped.

  3. 右上にあるカーネルが Python 3.10 - SDK v2 であることを確認します。 そうでない場合は、ドロップダウンを使用してこのカーネルを選択します。

    Screenshot shows how to set the kernel.

  4. 認証が必要であることを示すバナーが表示された場合は、[認証] を選択します。

重要

このチュートリアルの残りの部分には、チュートリアル ノートブックのセルが含まれています。 それらを新しいノートブックにコピー/貼り付けするか、複製した場合はここでそのノートブックに切り替えます。

Azure Machine Learning でコマンド ジョブを使用してモデルをトレーニングする

モデルをトレーニングするには、"ジョブ" を送信する必要があります。 このチュートリアルで送信するジョブの種類は "コマンド ジョブ" です。 Azure Machine Learning には、モデルをトレーニングするためのさまざまな種類のジョブが用意されています。 ユーザーは、モデルの複雑さ、データ サイズ、トレーニング速度の要件に基づいて、トレーニング方法を選択することができます。 このチュートリアルでは、"コマンド ジョブ" を送信して "トレーニング スクリプト" を実行する方法について説明します。

コマンド ジョブは、モデルをトレーニングするためのカスタム トレーニング スクリプトを送信できる関数です。 これは、カスタム トレーニング ジョブとして定義することもできます。 Azure Machine Learning のコマンド ジョブは、指定の環境でスクリプトまたはコマンドを実行するジョブの一種です。 コマンド ジョブを使用して、モデルのトレーニング、データの処理、またはクラウドで実行するその他のカスタム コードを実行できます。

このチュートリアルでは、コマンド ジョブを使用してモデルのトレーニングに使用するカスタム トレーニング ジョブを作成することに焦点を置きます。 カスタム トレーニング ジョブには、以下の項目が必要です。

  • 環境
  • [データ]
  • コマンド ジョブ
  • トレーニング スクリプト

このチュートリアルでは、クレジット カード支払いが不履行となる可能性が高い顧客を予測する分類子を作成する例として、これらすべての項目を提供します。

ワークスペースへのハンドルを作成する

コードについて詳しく説明する前に、ワークスペースを参照する方法が必要です。 ワークスペースへのハンドル用に ml_client を作成します。 次に、ml_client を使用してリソースとジョブを管理します。

次のセルに、サブスクリプション ID、リソース グループ名、ワークスペース名を入力します。 これらの値を見つけるには:

  1. 右上隅の Azure Machine Learning スタジオ ツール バーで、ワークスペース名を選びます。
  2. ワークスペース、リソース グループ、サブスクリプション ID の値をコードにコピーします。
  3. 1 つの値をコピーし、領域を閉じて貼り付けてから、戻って次のものを処理する必要があります。
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential

# authenticate
credential = DefaultAzureCredential()

SUBSCRIPTION="<SUBSCRIPTION_ID>"
RESOURCE_GROUP="<RESOURCE_GROUP>"
WS_NAME="<AML_WORKSPACE_NAME>"
# Get a handle to the workspace
ml_client = MLClient(
    credential=credential,
    subscription_id=SUBSCRIPTION,
    resource_group_name=RESOURCE_GROUP,
    workspace_name=WS_NAME,
)

注意

MLClient を作成しても、ワークスペースには接続されません。 クライアントの初期化は遅延型なので、初めて呼び出す必要が生じるまで待機します (これは、次のコード セルで行われます)。

# Verify that the handle works correctly.  
# If you ge an error here, modify your SUBSCRIPTION, RESOURCE_GROUP, and WS_NAME in the previous cell.
ws = ml_client.workspaces.get(WS_NAME)
print(ws.location,":", ws.resource_group)

ジョブ環境を作成する

コンピューティング リソースで Azure Machine Learning ジョブを実行するには、環境が必要です。 環境には、トレーニングするコンピューティングにインストールするソフトウェア ランタイムとライブラリが一覧表示されます。 これは、ローカル コンピューター上の Python 環境に似ています。

Azure Machine Learning には、キュレーションまたは既製の環境が多数用意されていて、一般的なトレーニングと推論のシナリオに役立ちます。

この例では、conda yaml ファイルを使って、ジョブ用のカスタム conda 環境を作成します。

まず、ファイルを格納するディレクトリを作成します。

import os

dependencies_dir = "./dependencies"
os.makedirs(dependencies_dir, exist_ok=True)

次のセルでは、IPython マジックを使用して、先ほど作成したディレクトリに conda ファイルを書き込みます。

%%writefile {dependencies_dir}/conda.yaml
name: model-env
channels:
  - conda-forge
dependencies:
  - python=3.8
  - numpy=1.21.2
  - pip=21.2.4
  - scikit-learn=1.0.2
  - scipy=1.7.1
  - pandas>=1.1,<1.2
  - pip:
    - inference-schema[numpy-support]==1.3.0
    - mlflow==2.8.0
    - mlflow-skinny==2.8.0
    - azureml-mlflow==1.51.0
    - psutil>=5.8,<5.9
    - tqdm>=4.59,<4.60
    - ipykernel~=6.0
    - matplotlib

この仕様には、ジョブで使ういくつかの通常のパッケージ (numpy や pip など) が含まれています。

この yaml ファイルを参照してこのカスタム環境を作成し、ワークスペースに登録します。

from azure.ai.ml.entities import Environment

custom_env_name = "aml-scikit-learn"

custom_job_env = Environment(
    name=custom_env_name,
    description="Custom environment for Credit Card Defaults job",
    tags={"scikit-learn": "1.0.2"},
    conda_file=os.path.join(dependencies_dir, "conda.yaml"),
    image="mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest",
)
custom_job_env = ml_client.environments.create_or_update(custom_job_env)

print(
    f"Environment with name {custom_job_env.name} is registered to workspace, the environment version is {custom_job_env.version}"
)

コマンド関数を使用してトレーニング ジョブを構成する

Azure Machine Learning "コマンド ジョブ" は、クレジットの不履行の予測に関するモデルをトレーニングするために作成します。 コマンド ジョブは、指定されたコンピューティング リソースに対して指定の環境で "トレーニング スクリプト" を実行します。 環境とコンピューティング クラスターは既に作成しています。 次に、トレーニング スクリプトを作成します。 このケースでは、GradientBoostingClassifier モデルを使用して分類子を生成するようにデータセットをトレーニングしています。

この "トレーニング スクリプト"を使って、データの準備、トレーニング、トレーニングされたモデルの登録を処理します。 メソッド train_test_split は、データセットをテスト データとトレーニング データに分割する処理を行います。 このチュートリアルでは、Python トレーニング スクリプトを作成します。

コマンド ジョブは、CLI、Python SDK、またはスタジオ インターフェイスから実行できます。 このチュートリアルでは、Azure Machine Learning Python SDK v2 を使用し、コマンド ジョブを作成して実行します。

トレーニング スクリプトを作成する

まず、トレーニング スクリプト main.py Python ファイルを作成します。

最初にスクリプトのソース フォルダーを作成します。

import os

train_src_dir = "./src"
os.makedirs(train_src_dir, exist_ok=True)

このスクリプトを使用して、データの前処理を行い、それをテストとトレーニングのデータに分割します。 次に、このデータを使用してツリー ベースのモデルをトレーニングし、出力モデルを返します。

MLFlow は、ジョブの実行中にパラメーターとメトリックをログに記録するために使われます。 MLFlow パッケージを使用すると、Azure でトレーニングする各モデルのメトリックと結果を追跡することができます。 MLFlow を使用して、まずデータに最適なモデルを取得してから、Azure Studio でモデルのメトリックを表示します。

%%writefile {train_src_dir}/main.py
import os
import argparse
import pandas as pd
import mlflow
import mlflow.sklearn
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split

def main():
    """Main function of the script."""

    # input and output arguments
    parser = argparse.ArgumentParser()
    parser.add_argument("--data", type=str, help="path to input data")
    parser.add_argument("--test_train_ratio", type=float, required=False, default=0.25)
    parser.add_argument("--n_estimators", required=False, default=100, type=int)
    parser.add_argument("--learning_rate", required=False, default=0.1, type=float)
    parser.add_argument("--registered_model_name", type=str, help="model name")
    args = parser.parse_args()
   
    # Start Logging
    mlflow.start_run()

    # enable autologging
    mlflow.sklearn.autolog()

    ###################
    #<prepare the data>
    ###################
    print(" ".join(f"{k}={v}" for k, v in vars(args).items()))

    print("input data:", args.data)
    
    credit_df = pd.read_csv(args.data, header=1, index_col=0)

    mlflow.log_metric("num_samples", credit_df.shape[0])
    mlflow.log_metric("num_features", credit_df.shape[1] - 1)

    #Split train and test datasets
    train_df, test_df = train_test_split(
        credit_df,
        test_size=args.test_train_ratio,
    )
    ####################
    #</prepare the data>
    ####################

    ##################
    #<train the model>
    ##################
    # Extracting the label column
    y_train = train_df.pop("default payment next month")

    # convert the dataframe values to array
    X_train = train_df.values

    # Extracting the label column
    y_test = test_df.pop("default payment next month")

    # convert the dataframe values to array
    X_test = test_df.values

    print(f"Training with data of shape {X_train.shape}")

    clf = GradientBoostingClassifier(
        n_estimators=args.n_estimators, learning_rate=args.learning_rate
    )
    clf.fit(X_train, y_train)

    y_pred = clf.predict(X_test)

    print(classification_report(y_test, y_pred))
    ###################
    #</train the model>
    ###################

    ##########################
    #<save and register model>
    ##########################
    # Registering the model to the workspace
    print("Registering the model via MLFlow")
    mlflow.sklearn.log_model(
        sk_model=clf,
        registered_model_name=args.registered_model_name,
        artifact_path=args.registered_model_name,
    )

    # Saving the model to a file
    mlflow.sklearn.save_model(
        sk_model=clf,
        path=os.path.join(args.registered_model_name, "trained_model"),
    )
    ###########################
    #</save and register model>
    ###########################
    
    # Stop Logging
    mlflow.end_run()

if __name__ == "__main__":
    main()

このスクリプトでは、モデルのトレーニングが完了すると、モデル ファイルが保存され、ワークスペースに登録されます。 モデルの登録によって、モデルを Azure クラウドに格納し、ワークスペースでバージョンを管理できます。 モデルを登録すると、Azure Studio 内のモデル レジストリと呼ばれる 1 つの場所で、他のすべての登録済みモデルを見つけることができます。 モデルのレジストリは、トレーニングしたモデルの整理と追跡に役立ちます。

コマンドを構成する

分類タスクを実行できるスクリプトが用意されたので、コマンド ライン アクションを実行できる汎用コマンドを使用します。 このコマンドライン アクションで、直接、またはスクリプトを実行して、システム コマンドを呼び出すことができます。

ここでは、入力データ、分割率、学習率、登録されたモデル名を指定する入力変数を作成します。 このコマンド スクリプトで以下を行います。

  • 前に作成した環境を使用します。@latest 表記を使用すると、コマンドの実行時におけるその環境の最新バージョンを示すことができます。
  • コマンド ライン アクション自体を構成します。この場合は python main.py です。 入出力には、コマンドで ${{ ... }} 表記を使ってアクセスできます。
  • コンピューティング リソースが指定されていないため、スクリプトは、自動的に作成されるサーバーレス コンピューティング クラスターで実行されます。
from azure.ai.ml import command
from azure.ai.ml import Input

registered_model_name = "credit_defaults_model"

job = command(
    inputs=dict(
        data=Input(
            type="uri_file",
            path="https://azuremlexamples.blob.core.windows.net/datasets/credit_card/default_of_credit_card_clients.csv",
        ),
        test_train_ratio=0.2,
        learning_rate=0.25,
        registered_model_name=registered_model_name,
    ),
    code="./src/",  # location of source code
    command="python main.py --data ${{inputs.data}} --test_train_ratio ${{inputs.test_train_ratio}} --learning_rate ${{inputs.learning_rate}} --registered_model_name ${{inputs.registered_model_name}}",
    environment="aml-scikit-learn@latest",
    display_name="credit_default_prediction",
)

ジョブを送信する

次に、Azure Machine Learning スタジオで実行するジョブを送信します。 今回は ml_client に対して create_or_update を使います。 ml_client は、Python を使用して Azure サブスクリプションに接続し、Azure Machine Learning service を操作するためのクライアント クラスです。 ml_client では、Python を使用してジョブを送信できます。

ml_client.create_or_update(job)

ジョブの出力を表示してジョブの完了を待機する

前のセルの出力内のリンクを選択して、Azure Machine Learning スタジオでジョブを表示します。 このジョブの出力は、Azure Machine Learning スタジオではこのようになります。 メトリック、出力などのさまざまな詳細のタブを調べます。完了すると、ジョブで、トレーニングの結果としてモデルがワークスペースに登録されます。

Screenshot shows the overview page for the job.

重要

ジョブの状態が完了になるまで待ってから、このノートブックに戻って続行します。 ジョブの実行には 2 から 3 分かかります。 コンピューティング クラスターが 0 ノードにスケールダウンされ、カスタム環境がまだ構築中である場合は、さらに長く (最大 10 分) かかることがあります。

セルを実行すると、ノートブックの出力に、Azure Studio のジョブの詳細ページへのリンクが表示されます。 または、左側のナビゲーション メニューで [ジョブ] を選択することもできます。 ジョブは、指定されたスクリプトやコードから多数の実行をグループ化したものです。 実行に関する情報は、そのジョブに格納されます。 詳細ページには、ジョブの概要、実行にかかった時間、作成日時などが表示されます。このページには、メトリック、出力とログ、コードなど、ジョブに関するその他の情報のタブもあります。 ジョブの詳細ページで使用できるタブを次に示します。

  • [概要]: [概要] セクションには、ジョブの状態、開始時刻と終了時刻、実行されたジョブの種類など、ジョブに関する基本情報が表示されます。
  • [入力]: [入力] セクションには、ジョブの入力として使用されたデータとコードが一覧表示されます。 このセクションには、トレーニング中に使用されたデータセット、スクリプト、環境構成などのリソースを含めることができます。
  • [出力とログ]: [出力とログ] タブには、ジョブの実行中に生成されたログが含まれます。 このタブは、トレーニング スクリプトまたはモデルの作成で問題が発生した場合のトラブルシューティングに役立ちます。
  • [メトリック]: [メトリック] タブには、トレーニング スコア、F1 スコア、精度スコアなど、モデルの主要なパフォーマンス メトリックが表示されます。

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

引き続き他のチュートリアルに取り組む場合は、「次のステップ」に進んでください。

コンピューティング インスタンスを停止する

コンピューティング インスタンスをすぐに使用しない場合は、停止してください。

  1. スタジオの左側のナビゲーション領域で、[コンピューティング] を選択します。
  2. 上部のタブで、 [コンピューティング インスタンス] を選択します
  3. 一覧からコンピューティング インスタンスを選択します。
  4. 上部のツールバーで、 [停止] を選択します。

すべてのリソースの削除

重要

作成したリソースは、Azure Machine Learning に関連したその他のチュートリアルおよびハウツー記事の前提条件として使用できます。

作成したどのリソースも今後使用する予定がない場合は、課金が発生しないように削除します。

  1. Azure Portal で、左端にある [リソース グループ] を選択します。

  2. 一覧から、作成したリソース グループを選択します。

  3. [リソース グループの削除] を選択します。

    Screenshot of the selections to delete a resource group in the Azure portal.

  4. リソース グループ名を入力します。 次に、 [削除] を選択します。

次の手順

モデルのデプロイについて学習する

このチュートリアルでは、オンライン データ ファイルを使用しました。 データにアクセスするその他の方法について詳しくは、「チュートリアル: Azure Machine Learning でデータをアップロード、アクセス、探索する」を参照してください。

Azure Machine Learning でモデルをトレーニングするさまざまな方法について詳しく知りたい場合は、「自動機械学習 (AutoML) とは」を参照してください。 自動 ML は、データ サイエンティストがデータに最適なモデルの検索に費やす時間を短縮するための補助ツールです。

このチュートリアルのような例をさらに確認したい場合は、Studio のサンプルに関するセクションを参照してください。 これらの同じサンプルは、GitHub のサンプル ページで入手できます。この例には、コードを実行してモデルのトレーニングを学習できる完全な Python ノートブックが含まれます。 分類、自然言語処理、異常検出などのシナリオを含むサンプルから、既存のスクリプトを変更して実行することができます。