Azure Machine Learningでは、MLflow Tracking を使用した実験のログ記録と追跡がサポートされています。 モデル、メトリック、パラメーター、アーティファクトを MLflow を使用して、コンピューター上またはクラウド環境でローカルに記録できます。
重要
Azure Machine Learning SDK v1 とは異なり、Azure Machine Learning SDK for Python (v2) にはログ機能はありません。 以前に SDK v1 Azure Machine Learning使用した場合は、MLflow を利用して実験を追跡することをお勧めします。 具体的なガイダンスについては、SDK v1 から MLflow へのログの移行に関する記事をご覧ください。
ログは、エラーや警告を診断したり、パラメーターやモデルのパフォーマンスなどのパフォーマンス メトリックを追跡したりするのに役立ちます。 この記事では、次のシナリオでログを有効にする方法について説明します。
- ジョブの送信時にメトリック、パラメーター、モデルをログします。
- 対話形式でのトレーニングの実行を追跡します。
- メトリックを非同期でログします。
- トレーニングに関する診断情報を表示します。
ヒント
この記事では、モデルのトレーニング プロセスを監視する方法について説明します。 クォータ、完了したトレーニング ジョブ、完了したモデルデプロイなど、Azure Machine Learningからのリソースの使用状況とイベントの監視に関心がある場合は、「Monitoring Azure Machine Learningを参照してください。
前提条件
Azure Machine Learning ワークスペースが必要です。 まだお持ちでない場合は、ワークスペース リソースの作成に関する記事を参照してください。
Python 3.10 以降がインストールされている必要があります。
mlflowとazureml-mlflowのパッケージをインストールする必要があります。 していない場合は、次のコマンドを使用して開発環境にインストールします。pip install mlflow azureml-mlflow注
メトリックの非同期ログのためには、
MLflowのバージョン 2.8.0+ とazureml-mlflowのバージョン 1.55+ が必要です。リモート追跡 (Azure Machine Learning外で実行される実験の追跡) を実行している場合は、実験を追跡するように MLflow を構成します。 詳細については、
Azure Machine Learning を参照してください。MLflow を使用して実験のメトリック、パラメーター、artifacts、モデルをAzure Machine Learningログに記録するには、MLflow をスクリプトにインポートするだけです。
import mlflow
実験を構成する
MLflow は実験と実行の情報を整理します (Azure Machine Learningでは、実行はジョブと呼ばれます)。 コードの実行方法により、それらの構成方法にはいくつかの違いがあります。
Jupyter Notebookなどで対話形式でトレーニングする場合は、次のパターンを使用します。
- アクティブな実験を作成または設定します。
- ジョブを開始します。
- ログ方法を使用して、メトリックやその他の情報をログします。
- ジョブを終了します。
たとえば、次のコード スニペットで実験を設定し、ジョブ中にログを記録します。
import mlflow
# Set the experiment
mlflow.set_experiment("mlflow-experiment")
# Start the run
mlflow_run = mlflow.start_run()
# Log metrics or other information
mlflow.log_metric('mymetric', 1)
# End run
mlflow.end_run()
ヒント
実行が存在しない場合にログ API を呼び出すと新しく実行が作成されるため、技術的にはstart_run()を呼び出す必要はありません。 その場合、mlflow.active_run() を使って現在使用中の実行を取得できます。 詳細については、「mlflow.active_run()」を参照してください。
コンテキスト マネージャー パラダイムを使用することもできます。
import mlflow
mlflow.set_experiment("mlflow-experiment")
# Start the run, log metrics, end the run
with mlflow.start_run() as run:
# Run started when context manager is entered, and ended when context manager exits
mlflow.log_metric('mymetric', 1)
mlflow.log_metric('anothermetric',1)
pass
mlflow.start_run を使用して新しい実行を開始する場合は、パラメーター run_name を指定することで、Azure Machine Learning のユーザー インターフェイスで実行の名前に変換され、実行を素早く特定するのに役立ちます。
with mlflow.start_run(run_name="iris-classifier-random-forest") as run:
mlflow.log_metric('mymetric', 1)
mlflow.log_metric('anothermetric',1)
MLflow ログ API の詳細については、 MLflow リファレンスを参照してください。
ログのパラメーター
MLflow は、実験で使われるログ パラメーターをサポートします。 パラメーターはどのような型でもよく、次の構文を使ってログできます。
mlflow.log_param("num_epochs", 20)
また、MLflow では、ディクショナリを使ってすべて示すことで、複数のパラメーターをログする便利な方法も提供されています。 複数のフレームワークでディクショナリを使ってモデルにパラメーターを渡すこともできるので、これは実験でそれらをログする便利な方法です。
params = {
"num_epochs": 20,
"dropout_rate": .6,
"objective": "binary_crossentropy"
}
mlflow.log_params(params)
メトリックのログ記録
メトリックは、パラメーターとは異なり、常に数値であり、同期的または非同期的にログできます。 メトリックがログされると、呼び出し後すぐに直ちに利用できるようになります。 次の表では、特定の数値型をログする方法について説明します。
| ログ値 | コード例 | メモ |
|---|---|---|
| 数値 (int または float) をログに記録する | mlflow.log_metric("my_metric", 1) |
|
| 経時的に数値 (int または float) をログする | mlflow.log_metric("my_metric", 1, step=1) |
メトリック値をログするステップを示すには、step パラメーターを使います。 任意の整数を指定できます。 この既定値は 0 です。 |
| ブール値をログに記録する | mlflow.log_metric("my_metric", 0) |
0 = False、1 = True |
重要
パフォーマンスに関する考慮事項: 複数のメトリック (または同じメトリックの複数の値) をログする必要がある場合は、ループ内で mlflow.log_metric を呼び出さないようにしてください。
非同期ログ記録を活用することでmlflow.log_metric("metric1", 9.42, synchronous=False)、またはメトリックのバッチをログすることで、パフォーマンスを向上させることができます。
メトリックを非同期的にログする
MLflow では、非同期的な方法でのメトリックのログも可能です。 非同期メトリック ログは、数十のコンピューティング ノードを含む大規模なトレーニング ジョブが実行され、メトリックを同時にログに記録しようとしている場合に特に便利です。 少数のノードが多数のメトリックをログに記録しようとしている場合にも役立ちます。
非同期メトリック ログを使用すると、バックエンド サービスでメトリックが具体化されるのを待つのを避けることで、メトリックをすぐにログに記録できます。 このアプローチは、数十万のメトリック値をログに記録する大規模なトレーニング ルーチンのスケーリングに適しており、推奨されるアプローチです。
MLflow は、既定ではメトリックを同期的にログしますが、以下のように、この動作はいつでも変更できます。
import mlflow
mlflow.config.enable_async_logging()
コード全体でメトリックの非同期ログ記録を有効にする場合や、実際のメトリックをログに記録するために mlflow をラップするラッパー ライブラリを使用している場合は、上記のグローバル フラグを使用することをお勧めします。
以下のように環境変数を使用して、同じプロパティを設定できます。
export MLFLOW_ENABLE_ASYNC_LOGGING=True
特定のメトリックを非同期的にログするには、通常と同様に MLflow ログ API を使用しますが、以下のように追加パラメーター synchronous=False を追加します。
synchronous=Falseを使用して非同期的にログインするようにグローバル フラグを設定する場合、mlflow.config.enable_async_logging()の設定は省略可能です。
import mlflow
with mlflow.start_run():
# (...)
# when global async logging flag is not set using - mlflow.config.enable_async_logging()
mlflow.log_metric("metric1", 9.42, synchronous=False)
# (...)
import mlflow
# Set global async logging flag
mlflow.config.enable_async_logging()
with mlflow.start_run():
# (...)
# You can use all fluent syntax or MlflowClient APIs and all of them will log metrics in asynchronous fashion.
mlflow.log_metric("metric1", 9.42)
# (...)
log_metric(synchronous=False)を使用すると、操作が受け入れられると、コントロールが呼び出し元に自動的に返されますが、値はすぐには読み取られません。 メトリックの非同期ログ記録では順序が保証され、ログに記録された時刻のタイムスタンプで保持されます。
重要
synchronous=Falseでも、Azure Machine Learningはメトリックの順序を保証します。
バックエンドで特定の値が保存されるのを待機する必要がある場合は、次の例で示すように、返されたメトリック操作を使用してそれを待機できます。
import mlflow
with mlflow.start_run():
# (...)
run_operation = mlflow.log_metric("metric1", 9.42, synchronous=False)
# (...)
run_operation.wait()
# (...)
次の例に示すように、一度に 1 つのメトリックを非同期的にログしたり、メトリックのバッチをログしたりできます。
import mlflow
import time
from mlflow.entities import Metric
with mlflow.start_run() as current_run:
mlflow_client = mlflow.tracking.MlflowClient()
metrics = {"metric-0": 3.14, "metric-1": 6.28}
timestamp = int(time.time() * 1000)
metrics_arr = [Metric(key, value, timestamp, 0) for key, value in metrics.items()]
run_operation = mlflow_client.log_batch(
run_id=current_run.info.run_id,
metrics=metrics_arr,
#Optional when global async logging flag is set using - mlflow.enable_async_logging()
synchronous=False,
)
wait() 操作は、以下のようにメトリックのバッチをログするときにも利用できます。
run_operation.wait()
メトリック値にすぐにaccessする必要がない場合は、ルーチンで wait() を呼び出す必要はありません。 Azure Machine Learningは、ジョブが終了する前に自動的に待機し、保留中のメトリックが保持されるかどうかを確認します。 ジョブがAzure Machine Learningで完了するまでに、すべてのメトリックが保持されていることが保証されます。
カーブまたは値のリストを記録する
同じメトリックを複数回ログすることで、カーブ (または数値のリスト) を MLflow でログできます。 次の例は、その方法を示しています。
list_to_log = [1, 2, 3, 2, 1, 2, 3, 2, 1]
from mlflow.entities import Metric
from mlflow.tracking import MlflowClient
import time
client = MlflowClient()
client.log_batch(mlflow.active_run().info.run_id,
metrics=[Metric(key="sample_list", value=val, timestamp=int(time.time() * 1000), step=0) for val in list_to_log])
画像をログする
MLflow では、2 つの方法で画像をログできます。 どちらの方法でも、指定された画像を実行内の成果物として保持します。
| ログ値 | コード例 | メモ |
|---|---|---|
| numpy メトリックまたは PIL 画像オブジェクトをログに記録する | mlflow.log_image(img, "figure.png") |
img は、numpy.ndarray または PIL.Image.Image のインスタンスであることが必要です。
figure.png は、実行の内部で生成される成果物の名前です。 既存のファイルである必要はありません。 |
| matplotlib プロットまたは画像ファイルをログする | mlflow.log_figure(fig, "figure.png") |
figure.png は、実行の内部で生成される成果物の名前です。 既存のファイルである必要はありません。 |
ログ ファイル
一般に、MLflow 内のファイルは artifacts と呼ばれます。 MLflowでは、複数の方法でアーティファクトをログに記録できます。
| ログ値 | コード例 | メモ |
|---|---|---|
| テキスト ファイル内のテキストをログする | mlflow.log_text("text string", "notes.txt") |
テキストは、notes.txt という名前のテキスト ファイルで実行の内部に保持されます。 |
| ディクショナリを JSON および YAML ファイルとしてログする | mlflow.log_dict(dictionary, "file.yaml") |
dictionary は、JSON または YAML ファイルとして永続化するすべての構造体を含むディクショナリ オブジェクトです。 |
| 既に存在する些末なファイルをログする | mlflow.log_artifact("path/to/file.pkl") |
ファイルは常に実行のルートにログされます。
artifact_path を指定した場合、ファイルはそのパラメーターで示されているようにフォルダーにログされます。 |
| 既存のフォルダー内のすべてのアーティファクトを記録する | mlflow.log_artifacts("path/to/folder") |
フォルダー構造は実行にコピーされますが、指定したルート フォルダーは含まれません。 |
ヒント
log_artifact または log_model を使って大きなファイルをログすると、ファイルのアップロードが完了する前に、タイムアウト エラーが発生する場合があります。 環境変数 AZUREML_ARTIFACTS_DEFAULT_TIMEOUT を調整して、タイムアウト値を増やすことを検討してください。 既定値は 300 (秒) です。
ログモデル
MLflow では、特定のモデルが機能するために必要なすべてのartifactsをパッケージ化する方法として、models の概念が導入されています。 MLflow のモデルは、モデルの生成に使われるフレームワークに応じて、常に任意の数のファイルを含むフォルダーです。 モデルのログには、モデルのすべての要素を登録してからデプロイできる 1 つのエンティティとして追跡するという利点があります。 その上、MLflow モデルは、ノーコードのデプロイという利点があり、スタジオの責任ある AI ダッシュボードで使用できます。 詳細については、「MLflow におけるアーティファクトからモデルへの流れ」を参照してください。
トレーニング実行からモデルを保存するには、使用しているフレームワークのlog_model() API を使用します。 たとえば、mlflow.sklearn.log_model() などです。 詳細については、MLflow モデルのログに関する記事を参照してください。 既存のモデルを MLflow に移行する方法については、カスタム モデルの MLflow への変換に関する記事を参照してください。
ヒント
大規模なモデルをログすると、エラー Failed to flush the queue within 300 seconds が発生する可能性があります。 通常、これはモデルのアーティファクトのアップロードが完了する前に操作がタイムアウトすることを意味します。 環境変数 AZUREML_ARTIFACTS_DEFAULT_TIMEOUT を調整して、タイムアウト値を増やすことを検討してください。
自動ログ記録
Azure Machine Learningと MLflow を使用すると、ユーザーはモデルのトレーニング時にメトリック、モデル パラメーター、モデル artifactsを自動的にログに記録できます。 各フレームワークが自動的に追跡する内容を決定します。 一般的なmachine learning ライブラリのバリアントがサポートされています。 MLflow による自動ログ記録の詳細情報を参照してください。
自動ログ記録を有効にするには、トレーニング コードの前に次のコードを挿入します。
mlflow.autolog()
ヒント
自動ログで自動的にログされるものを制御できます。 たとえば、mlflow.autolog(log_models=False) を指定した場合、MLflow によってモデル以外のすべてが自動的にログされます。 このような制御は、モデルを手動でログしながら、メトリックとパラメーターは引き続き自動でログしたい場合に便利です。 また、トレーニング済みのモデルが特定の境界を超えると、一部のフレームワークでモデルの自動ログが無効になる場合があることにも注意してください。 このような動作は使われているフレーバーによって異なり、この場合はドキュメントを確認することをお勧めします。
MLflow を使用してジョブまたは実行に関する情報を表示する
MLflow.entities.Run オブジェクトでは、MLflow を使ってログに記録された情報を表示できます。
import mlflow
run = mlflow.get_run(run_id="<RUN_ID>")
実行オブジェクトのデータ フィールドで、実行のメトリック、パラメーター、およびタグを表示できます。
metrics = run.data.metrics
params = run.data.params
tags = run.data.tags
注
mlflow.get_run か mlflow.search_runs によって返されるメトリック辞書は、指定されたメトリック名に対して最後にログに記録された値のみを返します。 たとえば、iteration というメトリックを、値 1、2、3、4 の順に使って複数回ログした場合、 を呼び出すと run.data.metrics['iteration'] だけが返されます。
特定のメトリック名についてログに記録されたすべてのメトリックを取得するには、例「MlFlowClient.get_metric_history()」で説明されているように、 を使用します。
ヒント
MLflow は複数の実行から同時にメトリックとパラメーターを取得できるため、複数の試行を素早く比較することができます。 詳細については、「クエリの実行および MLflow を使用して実験と実行を比較する」を参照してください。
MLflow は、実行によってログされたあらゆる成果物のクエリを実行できます。 Artifacts run オブジェクト自体を使用してアクセスすることはできません。代わりに MLflow クライアントを使用する必要があります。
client = mlflow.tracking.MlflowClient()
client.list_artifacts("<RUN_ID>")
このメソッドは、実行に記録されたすべてのartifactsを一覧表示しますが、artifacts ストア (Azure Machine Learning storage) に保存されたままです。 いずれかをダウンロードするには、 download_artifacts メソッドを使用します。
file_path = mlflow.artifacts.download_artifacts(run_id="<RUN_ID>", artifact_path="feature_importance_weight.png")
詳細については、メトリクス、パラメータ、アーティファクト、モデルの取得を参照してください。
ジョブまたは実行に関する情報を Studio 内で表示する
Azure Machine Learning studioで、ログに記録されたメトリックを含む完了したジョブ レコードを参照できます。
[ジョブ] タブに移動します。複数の実験にわたってワークスペース内のすべての実行を表示するには、[すべてのジョブ] タブを選びます。上部のメニュー バーに実験フィルターを適用することで、特定の実験のジョブをドリルダウンできます。 目的のジョブを選んで詳細ビューに移動してから、[メトリック] タブを選びます。
右側にグラフをレンダリングするには、ログされたメトリックを選びます。 スムージングを適用する、色を変更する、複数のメトリックを 1 つのグラフにプロットするという方法でグラフをカスタマイズすることができます。 また、サイズ変更、レイアウトの並べ替えも自由に行えます。 目的のビューを作成したら、後で使用できるように保存することや、直接リンクを使ってチームメイトと共有することができます。
診断ログの表示とダウンロード
ログ ファイルは、Azure Machine Learningワークロードをデバッグするために不可欠なリソースです。 トレーニング ジョブを送信した後、特定の実行にドリルダウンしてそのログと出力を表示します。
- [ジョブ] タブに移動します。
- 特定の実行の runID を選択します。
- ページの上部にある [出力とログ] を選択します。
- [すべてダウンロード] を選択して、すべてのログを zip フォルダーにダウンロードします。
- 個々のログ ファイルをダウンロードするには、ログ ファイルを選択して [ダウンロード] を選択します。
user_logs フォルダー
このフォルダーには、ユーザーが生成したログに関する情報が格納されます。 このフォルダーは既定で開いており、std_log.txt ログが選択されています。
std_log.txt には、コードのログ (print ステートメントなど) が表示されます。 このファイルには、プロセスごとに 1 つ、コントロール スクリプトとトレーニング スクリプトからの stdout ログと stderr ログが格納されます。 ほとんどの場合、ここでログを監視します。
system_logs フォルダー
このフォルダーには、Azure Machine Learningによって生成されたログが含まれており、既定で閉じられます。 システムによって生成されたログは、実行時のジョブのステージに基づいて、別々のフォルダーにグループ化されます。
その他のフォルダー
マルチコンピューティング クラスターでのジョブのトレーニングでは、IP ノードごとにログが存在します。 各ノードの構造は、単一ノードのジョブと同じです。 execution、stderr、stdout のログ全般に対して 1 つのログ フォルダーが追加されています。
Azure Machine Learning、AutoML やトレーニング ジョブを実行する Docker コンテナーなど、トレーニング中のさまざまなソースからの情報をログに記録します。 これらのログの多くについては、ドキュメントに記載されていません。 問題が発生し、Microsoft supportに連絡した場合、トラブルシューティング中にこれらのログを使用できる可能性があります。
関連するコンテンツ
MLflow と Azure Machine Learning - SDK v1 ログから MLflow 追跡に移行する