次の方法で共有


コンポーネントとパイプラインの入力と出力を管理する

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 でパイプラインを編集すると、パイプラインの入力と出力が [パイプライン インターフェイス] パネルに表示され、コンポーネントの入力と出力がコンポーネント パネルに表示されます。

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 を設定したものの、node2node1 からの必須入力を使用する場合、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>

出力を名前付き資産として登録する

nameversion を出力に割り当てることで、コンポーネントまたはパイプラインの出力を名前付き資産として登録できます。 登録された資産は、スタジオ 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