Application Insights でアラートとデバッグ用に機械学習パイプラインのログ ファイルを収集する
OpenCensus の Python ライブラリを使用して、スクリプトから Application Insights にログをルーティングできます。 パイプラインの実行のログを 1 か所に集約することで、クエリを作成し、イシューを診断することができます。 Application Insights を使用すると、ログを経時的に追跡し、実行全体のパイプライン ログを比較することができます。
ログを 1 か所で保持すれば、例外とエラー メッセージの履歴がわかります。 Application Insights は Azure アラートと統合されるため、Application Insights のクエリに基づいてアラートを作成することもできます。
前提条件
- 手順に従って Azure Machine Learning ワークスペースを作成し、最初のパイプラインを作成します
- Azure Machine Learning SDK をインストールするための開発環境を構成します。
- OpenCensus の Azure Monitor エクスポーターのパッケージをローカルにインストールします。
pip install opencensus-ext-azure
- Application Insights インスタンスを作成します (このドキュメントには、リソースの接続文字列の取得に関する情報も含まれています)
作業の開始
このセクションでは、Azure Machine Learning パイプラインから OpenCensus を使用する方法のみを説明します。 詳細なチュートリアルについては、「OpenCensus Azure Monitor Exporters」(OpenCensus の Azure Monitor エクスポーター) を参照してください
PythonScriptStep を Azure Machine Learning パイプラインに追加します。 opencensus-ext-azure での依存関係を使用して RunConfiguration を構成します。 APPLICATIONINSIGHTS_CONNECTION_STRING
環境変数を構成します。
from azureml.core.conda_dependencies import CondaDependencies
from azureml.core.runconfig import RunConfiguration
from azureml.pipeline.core import Pipeline
from azureml.pipeline.steps import PythonScriptStep
# Connecting to the workspace and compute target not shown
# Add pip dependency on OpenCensus
dependencies = CondaDependencies()
dependencies.add_pip_package("opencensus-ext-azure>=1.0.1")
run_config = RunConfiguration(conda_dependencies=dependencies)
# Add environment variable with Application Insights Connection String
# Replace the value with your own connection string
run_config.environment.environment_variables = {
"APPLICATIONINSIGHTS_CONNECTION_STRING": 'InstrumentationKey=00000000-0000-0000-0000-000000000000'
}
# Configure step with runconfig
sample_step = PythonScriptStep(
script_name="sample_step.py",
compute_target=compute_target,
runconfig=run_config
)
# Submit new pipeline run
pipeline = Pipeline(workspace=ws, steps=[sample_step])
pipeline.submit(experiment_name="Logging_Experiment")
sample_step.py
という名前でファイルを作成します。 Application Insights にログをルーティングするために、AzureLogHandler クラスをインポートします。 また、Python ログ ライブラリもインポートする必要があります。
from opencensus.ext.azure.log_exporter import AzureLogHandler
import logging
次に、AzureLogHandler を Python ロガーに追加します。
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler())
# Assumes the environment variable APPLICATIONINSIGHTS_CONNECTION_STRING is already set
logger.addHandler(AzureLogHandler())
logger.warning("I will be sent to Application Insights")
カスタム ディメンションを使用したログ
既定では Application Insights に転送されるログには、実行または実験を追跡するのに十分なコンテキストがありません。 イシューの診断のためにログを利用できるようにするには、追加のフィールドが必要です。
これらのフィールドを追加するには、カスタム ディメンションを追加してログ メッセージにコンテキストを提供します。 1 つの例が、同じパイプライン実行の複数のステップにわたるログを表示したいユーザーがいる場合です。
カスタム ディメンションでは、キー値 (文字列、文字列として格納) のペアのディクショナリが作成されます。 その後、ディクショナリが Application Insights に送信され、クエリ結果に列として表示されます。 個々のディメンションは、クエリ パラメーターとして使用できます。
含めると役に立つコンテキスト
フィールド | 理由/例 |
---|---|
parent_run_id | 同じ parent_run_id を持つログのクエリを実行して、個々のステップを確認することなく、すべてのステップのログを経時的に確認できます |
step_id | 同じ step_id を持つログのクエリを実行して、狭い範囲のどこでイシューが発生したかを個々のステップまで確認できます |
step_name | ログのクエリを実行して、経時的なステップのパフォーマンスを確認できます。 また、ポータル UI を確認することなく最近の実行の step_id を見つけることもできます |
experiment_name | 複数のログのクエリを実行して、経時的な実験のパフォーマンスを確認できます。 また、ポータル UI を確認することなく最近の実行の parent_run_id または step_id を見つけることもできます |
run_url | 調査のために直接実行に戻るリンクを指定できます。 |
その他の便利なフィールド
これらのフィールドには追加のコード インストルメンテーションが必要な場合があり、実行コンテキストでは提供されません。
フィールド | 理由/例 |
---|---|
build_url/build_version | CI/CD を使用してデプロイする場合、このフィールドでは、ステップおよびパイプライン ロジックを提供したコード バージョンにログを関連付けることができます。 このリンクは、イシューを診断したり、特定の特性 (ログ/メトリック値) を持つモデルを識別したりするのに役立ちます |
run_type | 異なるモデルの種類、またはトレーニングとスコアリングの実行を区別できます |
カスタム ディメンション ディクショナリの作成
from azureml.core import Run
run = Run.get_context(allow_offline=False)
custom_dimensions = {
"parent_run_id": run.parent.id,
"step_id": run.id,
"step_name": run.name,
"experiment_name": run.experiment.name,
"run_url": run.parent.get_portal_url(),
"run_type": "training"
}
# Assumes AzureLogHandler was already registered above
logger.info("I will be sent to Application Insights with Custom Dimensions", extra= {"custom_dimensions":custom_dimensions})
OpenCensus の Python ログに関する考慮事項
OpenCensus の AzureLogHandler は、Python ログを Application Insights にルーティングするために使用されます。 結果として、Python ログの微妙な差異を考慮する必要があります。 作成されたロガーには既定のログ レベルが設定され、そのレベル以上のログが表示されます。 Python のログ機能を使用するための参考資料には、Logging Cookbook をお勧めします。
OpenCensus ライブラリには、APPLICATIONINSIGHTS_CONNECTION_STRING
環境変数が必要です。 プレーンテキストの接続文字列が渡されないように、環境変数をパイプライン パラメーターとして渡すのではなく、この環境変数を設定することをお勧めします。
Application Insights のログのクエリ
Application Insights にルーティングされたログは、'トレース' または '例外' の下に表示されます。 パイプラインの実行が含まれるように時間枠を調整してください。
Application Insights の結果には、ログ メッセージとレベル、ファイル パス、およびコード行番号が表示されます。 また、含まれているカスタム ディメンションもすべて表示されます。 この画像では、customDimensions ディクショナリが、前のコード サンプルのキーと値のペアを示しています。
その他の役に立つクエリ
以下のクエリの中には 'customDimensions.Level' が使用されているものがあります。 これらの重大度レベルは、Python ログが最初に送信されたレベルに対応します。 クエリの詳細については、「Azure Monitor ログ クエリ」を参照してください。
使用事例 | クエリ |
---|---|
特定のカスタム ディメンションのログ結果 (例 'parent_run_id') | traces | |
過去 7 日間のすべてのトレーニング実行のログ結果 | traces | |
過去 7 日間の severityLevel エラーが発生したログ結果 | traces | |
過去 7 日間の severityLevel エラーが発生したログ結果の数 | traces | |
次の手順
Application Insights インスタンスに作成されたログは、クエリ結果に基づいて Azure Monitor アラートの設定で使用できます。
また、クエリの結果を Azure ダッシュボードに追加して、詳細な分析情報を得ることもできます。