MLflow を使ったメトリック、パラメーター、ファイルのログ
適用対象: Python SDK azure-ai-ml v2 (現行)
Azure Machine Learning では、MLflow Tracking を使った実験のログと追跡がサポートされています。 MLflow を使うと、ローカルのコンピューターまたはクラウド環境で、モデル、メトリック、パラメーター、成果物をログできます。
重要
Azure Machine Learning SDK v1 とは異なり、Azure Machine Learning SDK for Python (v2) にはログ機能はありません。 以前に Azure Machine Learning SDK v1 を使ったことがある場合は、実験の追跡に MLflow を利用することをお勧めします。 具体的なガイダンスについては、SDK v1 から MLflow へのログの移行に関する記事をご覧ください。
ログは、エラーや警告を診断したり、パラメーターやモデルのパフォーマンスなどのパフォーマンス メトリックを追跡したりするのに役立ちます。 この記事では、次のシナリオでログを有効にする方法について説明します。
- ジョブの送信時にメトリック、パラメーター、モデルをログします。
- 対話形式でのトレーニング時に実行を追跡します。
- メトリックを非同期でログします。
- トレーニングに関する診断情報を表示します。
ヒント
この記事では、モデルのトレーニング プロセスを監視する方法について説明します。 Azure Machine Learning からリソース使用状況やイベント (クォータ、トレーニングジョブの完了、モデル デプロイの完了など) を監視することに関心がある場合は、「Azure Machine Learning の監視」をご覧ください。
前提条件
Azure Machine Learning ワークスペースが必要です。 まだお持ちでない場合は、ワークスペース リソースの作成に関する記事を参照してください。
mlflow
とazureml-mlflow
のパッケージをインストールする必要があります。 していない場合は、次のコマンドを使用して開発環境にインストールします。pip install mlflow azureml-mlflow
Note
メトリックの非同期ログのためには、
MLflow
のバージョン 2.8.0+ とazureml-mlflow
のバージョン 1.55+ が必要です。リモート追跡 (Azure Machine Learning の外部で実行される実験の追跡) を行っている場合は、実験を追跡するように MLflow を構成します。 詳細については、「Azure Machine Learning 用に MLflow を構成する」を参照してください。
Azure Machine Learning の実験で、MLflow を使ってメトリック、パラメーター、成果物、モデルをログするには、単にスクリプトに 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()
を使い、現在使われている実行を 1 回取得できます。 詳細については、「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 = True、1 = False |
重要
パフォーマンスに関する考慮事項: 複数のメトリック (または同じメトリックの複数の値) をログする必要がある場合は、ループ内で mlflow.log_metric
を呼び出さないようにしてください。 mlflow.log_metric("metric1", 9.42, synchronous=False)
で非同期ログを使用するか、メトリックのバッチをログすることで、パフォーマンスを向上させることができます。
メトリックを非同期的にログする
MLflow では、非同期的な方法でのメトリックのログも可能です。 非同期メトリック ログは、数十のコンピューティング ノードを含む大規模なトレーニング ジョブが実行され、メトリックを同時にログに記録しようとしている場合に特に便利です。 少数のノードが多数のメトリックをログに記録しようとしている場合にも役立ちます。
非同期メトリック ログを使用すると、バックエンド サービスでメトリックが具体化されるのを待つのを避けることで、メトリックをすぐにログに記録できます。 このアプローチは、数十万のメトリック値をログに記録する大規模なトレーニング ルーチンのスケーリングに適しており、推奨されるアプローチです。
MLflow は、既定ではメトリックを同期的にログしますが、以下のように、この動作はいつでも変更できます。
import mlflow
mlflow.config.enable_async_logging()
以下のように環境変数を使用して、同じプロパティを設定できます。
export MLFLOW_ENABLE_ASYNC_LOGGING=True
特定のメトリックを非同期的にログするには、通常と同様に MLflow ログ API を使用しますが、以下のように追加パラメーター synchronous=False
を追加します。
import mlflow
with mlflow.start_run():
# (...)
mlflow.log_metric("metric1", 9.42, synchronous=False)
# (...)
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,
synchronous=False,
)
wait()
操作は、以下のようにメトリックのバッチをログするときにも利用できます。
run_operation.wait()
メトリック値にすぐにアクセスする必要がない場合は、ルーチン上で 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 内のファイルは成果物と呼ばれます。 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 では、特定のモデルが機能するために必要なすべての成果物をパッケージ化する方法として、"複数モデル" の概念が導入されています。 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 を使うと、モデルのトレーニング時に、メトリック、モデル パラメーター、モデル成果物を自動的にログできます。 各フレームワークが自動的に追跡する内容を決定します。 さまざまな人気の高い機械学習ライブラリがサポートされています。 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']
を呼び出すと 4 だけが返されます。
特定のメトリック名についてログに記録されたすべてのメトリックを取得するには、例「実行からパラメータとメトリックを取得する」で説明されているように、MlFlowClient.get_metric_history()
を使います。
ヒント
MLflow は複数の実行から同時にメトリックとパラメーターを取得できるため、複数の試行を素早く比較することができます。 詳細については、「クエリの実行および MLflow を使用して実験と実行を比較する」を参照してください。
MLflow は、実行によってログされたあらゆる成果物のクエリを実行できます。 成果物に実行オブジェクト自体を使ってアクセスすることはできません。代わりに、次のように MLflow クライアントを使う必要があります。
client = mlflow.tracking.MlflowClient()
client.list_artifacts("<RUN_ID>")
この方法では、実行で記録されたすべての成果物が一覧表示されますが、それらは成果物ストア (Azure Machine Learning ストレージ) に保存されたままになります。 それらのいずれかをダウンロードするには、次のようにメソッド download_artifact
を使用します。
file_path = client.download_artifacts("<RUN_ID>", path="feature_importance_weight.png")
詳細については、「メトリック、パラメーター、成果物、モデルの取得」を参照してください。
スタジオ内でジョブまたは実行に関する情報を表示する
ログに記録されたメトリックを含む、完了したジョブ レコードを参照するには、Azure Machine Learning スタジオを使います。
[ジョブ] タブに移動します。複数の実験にわたってワークスペース内のすべての実行を表示するには、[すべてのジョブ] タブを選びます。上部のメニュー バーに実験フィルターを適用することで、特定の実験のジョブをドリルダウンできます。 目的のジョブを選んで詳細ビューに移動してから、[メトリック] タブを選びます。
右側にグラフをレンダリングするには、ログされたメトリックを選びます。 スムージングを適用する、色を変更する、複数のメトリックを 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 サポートに問い合わせた場合、サポートはトラブルシューティングの際にこれらのログを使用できる可能性があります。