コンポーネントとパイプラインの入力と出力を管理する
Azure Machine Learning のパイプラインでは、コンポーネントとパイプライン両方のレベルで入力と出力がサポートされます。 この記事では、パイプラインとコンポーネントの入力と出力、およびそれらを管理する方法について説明します。
コンポーネント レベルでは、入力と出力によってコンポーネントのインターフェイスが定義されます。 1 つのコンポーネントからの出力を、同じ親パイプライン内の別のコンポーネントの入力として使用でき、コンポーネント間でデータやモデルを受け渡すことができます。 この相互接続が、まさにパイプライン内のデータ フローを表しています。
パイプライン レベルでは、さまざまなデータ入力やパラメーター (learning_rate
など) を使ってパイプライン ジョブを送信するために、入力と出力を利用できます。 入力と出力は、REST エンドポイントを介してパイプラインを呼び出すときに特に便利です。 パイプライン入力に異なる値を割り当てたり、異なるパイプライン ジョブの出力にアクセスしたりできます。 詳細については、「バッチ エンドポイントのジョブと入力データを作成する」を参照してください。
入力と出力の種類
コンポーネントまたはパイプラインの入力と出力として、次の種類がサポートされています。
データ型 詳細については、データ型を参照してください。
uri_file
uri_folder
mltable
モデルの種類。
mlflow_model
custom_model
次のプリミティブ型は、入力に対してのみサポートされます。
- プリミティブ型
string
number
integer
boolean
プリミティブ型の出力はサポートされていません。
入力と出力の例
次の例は、GitHub リポジトリの「Azure Machine Learning examples」にある NYC Taxi Data Regression パイプラインのものです。
- train コンポーネントには、
test_split_ratio
という名前のnumber
入力があります。 - prep コンポーネントには、
uri_folder
タイプの出力があります。 コンポーネントのソース コードでは、入力フォルダーから CSV ファイルを読み取り、ファイルを処理し、処理された CSV ファイルを出力フォルダーに書き込みます。 - train コンポーネントには、
mlflow_model
タイプの出力があります。 コンポーネントのソース コードでは、mlflow.sklearn.save_model
メソッドを使用してトレーニング済みのモデルを保存します。
出力のシリアル化
データまたはモデル出力を使用して、出力をシリアル化し、保存場所にファイルとして保存します。 後続の手順では、このストレージの場所をマウントするか、コンピューティング ファイル システムにファイルをダウンロードまたはアップロードすることで、ジョブの実行中にファイルにアクセスできます。
コンポーネントのソース コードでは、通常メモリに格納されている出力オブジェクトをファイルにシリアル化する必要があります。 たとえば、pandas データフレームを CSV ファイルにシリアル化できます。 Azure Machine Learning では、オブジェクトのシリアル化のための標準化されたメソッドは定義されていません。 オブジェクトをファイルにシリアル化する方法を柔軟に選択できます。 ダウンストリームのコンポーネントでは、これらのファイルを逆シリアル化して読み取る方法を選択できます。
データ型の入力パスと出力パス
データ資産の入力と出力の場合、データの場所を指す path パラメーターを指定する必要があります。 次の表は、Azure Machine Learning パイプラインの入力と出力でサポートされているデータの場所と、path
パラメーターの例を示しています。
場所 | 入力 | 出力 | 例 |
---|---|---|---|
ローカル コンピューター上のパス | ✓ | ./home/<username>/data/my_data |
|
パブリック HTTP(S) サーバー上のパス | ✓ | https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv |
|
Azure Storage 上のパス | * | wasbs://<container_name>@<account_name>.blob.core.windows.net/<path> または abfss://<file_system>@<account_name>.dfs.core.windows.net/<path> |
|
Azure Machine Learning データストアのパス | ✓ | ✓ | azureml://datastores/<data_store_name>/paths/<path> |
データ資産へのパス | ✓ | ✓ | azureml:my_data:<version> |
* データを読み取るために追加の ID 構成が必要になる場合があるため、入力には Azure Storage を直接使用することはお勧めしません。 さまざまなパイプライン ジョブの種類でサポートされている Azure Machine Learning データストア パスを使用することをお勧めします。
データ型の入力パスと出力モード
データ型の入力と出力の場合、ダウンロード、アップロード、マウントの複数のモードから選択して、コンピューティング ターゲットがデータにアクセスする方法を定義できます。 次の表は、さまざまな種類の入力と出力でサポートされているモードを示しています。
Type | upload |
download |
ro_mount |
rw_mount |
direct |
eval_download |
eval_mount |
---|---|---|---|---|---|---|---|
uri_folder 入力 |
✓ | ✓ | ✓ | ||||
uri_file 入力 |
✓ | ✓ | ✓ | ||||
mltable 入力 |
✓ | ✓ | ✓ | ✓ | ✓ | ||
uri_folder 出力 |
✓ | ✓ | |||||
uri_file 出力 |
✓ | ✓ | |||||
mltable 出力 |
✓ | ✓ | ✓ |
ほとんどの場合、ro_mount
または rw_mount
モードをお勧めします。 詳細については、モードに関するページを参照してください。
パイプライン グラフの入力と出力
Azure Machine Learning スタジオのパイプライン ジョブ ページでは、コンポーネントの入力と出力は、入力/出力ポートと呼ばれる小さな円として表示されます。 これらのポートは、パイプラインのデータ フローを表します。 パイプライン レベルの出力は、簡単に識別できるように紫色のボックスに表示されます。
NYC Taxi Data Regression パイプライン グラフの次のスクリーンショットは、複数のコンポーネントとパイプラインの入出力を示しています。
入出力ポートにマウスを合わせると、種類が表示されます。
パイプライン グラフには、プリミティブ型の入力は表示されません。 これらの入力は、パイプラインの [ジョブの概要] パネル (パイプライン レベルの入力の場合) またはコンポーネント パネル (コンポーネント レベルの入力の場合) の [設定] タブにあります。 コンポーネント パネルを開くには、グラフ内のコンポーネントをダブルクリックします。
スタジオの Designer でパイプラインを編集すると、パイプラインの入力と出力が [パイプライン インターフェイス] パネルに表示され、コンポーネントの入力と出力がコンポーネント パネルに表示されます。
コンポーネントの入出力をパイプライン レベルに上げる
コンポーネントの入出力をパイプライン レベルに上げると、パイプライン ジョブを送信するときに、コンポーネントの入出力を上書きできます。 この機能は、REST エンドポイントを使用してパイプラインをトリガーする場合に特に便利です。
次の例で、コンポーネント レベルの入出力をパイプライン レベルの入出力に上げる方法を示します。
次のパイプラインでは、3 つの入力と 3 つの出力がパイプライン レベルに上げられます。 たとえば、pipeline_job_training_max_epocs
はルート レベルの inputs
セクションで宣言されているため、パイプライン レベルの入力になります。
jobs
セクションの train_job
では、max_epocs
という名前の入力が ${{parent.inputs.pipeline_job_training_max_epocs}}
として参照されています。これは、train_job
の入力 max_epocs
がパイプライン レベルの入力 pipeline_job_training_max_epocs
を参照していることを示します。 パイプライン出力は、同じスキーマを使用してレベルを上げます。
$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
display_name: 1b_e2e_registered_components
description: E2E dummy train-score-eval pipeline with registered components
inputs:
pipeline_job_training_max_epocs: 20
pipeline_job_training_learning_rate: 1.8
pipeline_job_learning_rate_schedule: 'time-based'
outputs:
pipeline_job_trained_model:
mode: upload
pipeline_job_scored_data:
mode: upload
pipeline_job_evaluation_report:
mode: upload
settings:
default_compute: azureml:cpu-cluster
jobs:
train_job:
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:
type: vs_code
my_jupyter_lab:
type: jupyter_lab
my_tensorboard:
type: tensor_board
log_dir: "outputs/tblogs"
# my_ssh:
# type: tensor_board
# ssh_public_keys: <paste the entire pub key content>
# nodes: all # Use the `nodes` property to pick which node you want to enable interactive services on. If `nodes` are not selected, by default, interactive applications are only enabled on the head node.
score_job:
type: command
component: azureml:my_score@latest
inputs:
model_input: ${{parent.jobs.train_job.outputs.model_output}}
test_data:
type: uri_folder
path: ./data
outputs:
score_output: ${{parent.outputs.pipeline_job_scored_data}}
evaluate_job:
type: command
component: azureml:my_eval@latest
inputs:
scoring_result: ${{parent.jobs.score_job.outputs.score_output}}
outputs:
eval_output: ${{parent.outputs.pipeline_job_evaluation_report}}
完全な例については、Azure Machine Learning examples リポジトリにある train-score-eval パイプライン (登録済みコンポーネントを含む) を参照してください。
省略可能な入力を定義する
既定では、すべての入力は必須であり、パイプライン ジョブを送信するたびに、既定値にするか、値を割り当てる必要があります。 ただし、省略可能な入力を定義できます。
Note
省略可能な出力はサポートされていません。
省略可能な入力は、次の 2 つのシナリオで役立ちます:
省略可能なデータ/モデル型入力を定義し、パイプライン ジョブの送信時に値を割り当てない場合は、パイプライン コンポーネントにはそのデータ依存関係がありません。 コンポーネントの入力ポートがコンポーネントまたはデータ/モデル ノードにリンクされていない場合、パイプラインは、先行する依存関係を待機するのではなく、コンポーネントを直接呼び出します。
パイプラインの
continue_on_step_failure = True
を設定したものの、node2
がnode1
からの必須入力を使用する場合、node1
が失敗したときに、node2
は実行されません。node1
入力が省略可能な場合は、node1
が失敗したときでも、node2
が実行されます。 次のグラフにこのシナリオを示します。
次のコード例は、省略可能な入力を定義する方法を示しています。 入力が optional = true
として設定されている場合は、$[[]]
を使用して、例の強調表示された行のようにコマンド ライン入力を受け入れる必要があります。
$schema: https://azuremlschemas.azureedge.net/latest/commandComponent.schema.json
name: train_data_component_cli
display_name: train_data
description: A example train component
tags:
author: azureml-sdk-team
type: command
inputs:
training_data:
type: uri_folder
max_epocs:
type: integer
optional: true
learning_rate:
type: number
default: 0.01
optional: true
learning_rate_schedule:
type: string
default: time-based
optional: true
outputs:
model_output:
type: uri_folder
code: ./train_src
environment: azureml://registries/azureml/environments/sklearn-1.5/labels/latest
command: >-
python train.py
--training_data ${{inputs.training_data}}
$[[--max_epocs ${{inputs.max_epocs}}]]
$[[--learning_rate ${{inputs.learning_rate}}]]
$[[--learning_rate_schedule ${{inputs.learning_rate_schedule}}]]
--model_output ${{outputs.model_output}}
出力パスをカスタマイズする
既定では、コンポーネントの出力は、パイプライン (azureml://datastores/${{default_datastore}}/paths/${{name}}/${{output_name}}
) に対して設定した {default_datastore}
に格納されます。 設定しなかった場合、既定値はワークスペースの BLOB ストレージです。
ジョブ {name}
はジョブの実行時に解決され、{output_name}
はコンポーネント YAML で定義した名前です。 ただし、出力のパスを定義することで、出力を格納する場所をカスタマイズできます。
登録されたコンポーネントの例を含む train-score-eval パイプラインの pipeline.yml ファイルは、3 つのパイプライン レベルの出力を持つパイプラインを定義します。 次のコマンドを使って、pipeline_job_trained_model
出力のカスタム出力パスを設定できます。
# define the custom output path using datastore uri
# add relative path to your blob container after "azureml://datastores/<datastore_name>/paths"
output_path="azureml://datastores/{datastore_name}/paths/{relative_path_of_container}"
# create job and define path using --outputs.<outputname>
az ml job create -f ./pipeline.yml --set outputs.pipeline_job_trained_model.path=$output_path
出力をダウンロードする
出力は、パイプラインまたはコンポーネント レベルでダウンロードできます。
パイプライン レベルの出力をダウンロードする
ジョブのすべての出力をダウンロードすることも、特定の出力をダウンロードすることもできます。
# Download all the outputs of the job
az ml job download --all -n <JOB_NAME> -g <RESOURCE_GROUP_NAME> -w <WORKSPACE_NAME> --subscription <SUBSCRIPTION_ID>
# Download a specific output
az ml job download --output-name <OUTPUT_PORT_NAME> -n <JOB_NAME> -g <RESOURCE_GROUP_NAME> -w <WORKSPACE_NAME> --subscription <SUBSCRIPTION_ID>
コンポーネントの出力をダウンロードする
子コンポーネントの出力をダウンロードするには、まずパイプライン ジョブのすべての子ジョブを一覧表示してから、同様のコードを使用して出力をダウンロードします。
# List all child jobs in the job and print job details in table format
az ml job list --parent-job-name <JOB_NAME> -g <RESOURCE_GROUP_NAME> -w <WORKSPACE_NAME> --subscription <SUBSCRIPTION_ID> -o table
# Select the desired child job name to download output
az ml job download --all -n <JOB_NAME> -g <RESOURCE_GROUP_NAME> -w <WORKSPACE_NAME> --subscription <SUBSCRIPTION_ID>
出力を名前付き資産として登録する
name
と version
を出力に割り当てることで、コンポーネントまたはパイプラインの出力を名前付き資産として登録できます。 登録された資産は、スタジオ UI、CLI、または SDK を使ってワークスペースで一覧表示でき、将来のワークスペースで参照することもできます。
パイプライン レベルの出力を登録する
display_name: register_pipeline_output
type: pipeline
jobs:
node:
type: command
inputs:
component_in_path:
type: uri_file
path: https://dprepdata.blob.core.windows.net/demo/Titanic.csv
component: ../components/helloworld_component.yml
outputs:
component_out_path: ${{parent.outputs.component_out_path}}
outputs:
component_out_path:
type: mltable
name: pipeline_output # Define name and version to register pipeline output
version: '1'
settings:
default_compute: azureml:cpu-cluster
コンポーネント出力を登録する
display_name: register_node_output
type: pipeline
jobs:
node:
type: command
component: ../components/helloworld_component.yml
inputs:
component_in_path:
type: uri_file
path: 'https://dprepdata.blob.core.windows.net/demo/Titanic.csv'
outputs:
component_out_path:
type: uri_folder
name: 'node_output' # Define name and version to register a child job's output
version: '1'
settings:
default_compute: azureml:cpu-cluster