実行履歴の開始、監視および追跡

適用対象: Python SDK azureml v1

適用対象: Azure CLI ml 拡張機能 v1

Azure Machine Learning SDK for Python v1Machine Learning CLI には、自分のトレーニングおよび実験の実行を監視、整理、追跡するためのさまざまな方法があります。 ML の実行履歴は、説明可能かつ反復可能な ML 開発プロセスの重要な部分です。

ヒント

スタジオの使用方法については、「スタジオでの実行の追跡、監視、分析」を参照してください。

Azure Machine Learning SDK v2 を使用している場合は、次の記事を参照してください。

この記事では、次のタスクの手順について説明します。

  • 実行のパフォーマンスの監視。
  • 実行のタグ付けおよび検索。
  • 実行履歴に対する検索の実行。
  • 実行のキャンセルまたは失敗。
  • 子実行の作成。
  • 電子メール通知による実行状態の監視。

ヒント

Azure Machine Learning service および関連する Azure サービスの監視の詳細については、Azure Machine Learning を監視する方法に関する記事を参照してください。 Web サービスとしてデプロイされたモデルの監視の詳細については、モデル データの収集および Application Insights での監視に関する記事を参照してください。

前提条件

次のものが必要です。

  • Azure サブスクリプション。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。 無料版または有料版の Azure Machine Learning を今すぐお試しください。

  • Azure Machine Learning ワークスペース

  • Azure Machine Learning SDK for Python (バージョン 1.0.21 以降)。 SDK の最新バージョンのインストールまたは最新バージョンへの更新を行うには、SDK のインストールまたは更新に関する記事を参照してください。

    お使いの Azure Machine Learning SDK のバージョンを確認するには、次のコードを使用します。

    print(azureml.core.VERSION)
    
  • Azure CLIAzure Machine Learning 用 CLI 拡張機能

    重要

    この記事の Azure CLI コマンドの一部では、Azure Machine Learning 用に azure-cli-ml、つまり v1 の拡張機能を使用しています。 v1 拡張機能のサポートは、2025 年 9 月 30 日に終了します。 その日付まで、v1 拡張機能をインストールして使用できます。

    2025 年 9 月 30 日より前に、ml (v2) 拡張機能に移行することをお勧めします。 v2 拡張機能の詳細については、Azure ML CLI 拡張機能と Python SDK v2 に関するページを参照してください。

実行のパフォーマンスの監視

  • 実行とそのロギング プロセスを開始する

    適用対象: Python SDK azureml v1

    1. お使いの実験を設定するには、azureml.core パッケージから WorkspaceExperimentRun および ScriptRunConfig クラスをインストールします。

      import azureml.core
      from azureml.core import Workspace, Experiment, Run
      from azureml.core import ScriptRunConfig
      
      ws = Workspace.from_config()
      exp = Experiment(workspace=ws, name="explore-runs")
      
    2. start_logging() メソッドを使用して、そのログ プロセスを開始および実行します。

      notebook_run = exp.start_logging()
      notebook_run.log(name="message", value="Hello from run!")
      
  • 実行の状態を監視する

    適用対象: Python SDK azureml v1

    • get_status() メソッドを使用して実行の状態を取得します。

      print(notebook_run.get_status())
      
    • 実行 ID、実行時間、および実行に関するその他の詳細を取得するには、get_details() メソッドを使用します。

      print(notebook_run.get_details())
      
    • 自分の実行が正常に終了したら、complete() メソッドを使用し、それを完了とマークします。

      notebook_run.complete()
      print(notebook_run.get_status())
      
    • Python の with...as 設計パターンを使用している場合、実行が範囲外になると、実行によって自動的に実行が完了とマークされます。 ユーザーが手動で実行を完了とマークする必要はありません。

      with exp.start_logging() as notebook_run:
          notebook_run.log(name="message", value="Hello from run!")
          print(notebook_run.get_status())
      
      print(notebook_run.get_status())
      

実行のタグ付けおよび検索

Azure Machine Learning では、実行の整理にプロパティとタグを使用したり、自分の実行に対し重要な情報をクエリしたりできます。

  • プロパティとタグの追加

    適用対象: Python SDK azureml v1

    検索可能なメタデータを自分の実行に追加するには、add_properties() メソッドを使用します。 たとえば、次のコードでは実行に "author" プロパティが追加されます。

    local_run.add_properties({"author":"azureml-user"})
    print(local_run.get_properties())
    

    プロパティは変更不可であるため、プロパティによって監査目的の恒久的な記録が作成されます。 次のコード例は、前のコードで "author" プロパティ値として "azureml-user" が既に追加されているためエラーとなります。

    try:
        local_run.add_properties({"author":"different-user"})
    except Exception as e:
        print(e)
    

    プロパティとは異なり、タグは変更可能です。 自分の実験のコンシューマーに検索可能で意味のある情報を追加するには、tag() メソッドを使用します。

    local_run.tag("quality", "great run")
    print(local_run.get_tags())
    
    local_run.tag("quality", "fantastic run")
    print(local_run.get_tags())
    

    単純な文字列のタグを追加することもできます。 これらのタグがタグ辞書にキーとして表示されると、値は None になります。

    local_run.tag("worth another look")
    print(local_run.get_tags())
    
  • クエリ プロパティおよびタグ

    特定のプロパティとタグに一致する実行の一覧が返されるように、実験内の実行をクエリできます。

    適用対象: Python SDK azureml v1

    list(exp.get_runs(properties={"author":"azureml-user"},tags={"quality":"fantastic run"}))
    list(exp.get_runs(properties={"author":"azureml-user"},tags="worth another look"))
    

実行のキャンセルまたは失敗

間違いに気付いた場合、または実行の完了に時間がかかりすぎる場合は、実行をキャンセルできます。

適用対象: Python SDK azureml v1

SDK を使用して実行をキャンセルするには、cancel() メソッドを使用します。

src = ScriptRunConfig(source_directory='.', script='hello_with_delay.py')
local_run = exp.submit(src)
print(local_run.get_status())

local_run.cancel()
print(local_run.get_status())

実行が終了したが、実行にエラー (正しくないトレーニング スクリプトが使用されたなど) が含まれている場合、fail() メソッドを使用して、それを失敗とマークできます。

local_run = exp.submit(src)
local_run.fail()
print(local_run.get_status())

子実行の作成

適用対象: Python SDK azureml v1

異なるハイパーパラメーターの調整を繰り返すなど、関連する実行をグループ化する場合に、子実行を作成できます。

Note

子実行は、SDK を使用してのみ作成できます。

このコード例では、hello_with_children.py スクリプトで child_run() メソッドを使用して、渡された実行から 5 つの子実行のバッチを作成します。

!more hello_with_children.py
src = ScriptRunConfig(source_directory='.', script='hello_with_children.py')

local_run = exp.submit(src)
local_run.wait_for_completion(show_output=True)
print(local_run.get_status())

with exp.start_logging() as parent_run:
    for c,count in enumerate(range(5)):
        with parent_run.child_run() as child:
            child.log(name="Hello from child run", value=c)

Note

子実行は、範囲外になると、自動的に完了とマークされます。

多数の子実行を効率よく作成するには、create_children() メソッドを使用します。 実行を作成するたびにネットワーク呼び出しが行われるため、実行のバッチを作成した方が、1 つずつ作成するよりも効率的です。

子実行を送信する

親実行から子実行を送信することもできます。 そうすることで、親実行と子実行の階層を作成できます。 親のない子実行を作成することはできません。親実行で子実行が起動されただけであっても、階層を作成する必要があります。 すべての実行の状態は独立しています。1 つ以上の子実行が取り消されたか失敗した場合でも、親は正常に "Completed" の状態になります。

子実行で、親実行と異なる実行構成を使用することを望む場合があります。 たとえば、子に GPU ベースの構成を使用しながら、親に対して非力な CPU ベースの構成を使用できます。 他の一般的な目的は、各子に異なる引数とデータを渡すことです。 子実行をカスタマイズするには、子実行の ScriptRunConfig オブジェクトを作成します。

重要

リモート コンピューティングで、親の実行から子の実行を送信するには、最初に親実行コードのワークスペースにサインインする必要があります。 既定では、リモート実行の実行コンテキスト オブジェクトには、子実行を送信するための資格情報がありません。 サービス プリンシパルまたはマネージド ID の資格情報を使用してサインインします。 認証の詳細については、認証の設定に関するページを参照してください。

下のコードでは、以下が実行されます。

  • "gpu-cluster" という名前のコンピューティング リソースを、ワークスペース ws から取得します
  • ScriptRunConfig オブジェクトに渡される異なる引数値を繰り返します
  • カスタム コンピューティング リソースと引数を使用して、新しい子実行を作成して送信します
  • すべての子実行が完了するまでブロックします
# parent.py
# This script controls the launching of child scripts
from azureml.core import Run, ScriptRunConfig

compute_target = ws.compute_targets["gpu-cluster"]

run = Run.get_context()

child_args = ['Apple', 'Banana', 'Orange']
for arg in child_args: 
    run.log('Status', f'Launching {arg}')
    child_config = ScriptRunConfig(source_directory=".", script='child.py', arguments=['--fruit', arg], compute_target=compute_target)
    # Starts the run asynchronously
    run.submit_child(child_config)

# Experiment will "complete" successfully at this point. 
# Instead of returning immediately, block until child runs complete

for child in run.get_children():
    child.wait_for_completion()

同じ構成、引数、および入力を使用して多数の子実行を効率的に作成するには、create_children() メソッドを使用します。 実行を作成するたびにネットワーク呼び出しが行われるため、実行のバッチを作成した方が、1 つずつ作成するよりも効率的です。

次のようにすれば、子実行内から親実行 ID を確認できます。

## In child run script
child_run = Run.get_context()
child_run.parent.id

子実行を照会する

特定の親の子実行をクエリするには、get_children() メソッドを使用します。 recursive = True 引数を指定すると、入れ子になった子と孫のツリーを照会できます。

print(parent_run.get_children())

親またはルートの実行にログを記録する

Run.parent フィールドを使用すると、現在の子実行を開始した実行にアクセスできます。 Run.parent を使用する一般的なユースケースは、ログ結果を 1 か所に統合する場合です。 子実行は非同期に実行され、子実行が完了するまで待機する親の機能を超えた順序付けや同期の保証はありません。

# in child (or even grandchild) run

def root_run(self : Run) -> Run :
    if self.parent is None : 
        return self
    return root_run(self.parent)

current_child_run = Run.get_context()
root_run(current_child_run).log("MyMetric", f"Data from child run {current_child_run.id}")

電子メール通知による実行状態の監視

  1. Azure portalの左側のナビゲーション バーで、 [監視] タブを選択します。

  2. [診断設定] を選択し、 [+ 診断設定の追加] を選択します。

    電子メール通知の診断設定のスクリーンショット。

  3. [診断設定] の

    1. [カテゴリの詳細] で、 [AmlRunStatusChangedEvent] を選択します。
    2. [宛先の詳細] で、[Log Analytics ワークスペースに送信する] を選び、[サブスクリプション][Log Analytics ワークスペース] を指定します。

    Note

    Azure Log Analytics ワークスペースは、Azure Machine Learning service ワークスペースとは異なる種類の Azure Resource です。 そのリストにオプションがない場合は、Log Analytics ワークスペースを作成することができます。

    電子メール通知の構成のスクリーンショット。

  4. [ログ] タブで、新しい警告ルールを追加します。

    新しい警告ルールのスクリーンショット。

  5. Azure Monitor を使用してログ アラートを作成および管理する方法に関するページを参照してください。

サンプルの Notebook

次のノートブックは、この記事の概念を示しています。

次のステップ