メトリックおよびログ ファイルの記録および表示 (v1)

適用対象:Python SDK azureml v1

既定の Python ログ パッケージと Azure Machine Learning Python SDK 固有の機能の両方を使用してリアルタイムの情報をログに記録します。 ユーザーは、ポータルでローカルにログを記録し、ワークスペースにログを送信することができます。

ログは、エラーや警告を診断したり、パラメーターやモデルのパフォーマンスなどのパフォーマンス メトリックを追跡したりするのに役立ちます。 この記事では、次のシナリオでログ記録を有効にする方法について説明します。

  • 実行メトリックのログ記録
  • 対話型のトレーニング セッション
  • ScriptRunConfig を使用したトレーニング ジョブの送信
  • Python ネイティブの logging 設定
  • その他のソースからのログ記録

ヒント

この記事では、モデルのトレーニング プロセスを監視する方法について説明します。 Azure Machine Learning からリソース使用状況やイベント (クォータ、トレーニング実行の完了、モデル デプロイの完了など) を監視することに関心がある場合は、「Azure Machine Learning の監視」を参照してください。

データ型

複数のデータ型 (スカラー値、リスト、テーブル、イメージ、ディレクトリなど) をログに記録できます。 詳細と、さまざまなデータ型の Python コード例については、Run クラスの参照ページを参照してください。

実行メトリックのログ

ログ API で次のメソッドを使用して、メトリックの視覚化に影響を与えます。 これらのログに記録されたメトリックのサービスの制限に注意してください。

ログに記録される値 コード例 ポータルでの形式
数値の配列をログに記録します run.log_list(name='Fibonacci', value=[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]) 単一変数の折れ線グラフ
(for ループ内からのように) 繰り返し使用される、同じメトリック名を持つ単一数値をログに記録します for i in tqdm(range(-10, 10)): run.log(name='Sigmoid', value=1 / (1 + np.exp(-i))) angle = i / 2.0 単一変数の折れ線グラフ
2 つの数値列が繰り返し含まれる 1 行をログに記録します run.log_row(name='Cosine Wave', angle=angle, cos=np.cos(angle)) sines['angle'].append(angle) sines['sine'].append(np.sin(angle)) 変数が 2 つの折れ線グラフ
2 つの数値列を含むテーブルをログに記録します run.log_table(name='Sine Wave', value=sines) 変数が 2 つの折れ線グラフ
イメージをログに記録します run.log_image(name='food', path='./breadpudding.jpg', plot=None, description='desert') このメソッドを使用してイメージ ファイルをログに記録するか、matplotlib を使用して実行にプロットします。 これらのイメージは実行レコードで表示して比較できます

MLflow を使用したログ

モデル、メトリック、および成果物のログ記録には、ローカル モードからクラウドへの移植性をサポートしているオープン ソースの MLflow の使用をお勧めします。 次の表とコード例は、MLflow を使用してトレーニングの実行からメトリックと成果物をログに記録する方法を示しています。 MLflow のログ記録方法と設計パターンの詳細を確認してください

必ず mlflowazureml-mlflow の pip パッケージをお使いのワークスペースにインストールしてください。

pip install mlflow
pip install azureml-mlflow

MLflow トラッキング URI が Azure Machine Learning バックエンドを指すように設定して、メトリックと成果物がワークスペースに記録されるようにします。

from azureml.core import Workspace
import mlflow
from mlflow.tracking import MlflowClient

ws = Workspace.from_config()
mlflow.set_tracking_uri(ws.get_mlflow_tracking_uri())

mlflow.create_experiment("mlflow-experiment")
mlflow.set_experiment("mlflow-experiment")
mlflow_run = mlflow.start_run()
ログに記録される値 コード例 メモ
数値 (int または float) をログに記録する mlflow.log_metric('my_metric', 1)
ブール値をログに記録する mlflow.log_metric('my_metric', 0) 0 = True、1 = False
文字列をログに記録する mlflow.log_text('foo', 'my_string') 成果物としてログに記録されます
numpy メトリックまたは PIL 画像オブジェクトをログに記録する mlflow.log_image(img, 'figure.png')
matlotlib プロットまたは画像ファイルをログに記録する mlflow.log_figure(fig, "figure.png")

SDK を使用して実行メトリックを表示する

run.get_metrics() を使用して、トレーニング済みモデルのメトリックを表示できます。

from azureml.core import Run
run = Run.get_context()
run.log('metric-name', metric_value)

metrics = run.get_metrics()
# metrics is of type Dict[str, List[float]] mapping metric names
# to a list of the values for that metric in the given run.

metrics.get('metric-name')
# list of metrics in the order they were recorded

MLflow では、実行オブジェクトのデータと情報のプロパティを介して実行情報にアクセスすることもできます。 詳細については、MLflow.entities.Run オブジェクトのドキュメントを参照してください。

実行が完了したら、MlFlowClient() を使用してこれを取得できます。

from mlflow.tracking import MlflowClient

# Use MlFlow to retrieve the run that was just completed
client = MlflowClient()
finished_mlflow_run = MlflowClient().get_run(mlflow_run.info.run_id)

実行オブジェクトのデータ フィールドで、実行のメトリック、パラメーター、およびタグを表示できます。

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

注意

mlflow.entities.Run.data.metrics の下のメトリック辞書は、指定されたメトリック名に対して最後にログに記録された値のみを返します。 たとえば、sample_metric という名前のメトリックに対して 1、2、3、4 の順にログが記録された場合、sample_metric のメトリック辞書に含まれるのは 4 のみです。

特定のメトリック名に対してログに記録されたすべてのメトリックを取得するには、MlFlowClient.get_metric_history() を使用できます。

スタジオの UI で実行メトリックを表示する

ログに記録されたメトリックを含む、完了した実行レコードを参照するには、Azure Machine Learning Studio を使用します。

[実験] タブに移動します。複数の実験にわたってワークスペース内のすべての実行を表示するには、 [すべての実行] タブを選択します。上部のメニュー バーに実験フィルターを適用することで、特定の実験の実行をドリルダウンできます。

個々の実験ビューで、 [すべての実験の] タブを選択します。実験実行ダッシュボードでは、実行ごとに追跡されたメトリックとログを確認できます。

また、実行一覧テーブルを編集して、複数の実行を選択し、特定の実行に関してログに記録された直近の値や、最小値、最大値を表示することができます。 グラフをカスタマイズして、ログに記録されたメトリック値と集計を複数の実行にわたって比較します。 グラフの y 軸に複数のメトリックをプロットし、x 軸をカスタマイズしてログ記録されたメトリックをプロットすることができます。

実行のログ ファイルを表示およびダウンロードする

ログ ファイルは、Azure Machine Learning ワークロードをデバッグするための必須リソースです。 トレーニング ジョブを送信した後、特定の実行にドリルダウンしてそのログと出力を表示します。

  1. [実験] タブに移動します。
  2. 特定の実行の runID を選択します。
  3. ページの上部にある [出力とログ] を選択します。
  4. [すべてダウンロード] を選択して、すべてのログを zip フォルダーにダウンロードします。
  5. 個々のログ ファイルをダウンロードするには、ログ ファイルを選択して [ダウンロード] を選択します。

実行の [出力とログ] セクションのスクリーンショット。

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 サポートに問い合わせた場合、サポートはトラブルシューティングの際にこれらのログを使用できる可能性があります。

対話型のログ セッション

対話型のログ セッションは、通常、ノートブック環境で使用されます。 メソッド Experiment.start_logging() を使用すると、対話型のログ セッションが開始されます。 セッション中にログに記録されるすべてのメトリックは、実験の実行レコードに追加されます。 メソッド run.complete() を使用すると、セッションが終了し、実行が完了としてマークされます。

ScriptRun ログ

このセクションでは、ScriptRunConfig を使用して構成したときに作成される実行の内部にログ記録のコードを追加する方法について説明します。 ScriptRunConfig クラスを使用して、反復可能な実行のためにスクリプトと環境をカプセル化できます。 このオプションを使用して、監視用の視覚的な Jupyter Notebook ウィジェットを表示することもできます。

この例では、アルファ値に対してパラメーター スイープを実行し、run.log() メソッドを使用して結果をキャプチャします。

  1. ログ記録ロジック train.py を含むトレーニング スクリプトを作成します。

    # Copyright (c) Microsoft. All rights reserved.
    # Licensed under the MIT license.
    
    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
    from azureml.core.run import Run
    import os
    import numpy as np
    import mylib
    # sklearn.externals.joblib is removed in 0.23
    try:
        from sklearn.externals import joblib
    except ImportError:
        import joblib
    
    os.makedirs('./outputs', exist_ok=True)
    
    X, y = load_diabetes(return_X_y=True)
    
    run = Run.get_context()
    
    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}}
    
    # list of numbers from 0.0 to 1.0 with a 0.05 interval
    alphas = mylib.get_alphas()
    
    for alpha in alphas:
        # Use Ridge algorithm to create a regression model
        reg = Ridge(alpha=alpha)
        reg.fit(data["train"]["X"], data["train"]["y"])
    
        preds = reg.predict(data["test"]["X"])
        mse = mean_squared_error(preds, data["test"]["y"])
        run.log('alpha', alpha)
        run.log('mse', mse)
    
        model_file_name = 'ridge_{0:.2f}.pkl'.format(alpha)
        # save model in the outputs folder so it automatically get uploaded
        with open(model_file_name, "wb") as file:
            joblib.dump(value=reg, filename=os.path.join('./outputs/',
                                                         model_file_name))
    
        print('alpha is {0:.2f}, and mse is {1:0.2f}'.format(alpha, mse))
    
  2. train.py スクリプトを送信して、ユーザー管理の環境内で実行します。 スクリプト フォルダー全体がトレーニング用に送信されます。

    from azureml.core import ScriptRunConfig
    
    src = ScriptRunConfig(source_directory='./scripts', script='train.py', environment=user_managed_env)
    run = exp.submit(src)

    show_output パラメーターを使用すると詳細なログ記録が有効になり、これによってトレーニング プロセスからの詳細情報と、リモート リソースまたはコンピューティング先に関する情報を見ることができます。 次のコードを使用して、実験を送信するときに詳細ログ記録を有効にします。

    run = exp.submit(src, show_output=True)
    

    結果の実行時に wait_for_completion 関数で同じパラメーターを使用することもできます。

    run.wait_for_completion(show_output=True)
    

ネイティブの Python のログ

SDK の一部のログには、ログ レベルを DEBUG に設定するよう指示するエラーが含まれる場合があります。 ログ記録のレベルを設定するには、スクリプトに次のコードを追加します。

import logging
logging.basicConfig(level=logging.DEBUG)

他のログ記録ソース

Azure Machine Learning では、トレーニング中に、自動機械学習の実行や、ジョブを実行する Docker コンテナーなど、他のソースからの情報をログに記録することもできます。 これらのログは文書化されていませんが、問題が発生して Microsoft サポートに問い合わせた場合、サポートはトラブルシューティングの際にこれらのログを使用できる可能性があります。

Azure Machine Learning デザイナーにおけるメトリックのログ記録の詳細については、デザイナーでメトリックをログに記録する方法に関する記事を参照してください

サンプルの Notebook

次の Notebook は、この記事の概念を示しています。

ノートブックの実行方法については、Jupyter Notebook を使用してこのサービスを探索する方法に関するページを参照してください。

次のステップ

Azure Machine Learning の使用方法の詳細については、これらの記事を参照してください。