チュートリアル: Azure Machine Learning でモデルをトレーニングする
適用対象: Python SDK azure-ai-ml v2 (現行)
データ サイエンティストがどのように Azure Machine Learning を使用してモデルをトレーニングするかについて説明します。 分類の問題に対して Azure Machine Learning を使用する方法を理解するために、この例では、クレジット カード データセットを使用します。 目的は、顧客のクレジットカード支払いが不履行となる可能性が高いかどうかを予測することです。 このトレーニング スクリプトを使用してデータの準備を処理します。 スクリプトによってモデルがトレーニングされ、登録されます。
このチュートリアルでは、クラウドベースのトレーニング ジョブ (コマンド ジョブ) を送信する手順について説明します。
- Azure Machine Learning ワークスペースへのハンドルを取得する
- コンピューティング リソースとジョブ環境を作成する
- トレーニング スクリプトを作成する
- コマンド ジョブを作成して実行し、コンピューティング リソース上でトレーニング スクリプトを実行する
- トレーニング スクリプトの出力を表示する
- 新しくトレーニングされたモデルをエンドポイントとしてデプロイする
- 推論のために Azure Machine Learning エンドポイントを呼び出す
Azure にデータを読み込む方法の詳細については、「チュートリアル: Azure Machine Learning でデータをアップロードし、データにアクセスし、データを探索する」を参照してください。
この動画では、Azure Machine Learning スタジオでチュートリアルの手順を実行できるように準備する方法について説明します。 この動画では、ノートブックの作成、コンピューティング インスタンスの作成、ノートブックの複製を行う方法について説明します。 それらの手順については、以下のセクションでも説明します。
前提条件
-
Azure Machine Learning を使用するには、ワークスペースが必要です。 まだない場合は、作業を開始するために必要なリソースの作成を完了し、ワークスペースを作成してその使用方法の詳細を確認してください。
-
スタジオにサインインして、ワークスペースを選択します (まだ開いていない場合)。
-
ワークスペースでノートブックを開くか作成します。
- コードをコピーしてセルに貼り付ける場合は、新しいノートブックを作成します。
- または、Studio の [サンプル] セクションから tutorials/get-started-notebooks/train-model.ipynb を開きます。 次に、[複製] を選択してノートブックをファイルに追加します。 サンプル ノートブックを見つけるには、「サンプル ノートブックから学習する」を参照してください。
カーネルを設定して Visual Studio Code (VS Code) で開く
コンピューティング インスタンスがまだない場合は、開いているノートブックの最上部のバーで作成します。
コンピューティング インスタンスが停止している場合は、[コンピューティングの開始] を選択して、実行されるまで待ちます。
コンピューティング インスタンスが実行中になるまで待ちます。 次に、右上にあるカーネルが
Python 3.10 - SDK v2
であることを確認します。 そうでない場合は、ドロップダウン リストを使用してこのカーネルを選択します。このカーネルが表示されない場合は、コンピューティング インスタンスが実行中であることを確認します。 そうである場合は、ノートブックの右上にある [更新] ボタンを選択します。
認証が必要であることを示すバナーが表示された場合は、[認証] を選択します。
ここでノートブックを実行するか、それを VS Code で開いて、Azure Machine Learning リソースの機能を備えた完全な統合開発環境 (IDE) を使用することができます。 [VS Code で開く] を選択し、Web またはデスクトップのオプションを選択します。 この方法で起動すると、コンピューティング インスタンス、カーネル、ワークスペース ファイル システムに VS Code がアタッチされます。
重要
このチュートリアルの残りの部分には、チュートリアル ノートブックのセルが含まれています。 それらをコピーして新しいノートブックに貼り付けるか、複製した場合はここでそのノートブックに切り替えます。
Azure Machine Learning でコマンド ジョブを使用してモデルをトレーニングする
モデルをトレーニングするには、"ジョブ" を送信する必要があります。 Azure Machine Learning には、モデルをトレーニングするためのさまざまな種類のジョブが用意されています。 ユーザーは、モデルの複雑さ、データ サイズ、トレーニング速度の要件に基づいて、トレーニング方法を選択することができます。 このチュートリアルでは、"コマンド ジョブ" を送信して "トレーニング スクリプト" を実行する方法について説明します。
コマンド ジョブは、モデルをトレーニングするためのカスタム トレーニング スクリプトを送信できる関数です。 このジョブは、カスタム トレーニング ジョブとして定義することもできます。 Azure Machine Learning のコマンド ジョブは、指定の環境でスクリプトまたはコマンドを実行するジョブの一種です。 コマンド ジョブを使用して、モデルのトレーニング、データの処理、またはクラウドで実行するその他のカスタム コードを実行できます。
このチュートリアルでは、コマンド ジョブを使用してモデルのトレーニングに使用するカスタム トレーニング ジョブを作成することに焦点を置きます。 カスタム トレーニング ジョブには次の項目が必要です。
- 環境
- [データ]
- コマンド ジョブ
- トレーニング スクリプト
このチュートリアルでは、クレジット カード支払いが不履行となる可能性が高い顧客を予測する分類子を作成する例として、これらすべての項目を提供します。
ワークスペースへのハンドルを作成する
コードについて詳しく説明する前に、ワークスペースを参照する方法が必要です。 ワークスペースへのハンドル用に ml_client
を作成します。 その後、ml_client
を使用してリソースとジョブを管理します。
次のセルに、サブスクリプション ID、リソース グループ名、ワークスペース名を入力します。 これらの値を見つけるには:
- 右上隅の Azure Machine Learning スタジオ ツール バーで、ワークスペース名を選びます。
- ワークスペース、リソース グループ、サブスクリプション ID の値をコードにコピーします。 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,
)
Note
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 環境とは?」を参照してください。
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 でモデルのメトリックを表示します。 詳細については、「MLflow と Azure Machine Learning」を参照してください。
%%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 スタジオでは次のようになります。 タブを参照して、メトリック、出力などのさまざまな詳細を確認してください。ジョブが完了すると、トレーニングの結果としてワークスペースにモデルが登録されます。
重要
ジョブの状態が完了になるまで待ってから、このノートブックに戻って続行します。 ジョブの実行には 2 分から 3 分かかります。 コンピューティング クラスターが 0 ノードにスケールダウンされ、カスタム環境がまだ構築中である場合は、さらに長く (最長 10 分) かかることがあります。
セルを実行すると、ノートブックの出力に、Machine Learning スタジオのジョブの詳細ページへのリンクが表示されます。 または、左側のナビゲーション メニューで [ジョブ] を選択することもできます。
ジョブは、指定されたスクリプトやコードから多数の実行をグループ化したものです。 実行に関する情報は、そのジョブに格納されます。 詳細ページには、ジョブの概要、実行にかかった時間、作成日、その他の情報が表示されます。 このページには、メトリック、出力とログ、コードなどのジョブに関する他の情報のタブもあります。 ジョブの詳細ページで使用できるタブは次のとおりです。
- 概要: 実行されたジョブの状態、開始と終了の時刻、種類など、ジョブに関する基本情報
- 入力: ジョブの入力として使用されたデータとコード。 このセクションには、トレーニング中に使用されたデータセット、スクリプト、環境構成などのリソースを含めることができます。
- 出力とログ: ジョブの実行中に生成されたログ。 このタブは、トレーニング スクリプトまたはモデルの作成で問題が発生した場合のトラブルシューティングに役立ちます。
- メトリック: トレーニング スコア、f1 スコア、精度スコアなど、モデルの主要なパフォーマンス メトリック。
リソースをクリーンアップする
引き続き他のチュートリアルに取り組む場合は、「関連するコンテンツ」に進んでください。
コンピューティング インスタンスを停止する
コンピューティング インスタンスをすぐに使用しない場合は、停止してください。
- スタジオの左側のナビゲーション領域で、[コンピューティング] を選択します。
- 上部のタブで、[コンピューティング インスタンス] を選択します。
- 一覧からコンピューティング インスタンスを選択します。
- 上部のツールバーで、 [停止] を選択します。
すべてのリソースの削除
重要
作成したリソースは、Azure Machine Learning に関連したその他のチュートリアルおよびハウツー記事の前提条件として使用できます。
作成したどのリソースも今後使用する予定がない場合は、課金が発生しないように削除します。
Azure portal の検索ボックスに「リソース グループ」と入力し、それを結果から選択します。
一覧から、作成したリソース グループを選択します。
[概要] ページで、[リソース グループの削除] を選択します。
リソース グループ名を入力します。 次に、 [削除] を選択します。
関連するコンテンツ
モデルのデプロイについて学習する:
このチュートリアルでは、オンライン データ ファイルを使用しました。 データにアクセスするその他の方法の詳細については、「チュートリアル: Azure Machine Learning でデータをアップロードし、データにアクセスし、データを探索する」を参照してください。
自動 ML は、データ サイエンティストがデータに最適なモデルの検索に費やす時間を短縮するための補助ツールです。 詳細については、自動機械学習の概要に関する記事を参照してください。
このチュートリアルと同様の例をさらに確認するには、「サンプル ノートブックから学習する」を参照してください。 これらのサンプルは、GitHub サンプル ページで入手できます。 これらのサンプルには、コードを実行してモデルのトレーニング方法を学習できる完成した Python ノートブックが含まれています。 分類、自然言語処理、異常検出などのシナリオを含むサンプルから、既存のスクリプトを変更して実行することができます。