次の方法で共有


Azure Machine Learning で実験を追跡してモデルをデプロイする

この記事では、Azure Machine Learning で MLflow API を使用してトレーニング スクリプトにログ記録コードを追加し、実験を追跡する方法について説明します。 実行のメトリックを監視して、モデル作成プロセスを強化できます。

この図は、MLflow Tracking を使用して、実験の実行メトリックを追跡し、Azure Machine Learning ワークスペース内にモデル成果物を保存する例を示しています。

MLflow 運用の考え方を示す図。

前提条件

新しいノートブックを作成する

Azure Machine Learning と MLFlow SDK は、Data Science Virtual Machine (DSVM) にあらかじめインストールされています。 これらのリソースには、azureml_py36_* conda 環境でアクセスできます。 JupyterLab でランチャーを選択し、このカーネルを選択します。

azureml_py36_pytorch カーネルの選択を示すスクリーンショット。

ワークスペースを設定する

Azure portal にアクセスして、前提条件の一部としてプロビジョニングしたワークスペースを選択します。 次の図に示すように、構成ファイル config.json のダウンロードに注目してください。 このファイルをダウンロードし、DSVM 上の作業ディレクトリに保存します。

config.json ファイルのダウンロードを示すスクリーンショット。

構成ファイルには、ワークスペース名、サブスクリプションなどの情報が含まれています。 これらのパラメーターをこのファイルでハード コーディングする必要はありません。

DSVM の実行を追跡する

Azure Machine Learning ワークスペース オブジェクトを設定するには、このコードをノートブックまたはスクリプトに追加します。

import mlflow
from azureml.core import Workspace

ws = Workspace.from_config()

mlflow.set_tracking_uri(ws.get_mlflow_tracking_uri())

Note

追跡 URI の有効期間は最大 1 時間です。 一定のアイドル時間の経過後にスクリプトを再起動した場合は、get_mlflow_tracking_uri API を使用して新しい URI を取得してください。

データを読み込む

この例では、糖尿病のデータセットを使用します。scikit-learn に含まれている、よく知られた小規模データセットです。 このセルでは、データセットを読み込み、ランダムのトレーニング セットとテスト セットに分割します。

from sklearn.datasets import load_diabetes
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
import joblib

X, y = load_diabetes(return_X_y = True)
columns = ['age', 'gender', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
data = {
    "train":{"X": X_train, "y": y_train},
    "test":{"X": X_test, "y": y_test}
}

print ("Data contains", len(data['train']['X']), "training samples and",len(data['test']['X']), "test samples")

追跡の追加

Azure Machine Learning SDK を使用して実験の追跡を追加し、永続化されたモデルを実験の実行レコードにアップロードします。 このコード サンプルでは、ログを追加して、実験の実行にモデル ファイルをアップロードします。 モデルは、Azure Machine Learning モデル レジストリにも登録されます。

# Get an experiment object from Azure Machine Learning
from azureml.mlflow import register_model
experiment_name = 'experiment_with_mlflow'
mlflow.set_experiment(experiment_name)

with mlflow.start_run():
    # Log the algorithm parameter alpha to the run
    mlflow.log_param('alpha', 0.03)

    # Create, fit, and test the scikit-learn Ridge regression model
    regression_model = Ridge(alpha=0.03)
    regression_model.fit(data['train']['X'], data['train']['y'])
    preds = regression_model.predict(data['test']['X'])

    # Output the Mean Squared Error to the notebook and to the run
    print('Mean Squared Error is', mean_squared_error(data['test']['y'], preds))
    mlflow.log_metric('mse', mean_squared_error(data['test']['y'], preds))

    # Save the model
    model_file_name = 'model.pkl'
    joblib.dump(value = regression_model, filename = model_file_name)

    # upload the model file explicitly into artifacts
    mlflow.log_artifact(model_file_name)
    # register the model
    register_model(mlflow.active_run(), 'diabetes_model', 'model.pkl', model_framework="ScikitLearn")

Azure Machine Learning で実行を表示する

Azure Machine Learning スタジオで実験の実行を表示できます。 左側のメニューで [実験] を選択し、[experiment_with_mlflow] を選択します。 上記のスニペットで実験に別の名前を付ける場合は、選んだ名前を選択します。

実験の実行の選択を示すスクリーンショット。

ログに記録された平均二乗誤差 (MSE) が表示されます。

実験の実行でログに記録された平均二乗誤差を示すスクリーンショット。

実行を選択すると、[出力 + ログ] に、その他の詳細と選択したモデルを表示できます。

Azure Machine Learning にモデルをデプロイする

このセクションでは、DSVM でトレーニングされたモデルを Azure Machine Learning にデプロイする方法について説明します。

手順 1:推論コンピューティングの作成

次のスクリーンショットに示すように、Azure Machine Learning スタジオの左側のメニューで [コンピューティング] を選択します。

Azure Machine Learning スタジオでの [コンピューティング] の選択を示すスクリーンショット。

[新しい推論クラスター] ペインで、以下について詳細を入力します。

  • コンピューティング名
  • Kubernetes Service - [新規作成] を選択します
  • リージョンを選択します
  • 仮想マシン サイズを選択します (このチュートリアルでは、既定の Standard_D3_v2 で十分です)
  • クラスターの目的 - [開発テスト] を選択します
  • ノード数は 1 にする必要があります
  • ネットワーク構成 - 基本

次のスクリーンショットはこれを示しています。

[推論クラスター] ペインの選択を示すスクリーンショット。

[作成] を選択します

手順 2:コードなしの推論サービスのデプロイ

コードで register_model を使用してモデルを登録したときに、sklearn としてフレームワークを指定しました。 Azure Machine Learning では、これらのフレームワークに対して、コードなしのデプロイがサポートされています。

  • scikit-learn
  • Tensorflow SaveModel 形式
  • ONNX モデル形式

コードなしのデプロイとは、モデル成果物から直接デプロイできることを意味します。 特定のスコアリング スクリプトを指定する必要はありません。

糖尿病モデルをデプロイするには、Azure Machine Learning スタジオの左側のメニューに移動し、[モデル] を選択します。 次に、登録されている diabetes_model を選択します。

糖尿病モデルの選択を示すスクリーンショット。

次に、モデル詳細ウィンドウの [デプロイ] ボタンを選択します。

[デプロイ] ボタンの選択を示すスクリーンショット。

モデルのデプロイ先は、手順 1 で作成した推論クラスター (Azure Kubernetes Service) です。 サービスの名前と、手順 1 で作成した AKS コンピューティング クラスターの名前を指定して、詳細を入力します。 また、[CPU 予約容量] を 0.1 から 1 に、[メモリ予約容量] を 0.5 から 1 に増やすことをお勧めします。 [詳細設定] を選択し、詳細を入力してこの増加を設定します。 その後、次のスクリーンショットに示すように、[デプロイ] を選択します。

モデル デプロイの詳細を示すスクリーンショット。

手順 3:使用

モデルが正常にデプロイされたら、左側のメニューから [エンドポイント] を選択し、デプロイされたサービスの名前を選択します。 次のスクリーンショットに示すように、モデルの詳細ウィンドウが表示されます。

モデルの詳細ウィンドウを示すスクリーンショット。

デプロイの状態は [移行中] から [正常] に変化します。 さらに、詳細セクションには、アプリケーション開発者が ML モデルをアプリに統合するために使用できる REST エンドポイントと Swagger URL が記載されています。

Postman を使用してエンドポイントをテストできます。または、Azure Machine Learning SDK を使用することもできます。

適用対象:Python SDK azureml v1

from azureml.core import Webservice
import json

# if you called your service differently then change the name below
service = Webservice(ws, name="diabetes-service")

input_payload = json.dumps({
    'data': X_test[0:2].tolist(),
    'method': 'predict'  # If you have a classification model, you can get probabilities by changing this to 'predict_proba'.
})

output = service.run(input_payload)

print(output)

手順 4:クリーンアップ

継続的なコンピューティング料金が発生しないように、手順 1 で作成した推論コンピューティングを削除します。 これを行うには、Azure Machine Learning スタジオの左側のメニューで、[コンピューティング] > [推論クラスター] > を選択し、特定の推論コンピューティング リソース > [削除] を選択します。

次のステップ