SDK v1 から SDK v2 へのログの移行

Azure Machine Learning は、Azure Machine Learning Python SDK、Azure Machine Learning CLI、または Azure Machine Learning スタジオのどれを使って実験を作成したかに関係なく、実験のメトリック ログと成果物ストレージに MLflow Tracking を使います。 実験の追跡には MLflow の使用をお勧めします。

SDK v1 から SDK v2 に移行する場合は、このセクションの情報を使用して、SDK v1 のログ API と同等の MLflow について確認してください。

MLflow が選ばれる理由

MLflow は、毎月のダウンロード数が 1,300 万を超え、エンド ツー エンド MLOps の標準プラットフォームとなっています。あらゆる規模のチームがバッチまたはリアルタイムの推論用のモデルを追跡、共有、パッケージ化、デプロイできます。 Azure Machine Learning は MLflow と統合されます。これによりトレーニング コードは、Azure Machine Learning 固有の手順を保持しないため、真の移植性と他のプラットフォームとのシームレスな統合を実現できます。

MLflow への移行を準備する

MLflow 追跡を使用するには、Mlflow SDK パッケージ mlflow と MLflow azureml-mlflow用の Azure Machine Learning プラグインをインストールする必要があります。 すべての Azure Machine Learning 環境には、これらのパッケージが既にありますが、独自の環境を作成する場合は、これらを含める必要があります。

pip install mlflow azureml-mlflow

ワークスペースに接続する

Azure Machine Learning を使用すると、ユーザーは、ワークスペースで実行中、またはリモートで実行中のトレーニング ジョブ (Azure Machine Learning の外部で実行されている実験の追跡) で追跡を実行できます。 リモート追跡を実行する場合は、MLflow を接続するワークスペースを指定する必要があります。

Azure Machine Learning コンピューティングで実行している場合は、ワークスペースに既に接続されています。

実験と実行

SDK v1

from azureml.core import Experiment

# create an Azure Machine Learning experiment and start a run
experiment = Experiment(ws, "create-experiment-sdk-v1")
azureml_run = experiment.start_logging()

MLflow を含む SDK v2

# Set the MLflow experiment and start a run
mlflow.set_experiment("logging-with-mlflow")
mlflow_run = mlflow.start_run()

ログ API の比較

整数または浮動少数のメトリックをログに記録する

SDK v1

azureml_run.log("sample_int_metric", 1)

MLflow を含む SDK v2

mlflow.log_metric("sample_int_metric", 1)

ブール値のメトリックをログに記録する

SDK v1

azureml_run.log("sample_boolean_metric", True)

MLflow を含む SDK v2

mlflow.log_metric("sample_boolean_metric", 1)

文字列のメトリックをログに記録する

SDK v1

azureml_run.log("sample_string_metric", "a_metric")

MLflow を含む SDK v2

mlflow.log_text("sample_string_text", "string.txt")
  • 文字列は、メトリックとしてではなく、成果物として記録されます。 Azure Machine Learning スタジオでは、[出力とログ] タブに値が表示されます。

画像を PNG または JPEG ファイルに記録する

SDK v1

azureml_run.log_image("sample_image", path="Azure.png")

MLflow を含む SDK v2

mlflow.log_artifact("Azure.png")

画像は成果物としてログに記録され、Azure Machine Learning スタジオの [画像] タブに表示されます。

matplotlib.pyplot をログに記録する

SDK v1

import matplotlib.pyplot as plt

plt.plot([1, 2, 3])
azureml_run.log_image("sample_pyplot", plot=plt)

MLflow を含む SDK v2

import matplotlib.pyplot as plt

plt.plot([1, 2, 3])
fig, ax = plt.subplots()
ax.plot([0, 1], [2, 3])
mlflow.log_figure(fig, "sample_pyplot.png")
  • 画像は成果物としてログに記録され、Azure Machine Learning スタジオの [画像] タブに表示されます。

メトリックの一覧をログに記録する

SDK v1

list_to_log = [1, 2, 3, 2, 1, 2, 3, 2, 1]
azureml_run.log_list('sample_list', list_to_log)

MLflow を含む SDK v2

list_to_log = [1, 2, 3, 2, 1, 2, 3, 2, 1]
from mlflow.entities import Metric
from mlflow.tracking import MlflowClient
import time

metrics = [Metric(key="sample_list", value=val, timestamp=int(time.time() * 1000), step=0) for val in list_to_log]
MlflowClient().log_batch(mlflow_run.info.run_id, metrics=metrics)
  • メトリックは、Azure Machine Learning スタジオの [メトリック] タブに表示されます。
  • テキスト値はサポートされていません。

メトリックの行をログに記録する

SDK v1

azureml_run.log_row("sample_table", col1=5, col2=10)

MLflow を含む SDK v2

metrics = {"sample_table.col1": 5, "sample_table.col2": 10}
mlflow.log_metrics(metrics)
  • メトリックは、Azure Machine Learning スタジオではテーブルとしてレンダリングされません。
  • テキスト値はサポートされていません。
  • メトリックとしてではなく、"成果物" としてログに記録されます。

テーブルをログに記録する

SDK v1

table = {
"col1" : [1, 2, 3],
"col2" : [4, 5, 6]
}
azureml_run.log_table("table", table)

MLflow を含む SDK v2

# Add a metric for each column prefixed by metric name. Similar to log_row
row1 = {"table.col1": 5, "table.col2": 10}
# To be done for each row in the table
mlflow.log_metrics(row1)

# Using mlflow.log_artifact
import json

with open("table.json", 'w') as f:
json.dump(table, f)
mlflow.log_artifact("table.json")
  • 各列のメトリックをログに記録します。
  • メトリックは、Azure Machine Learning スタジオではテーブルとしてレンダリングされません。
  • テキスト値はサポートされていません。
  • メトリックとしてではなく、"成果物" としてログに記録されます。

正確性テーブルをログに記録する

SDK v1

ACCURACY_TABLE = '{"schema_type": "accuracy_table", "schema_version": "v1", "data": {"probability_tables": ' +\
        '[[[114311, 385689, 0, 0], [0, 0, 385689, 114311]], [[67998, 432002, 0, 0], [0, 0, ' + \
        '432002, 67998]]], "percentile_tables": [[[114311, 385689, 0, 0], [1, 0, 385689, ' + \
        '114310]], [[67998, 432002, 0, 0], [1, 0, 432002, 67997]]], "class_labels": ["0", "1"], ' + \
        '"probability_thresholds": [0.52], "percentile_thresholds": [0.09]}}'

azureml_run.log_accuracy_table('v1_accuracy_table', ACCURACY_TABLE)

MLflow を含む SDK v2

ACCURACY_TABLE = '{"schema_type": "accuracy_table", "schema_version": "v1", "data": {"probability_tables": ' +\
        '[[[114311, 385689, 0, 0], [0, 0, 385689, 114311]], [[67998, 432002, 0, 0], [0, 0, ' + \
        '432002, 67998]]], "percentile_tables": [[[114311, 385689, 0, 0], [1, 0, 385689, ' + \
        '114310]], [[67998, 432002, 0, 0], [1, 0, 432002, 67997]]], "class_labels": ["0", "1"], ' + \
        '"probability_thresholds": [0.52], "percentile_thresholds": [0.09]}}'

mlflow.log_dict(ACCURACY_TABLE, 'mlflow_accuracy_table.json')
  • メトリックは、Azure Machine Learning スタジオでは正確性テーブルとしてレンダリングされません。
  • メトリックとしてではなく、"成果物" としてログに記録されます。
  • mlflow.log_dict メソッドは実験段階です。

混同行列をログに記録する

SDK v1

CONF_MATRIX = '{"schema_type": "confusion_matrix", "schema_version": "v1", "data": {"class_labels": ' + \
    '["0", "1", "2", "3"], "matrix": [[3, 0, 1, 0], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]}}'

azureml_run.log_confusion_matrix('v1_confusion_matrix', json.loads(CONF_MATRIX))

MLflow を含む SDK v2

CONF_MATRIX = '{"schema_type": "confusion_matrix", "schema_version": "v1", "data": {"class_labels": ' + \
    '["0", "1", "2", "3"], "matrix": [[3, 0, 1, 0], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]}}'

mlflow.log_dict(CONF_MATRIX, 'mlflow_confusion_matrix.json')
  • メトリックは、Azure Machine Learning スタジオでは混同行列としてレンダリングされません。
  • メトリックとしてではなく、"成果物" としてログに記録されます。
  • mlflow.log_dict メソッドは実験段階です。

予測をログに記録する

SDK v1

PREDICTIONS = '{"schema_type": "predictions", "schema_version": "v1", "data": {"bin_averages": [0.25,' + \
    ' 0.75], "bin_errors": [0.013, 0.042], "bin_counts": [56, 34], "bin_edges": [0.0, 0.5, 1.0]}}'

azureml_run.log_predictions('test_predictions', json.loads(PREDICTIONS))

MLflow を含む SDK v2

PREDICTIONS = '{"schema_type": "predictions", "schema_version": "v1", "data": {"bin_averages": [0.25,' + \
    ' 0.75], "bin_errors": [0.013, 0.042], "bin_counts": [56, 34], "bin_edges": [0.0, 0.5, 1.0]}}'

mlflow.log_dict(PREDICTIONS, 'mlflow_predictions.json')
  • メトリックは、Azure Machine Learning スタジオでは混同行列としてレンダリングされません。
  • メトリックとしてではなく、"成果物" としてログに記録されます。
  • mlflow.log_dict メソッドは実験段階です。

残差をログに記録する

SDK v1

RESIDUALS = '{"schema_type": "residuals", "schema_version": "v1", "data": {"bin_edges": [100, 200, 300], ' + \
'"bin_counts": [0.88, 20, 30, 50.99]}}'

azureml_run.log_residuals('test_residuals', json.loads(RESIDUALS))

MLflow を含む SDK v2

RESIDUALS = '{"schema_type": "residuals", "schema_version": "v1", "data": {"bin_edges": [100, 200, 300], ' + \
'"bin_counts": [0.88, 20, 30, 50.99]}}'

mlflow.log_dict(RESIDUALS, 'mlflow_residuals.json')
  • メトリックは、Azure Machine Learning スタジオでは混同行列としてレンダリングされません。
  • メトリックとしてではなく、"成果物" としてログに記録されます。
  • mlflow.log_dict メソッドは実験段階です。

実行情報とデータを表示する

実行情報には、MLflow 実行 (mlflow.entities.Run) オブジェクトのプロパティ datainfo を使用してアクセスできます。

ヒント

Azure Machine Learning の実験と実行の追跡情報は、MLflow を使用してクエリで照会できます。これは、実験と実行に対するクエリと検索を簡単に行い、結果をすばやく比較するための包括的な検索 API を提供します。 このディメンションの MLflow のすべての機能の詳細については、「クエリと実験と実行を MLflow と比較する」を参照してください

次の例は、終了した実行を取得する方法を示しています。

from mlflow.tracking import MlflowClient

# Use MlFlow to retrieve the run that was just completed
client = MlflowClient()
finished_mlflow_run = MlflowClient().get_run("<RUN_ID>")

次の例は、metricstagsparams の表示方法を示しています。

metrics = finished_mlflow_run.data.metrics
tags = finished_mlflow_run.data.tags
params = finished_mlflow_run.data.params

注意

metrics は、指定されたメトリックに対して最後にログに記録された値のみを持ちます。 たとえば、sample_metric というメトリックに対して、1 の値、その後 23、最後に 4 の順序でログに記録する場合は、metrics ディクショナリには 4 のみ存在します。 特定の名前が付けられたメトリックについてログに記録されたすべてのメトリックを取得するには、MlFlowClient.get_metric_history を使用します。

with mlflow.start_run() as multiple_metrics_run:
    mlflow.log_metric("sample_metric", 1)
    mlflow.log_metric("sample_metric", 2)
    mlflow.log_metric("sample_metric", 3)
    mlflow.log_metric("sample_metric", 4)

print(client.get_run(multiple_metrics_run.info.run_id).data.metrics)
print(client.get_metric_history(multiple_metrics_run.info.run_id, "sample_metric"))

詳細については、MlFlowClient のリファレンスを参照してください。

info フィールドは、開始時刻、実行 ID、実験 ID など、実行に関する一般的な情報を提供します。

run_start_time = finished_mlflow_run.info.start_time
run_experiment_id = finished_mlflow_run.info.experiment_id
run_id = finished_mlflow_run.info.run_id

実行の成果物を表示する

実行の成果物を表示するには、MlFlowClient.list_artifacts を使用します。

client.list_artifacts(finished_mlflow_run.info.run_id)

成果物をダウンロードするには、mlflow.artifacts.download_artifacts を使用します。

mlflow.artifacts.download_artifacts(run_id=finished_mlflow_run.info.run_id, artifact_path="Azure.png")

次のステップ