Azure Machine Learning CLI でコンポーネントを使用して機械学習パイプラインを作成して実行する

適用対象: Azure CLI ML 拡張機能 v2 (現行)

この記事では、Azure CLI とコンポーネントを使用して、機械学習パイプラインを作成して実行する方法について説明します。 コンポーネントを使用せずにパイプラインを作成することはできますが、コンポーネントによって最大限の柔軟性と再利用が提供されます。 Azure Machine Learning パイプラインは、YAML に定義して CLI から実行したり、Python で作成したり、ドラッグアンドドロップ UI を使って Azure Machine Learning スタジオ デザイナーで作成したりできます。 このドキュメントでは、CLI に焦点を当てています。

前提条件

先に読んでおくことが推奨される記事

コンポーネントを使用して最初のパイプラインを作成する

例を使用して、コンポーネントを使用して最初のパイプラインを作成してみましょう。 このセクションでは、具体的な例を使用して、Azure Machine Learning でパイプラインとコンポーネントが最初にどのように見えるかを示すことを目的とします。

azureml-examples リポジトリーcli/jobs/pipelines-with-components/basics ディレクトリーから、3b_pipeline_with_data サブディレクトリーに移動します。 このディレクトリには 3 種類のファイルがあります。 これらは、独自のパイプラインを構築するときに作成する必要があるファイルです。

  • pipeline.yml: この YAML ファイルは、機械学習パイプラインを定義します。 この YAML ファイルでは、1 つの機械学習タスク全体を複数のステップから成るワークフローに分割する方法を記述します。 たとえば、履歴データを使用して売上予測モデルをトレーニングする単純な機械学習タスクを考えたとき、データ処理、モデル トレーニング、モデル評価のステップを持つシーケンシャル ワークフローの構築が必要な場合もあります。 各ステップは 1 つのコンポーネントであり、適切に定義されたインターフェイスを持ち、個別に開発、テスト、最適化できます。 また、パイプライン YAML は、子ステップがパイプライン内の他のステップに接続する方法も定義します。たとえば、モデル トレーニング ステップによってモデル ファイルが生成され、そのモデル ファイルがモデル評価ステップに渡されます。

  • component.yml: この YAML ファイルはコンポーネントを定義します。 次の情報がパッケージされます:

    • メタデータ: "名前"、"表示名"、"バージョン"、"説明"、"種類" など。メタデータは、コンポーネントの記述と管理に役立ちます。
    • インターフェイス: "入力" と "出力"。 たとえば、モデル トレーニング コンポーネントは、入力としてトレーニング データとエポックの数を受け取り、出力としてトレーニング済みのモデル ファイルを生成します。 インターフェイスが定義されると、さまざまなチームがコンポーネントを個別に開発およびテストできます。
    • コマンド、コード、環境: コンポーネントを実行するための "コマンド"、"コード"、"環境"。 コマンドは、コンポーネントを実行するためのシェル コマンドです。 コードは通常、ソース コード ディレクトリを参照します。 環境は、Azure Machine Learning 環境 (キュレーションされた環境または顧客によって作成された環境)、Docker イメージ、または conda 環境にすることができます。
  • component_src: これは、特定のコンポーネントのソース コード ディレクトリです。 これには、コンポーネントで実行されるソース コードが含まれます。 任意の言語 (Python、R...) を使用できます。コードはシェル コマンドで実行する必要があります。 ソース コードでは、シェル コマンド ラインからいくつかの入力を受け取って、このステップの実行方法を制御できます。 たとえば、トレーニング ステップでは、トレーニング プロセスを制御するためにトレーニング データ、学習率、エポックの数を取得できます。 シェル コマンドの引数は、入力と出力をコードに渡すのに使用されます。

次に、3b_pipeline_with_data 例を使用してパイプラインを作成しましょう。 各ファイルの詳細な意味については、以降のセクションで説明します。

最初に、次のコマンドを使用して、使用可能なコンピューティング リソースを一覧表示します。

az ml compute list

ない場合は、次を実行して cpu-cluster という名前のクラスターを作成します。

Note

サーバーレス コンピューティングを使う場合は、このステップをスキップしてください。

az ml compute create -n cpu-cluster --type amlcompute --min-instances 0 --max-instances 10

次に、以下のコマンドを使用して、pipeline.yml ファイルで定義されたパイプライン ジョブを作成します。 コンピューティング先は、pipeline.yml ファイルで azureml:cpu-cluster として参照されます。 コンピューティング先で別の名前が使用される場合は、必ず pipeline.yml ファイルで更新してください。

az ml job create --file pipeline.yml

次のようなパイプライン ジョブに関する情報を含む JSON ディクショナリを受け取ります:

キー 説明
name ジョブの GUID ベースの名前。
experiment_name Studio でジョブが整理されるときに使用される名前。
services.Studio.endpoint パイプライン ジョブを監視および確認するための URL。
status ジョブの状態。 この時点では、これは Preparing になる可能性が高くなります。

services.Studio.endpoint URL を開いて、パイプラインのグラフの視覚化を表示します。

パイプラインのグラフ視覚化のスクリーンショット。

パイプライン定義 YAML について

3b_pipeline_with_data/pipeline.yml ファイルのパイプライン定義を見てみましょう。

Note

サーバーレス コンピューティングを使う場合は、このファイルで default_compute: azureml:cpu-clusterdefault_compute: azureml:serverless に置き換えてください。

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline

display_name: 3b_pipeline_with_data
description: Pipeline with 3 component jobs with data dependencies

settings:
  default_compute: azureml:cpu-cluster

outputs:
  final_pipeline_output:
    mode: rw_mount

jobs:
  component_a:
    type: command
    component: ./componentA.yml
    inputs:
      component_a_input: 
        type: uri_folder
        path: ./data

    outputs:
      component_a_output: 
        mode: rw_mount
  component_b:
    type: command
    component: ./componentB.yml
    inputs:
      component_b_input: ${{parent.jobs.component_a.outputs.component_a_output}}
    outputs:
      component_b_output: 
        mode: rw_mount
  component_c:
    type: command
    component: ./componentC.yml
    inputs:
      component_c_input: ${{parent.jobs.component_b.outputs.component_b_output}}
    outputs:
      component_c_output: ${{parent.outputs.final_pipeline_output}}
      #  mode: upload

この表では、パイプライン YAML スキーマの最も一般的に使用されるフィールドについて説明します。 詳細については、「完全なパイプライン YAML スキーマ」を参照してください。

キー description
type 必須。 ジョブの種類は、パイプライン ジョブの場合は pipeline である必要があります。
display_name Studio UI でのパイプライン ジョブの表示名。 Studio UI で編集できます。 ワークスペース内のすべてのジョブで一意である必要はありません。
jobs [必須] 。 パイプライン内のステップとして実行する個々のジョブのセットの辞書。 これらのジョブは、親パイプライン ジョブの子ジョブと見なされます。 このリリースでは、パイプラインでサポートされているジョブの種類は command および sweep です。
inputs パイプライン ジョブへの入力の辞書。 キーは、ジョブのコンテキスト内の入力の名前であり、値は入力値です。 これらのパイプライン入力は、${{ parent.inputs.<input_name> }} 式を使用して、パイプライン内の個々のステップ ジョブの入力によって参照できます。
outputs パイプライン ジョブの出力構成の辞書。 キーはジョブのコンテキスト内の出力の名前であり、値は出力構成です。 これらのパイプライン出力は、${{ parents.outputs.<output_name> }} 式を使用して、パイプライン内の個々のステップ ジョブの出力によって参照できます。

3b_pipeline_with_data の例では、3 つのステップから成るパイプラインを作成しました。

  • これらの 3 つのステップは jobs で定義されています。 3 つのステップの種類はすべてコマンド ジョブです。 各ステップの定義は、対応する component.yml ファイル内にあります。 コンポーネント YAML ファイルは、3b_pipeline_with_data ディレクトリで確認できます。 次のセクションで componentA.yml について説明します。
  • このパイプラインには、データ依存関係があります。これは、ほとんどの実際のパイプラインで一般的です。 Component_a は、ローカル フォルダーの ./data (17 行目から 20 行目) からデータ入力を受け取り、その出力を componentB (29 行目) に渡します。 Component_a の出力は ${{parent.jobs.component_a.outputs.component_a_output}} として参照できます。
  • compute は、このパイプラインの既定のコンピューティングを定義します。 jobs の下のコンポーネントで、このコンポーネントに別のコンピューティングが定義されている場合、システムではコンポーネント固有の設定が優先されます。

データ例を含むパイプラインのスクリーンショット。

パイプライン内のデータの読み取りと書き込み

一般的なシナリオの 1 つは、パイプライン内のデータの読み取りと書き込みです。 Azure Machine Learning では、すべての型のジョブ (パイプライン ジョブ、コマンド ジョブ、およびスイープ ジョブ) に対して同じスキーマを使用してデータの読み取りと書き込みを行います。 一般的なシナリオでデータを使用するパイプライン ジョブの例を次に示します。

コンポーネント定義 YAML について

次に、コンポーネント定義 YAML を理解するために例として componentA.yml を見てみましょう。

$schema: https://azuremlschemas.azureedge.net/latest/commandComponent.schema.json
type: command

name: component_a
display_name: componentA
version: 1

inputs:
  component_a_input:
    type: uri_folder

outputs:
  component_a_output:
    type: uri_folder

code: ./componentA_src

environment: 
  image: python

command: >-
  python hello.py --componentA_input ${{inputs.component_a_input}} --componentA_output ${{outputs.component_a_output}}

コンポーネント YAML で使用される最も一般的なスキーマについて表で説明します。 詳細については、「完全なコンポーネント YAML スキーマ」を参照してください。

キー description
name [必須] 。 コンポーネント名。 Azure Machine Learning ワークスペース全体で一意である必要があります。 先頭には小文字を使用する必要があります。 小文字、数字、アンダースコア (_) を使用できます。 最大文字数は 255 文字です。
display_name Studio UI でのコンポーネントの表示名。 ワークスペース内で一意ではない場合があります。
command 必須。実行するコマンド
code アップロードしてコンポーネントに使用するソース コード ディレクトリへのローカル パス。
環境 必須。 コンポーネントの実行に使用される環境。
inputs コンポーネント入力の辞書。 キーはコンポーネントのコンテキスト内の入力の名前であり、値はコンポーネントの入力定義です。 入力は、${{ inputs.<input_name> }} 式を使用してコマンドで参照できます。
outputs コンポーネント出力の辞書。 キーはコンポーネントのコンテキスト内の出力の名前であり、値はコンポーネントの出力定義です。 出力は、${{ outputs.<output_name> }} 式を使用してコマンドで参照できます。
is_deterministic コンポーネントの入力が変更されなかった場合に、前のジョブの結果を再利用するかどうか。 既定値は true です。既定では 再利用 とも呼ばれます。 false として設定する一般的なシナリオは、クラウド ストレージまたは URL からデータを強制的にリロードすることです。

3b_pipeline_with_data/componentA.yml の例では、componentA には 1 つのデータ入力と 1 つのデータ出力があり、親パイプラインの他のステップに接続できます。 コンポーネント YAML の code セクションにあるすべてのファイルは、パイプライン ジョブの送信時に Azure Machine Learning にアップロードされます。 この例では、./componentA_src の下にあるファイルがアップロードされます (componentA.yml の 16 行目)。 アップロードされたソース コードは、Studio UI で確認できます。次のスクリーンショットに示すように、ComponentA ステップをダブルクリックし、[スナップショット] タブに移動します。 単純な印刷を行うだけの hello-world スクリプトであることがわかり、現在の日時を componentA_output パスに書き込むことができます。 コンポーネントはコマンド ライン引数を使用して入力と出力を受け取り、argparse を使用して hello.py で処理されます。

コンポーネントA を示すデータ例を含むパイプラインのスクリーンショット。

入力と出力

入力と出力は、コンポーネントのインターフェイスを定義します。 入力と出力は、リテラル値 (型 stringnumberinteger、または boolean)、もしくは入力スキーマを含むオブジェクトのいずれかにすることができます。

オブジェクトの入力 (型 uri_fileuri_foldermltablemlflow_modelcustom_model) は、親パイプライン ジョブ内の他のステップに接続できるため、データ/モデルを他のステップに渡すことができます。 パイプラインのグラフでは、オブジェクトの種類の入力は接続ドットとしてレンダリングされます。

リテラル値の入力 (stringnumberintegerboolean) は、実行時にコンポーネントに渡すことができるパラメーターです。 default フィールドの下にリテラル入力の既定値を追加できます。 numberinteger 型の場合、minmax フィールドを使用して、許容される値の最小値と最大値を追加することもできます。 入力値が最小値と最大値を超えると、パイプラインは検証時に失敗します。 検証は、時間を節約するためにパイプライン ジョブの送信前に行われます。 検証は、CLI、Python SDK、デザイナー UI で機能します。 次のスクリーンショットは、デザイナー UI の検証例を示しています。 同様に、enum フィールドで使用できる値を定義できます。

トレーニング線形回帰モデル コンポーネントの入力と出力のスクリーンショット。

コンポーネントに入力を追加する場合は、必ず次の 3 つの場所を編集してください:

  • コンポーネント YAML の inputs フィールド
  • コンポーネント YAML の command フィールド。
  • コマンドライン入力を処理するコンポーネントのソース コード。 前のスクリーンショットでは、緑色のボックスにマークされています。

入力と出力の詳細については、「コンポーネントとパイプラインの入力と出力を管理する」を参照してください。

Environment

環境は、コンポーネントを実行する環境を定義します。 Azure Machine Learning 環境 (キュレーションされた環境またはカスタム登録された環境)、Docker イメージ、または conda 環境にすることができます。 次の例を参照してください。

再利用と共有のためにコンポーネントを登録する

特定のパイプラインに固有のコンポーネントもありますが、コンポーネントの本当の利点は再利用と共有ができることです。 コンポーネントを再利用できるようにするには、Machine Learning ワークスペースにそれを登録します。 登録されたコンポーネントは自動バージョン管理に対応しているので、コンポーネントを更新できますが、古いバージョンを必要とするパイプラインは引き続き動作します。

azureml-examples リポジトリで、cli/jobs/pipelines-with-components/basics/1b_e2e_registered_components ディレクトリに移動します。

コンポーネントを登録するには、az ml component create コマンドを使用します。

az ml component create --file train.yml
az ml component create --file score.yml
az ml component create --file eval.yml

これらのコマンドの実行が完了すると、コンポーネントが Studio の [Asset -> Components] (資産 -> コンポーネント) の下に表示されます。

登録されたコンポーネントを示す Studio のスクリーンショット。

コンポーネントを選択します。 コンポーネントのバージョンごとに詳細情報が表示されます。

[詳細] タブには、名前、作成者、バージョンなど、コンポーネントの基本情報が表示されます。編集可能な [タグ] および [説明] フィールドが表示されます。 タグは、迅速に検索されるキーワードを追加するために使用できます。 説明フィールドは Markdown の書式設定をサポートしており、コンポーネントの機能と基本的な使用方法を説明するために使用する必要があります。

[ジョブ] タブには、このコンポーネントを使用するすべてのジョブの履歴が表示されます。

パイプライン ジョブ YAML ファイルの登録済みコンポーネントを使用する

1b_e2e_registered_components を使用して、パイプライン YAML の登録済みコンポーネントを使用する方法を示します。 1b_e2e_registered_components ディレクトリに移動し、pipeline.yml ファイルを開きます。 inputs および outputs フィールドのキーと値は、既に説明したものに似ています。 唯一の重要な違いは、jobs.<JOB_NAME>.component エントリの component フィールドの値です。 component の値は、azureml:<COMPONENT_NAME>:<COMPONENT_VERSION> という形式になっています。 たとえば、train-job の定義は、登録されたコンポーネント my_train の最新バージョンを使用する必要があることを指定します。

type: command
component: azureml:my_train@latest
inputs:
  training_data: 
    type: uri_folder 
    path: ./data      
  max_epocs: ${{parent.inputs.pipeline_job_training_max_epocs}}
  learning_rate: ${{parent.inputs.pipeline_job_training_learning_rate}}
  learning_rate_schedule: ${{parent.inputs.pipeline_job_learning_rate_schedule}}
outputs:
  model_output: ${{parent.outputs.pipeline_job_trained_model}}
services:
  my_vscode:

コンポーネントを管理する

CLI (v2) を使用して、コンポーネントの詳細を確認し、コンポーネントを管理できます。 コンポーネント コマンドの詳細な説明を取得するには、az ml component -h を使用します。 次の表は、すべての使用可能なコマンドの一覧です。 「Azure CLI リファレンス」でその他の例を参照してください。

commands description
az ml component create コンポーネントを作成する
az ml component list ワークスペース内のコンポーネントを一覧表示する
az ml component show コンポーネントの詳細を表示する
az ml component update コンポーネントを更新します。 いくつかのフィールド (description、display_name) のみが更新をサポートします
az ml component archive コンポーネント コンテナーをアーカイブする
az ml component restore アーカイブされたコンポーネントを復元する

次の手順