구성 요소 및 파이프라인의 입력 및 출력 관리

이 문서에서는 다음에 대해 알아봅니다.

  • 구성 요소 및 파이프라인의 입력 및 출력 개요
  • 구성 요소 입력/출력을 파이프라인 입력/출력으로 승격하는 방법
  • 선택적 입력을 정의하는 방법
  • 출력 경로를 사용자 지정하는 방법
  • 출력을 다운로드하는 방법
  • 출력을 명명된 자산으로 등록하는 방법

입력 및 출력 개요

Azure Machine Learning 파이프라인은 구성 요소 및 파이프라인 수준 모두에서 입력 및 출력을 지원합니다.

구성 요소 수준에서 입력 및 출력은 구성 요소의 인터페이스를 정의합니다. 한 구성 요소의 출력을 동일한 부모 파이프라인의 다른 구성 요소에 대한 입력으로 사용하여 데이터 또는 모델을 구성 요소 간에 전달할 수 있습니다. 이 상호 연결은 파이프라인 내의 데이터 흐름을 보여 주는 그래프를 형성합니다.

파이프라인 수준에서 입력 및 출력은 학습 논리를 제어하는 다양한 데이터 입력 또는 매개 변수를 사용하여 파이프라인 작업을 제출하는 데 유용합니다(예: learning_rate). REST 엔드포인트를 통해 파이프라인을 호출할 때 특히 유용합니다. 이러한 입력 및 출력을 사용하면 파이프라인 입력에 다른 값을 할당하거나 REST 엔드포인트를 통해 파이프라인 작업의 출력에 액세스할 수 있습니다. 자세한 내용은 일괄 처리 엔드포인트에 대한 작업 및 입력 데이터 만들기를 참조하세요.

입력 및 출력 유형

다음 형식은 구성 요소 또는 파이프라인의 출력으로 지원됩니다.

기본적으로 출력을 직렬화하는 데이터 또는 모델 출력을 사용하고 스토리지 위치에 파일로 저장합니다. 이후 단계에서는 이 스토리지 위치를 컴퓨팅 대상 파일 시스템에 탑재, 다운로드 또는 업로드할 수 있으며, 다음 단계를 진행하여 작업 실행 중에 파일에 액세스합니다.

이 프로세스를 수행하려면 구성 요소의 소스 코드가 원하는 출력 개체(일반적으로 메모리에 저장됨)를 파일로 직렬화해야 합니다. 예를 들어 pandas 데이터 프레임을 CSV 파일로 직렬화할 수 있습니다. Azure Machine Learning은 개체 serialization에 대한 표준화된 방법을 정의하지 않습니다. 사용자는 개체를 파일로 직렬화하는 선호하는 방법을 유연하게 선택할 수 있습니다. 그런 다음, 다운스트림 구성 요소에서 이러한 파일을 독립적으로 역직렬화하고 읽을 수 있습니다. 참조에 대한 몇 가지 예제는 다음과 같습니다.

  • nyc_taxi_data_regression 예제에서 준비 구성 요소에는 uri_folder 형식 출력이 있습니다. 구성 요소 소스 코드에서는 입력 폴더에서 csv 파일을 읽고, 파일을 처리하고, 처리된 CSV 파일을 출력 폴더에 씁니다.
  • nyc_taxi_data_regression 예제에서 학습 구성 요소에는 mlflow_model 형식 출력이 있습니다. 구성 요소 소스 코드에서는 mlflow.sklearn.save_model 메서드를 사용하여 학습된 모델을 저장합니다.

위의 데이터 또는 모델 형식 외에도 파이프라인 또는 구성 요소 입력은 다음 기본 형식일 수도 있습니다.

  • string
  • number
  • integer
  • boolean

nyc_taxi_data_regression 예제에서 학습 구성 요소에는 test_split_ratio라는 number 입력이 있습니다.

참고 항목

기본 형식 출력은 지원되지 않습니다.

데이터 입력/출력의 경로 및 모드

데이터 자산 입력/출력의 경우 데이터 위치를 가리키는 path 매개 변수를 지정해야 합니다. 이 표에서는 Azure Machine Learning 파이프라인이 지원하는 다양한 데이터 위치를 보여 주고, 경로 매개 변수 예제도 보여 줍니다.

위치 예제 입력 출력
로컬 컴퓨터의 경로 ./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>
데이터를 읽기 위해 추가 ID 구성이 필요할 수 있으므로 제안되지 않습니다.
Azure Machine Learning 데이터 저장소 경로 azureml://datastores/<data_store_name>/paths/<path>
데이터 자산 경로 azureml:<my_data>:<version>

참고 항목

스토리지의 입력/출력의 경우 직접 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 스튜디오의 시각적 표현

다음 스크린샷은 Azure Machine Learning 스튜디오의 파이프라인 작업에 입력 및 출력이 표시되는 방법의 예를 제공합니다. nyc-taxi-data-regression라는 이 특정 작업은 azureml-example에서 찾을 수 있습니다.

스튜디오의 파이프라인 작업 페이지에서 구성 요소의 데이터/모델 형식 입력/출력은 입력/출력 포트라고 하는 해당 구성 요소에 작은 원으로 표시됩니다. 이러한 포트는 파이프라인의 데이터 흐름을 나타냅니다.

파이프라인 수준 출력은 쉽게 식별할 수 있는 자주색 상자로 표시됩니다.

Screenshot highlighting the pipeline input and output port.

입력/출력 포트를 마우스를 가리키면 해당 형식이 표시됩니다.

Screenshot highlighting the port type when hovering the mouse.

기본 형식 입력은 그래프에 표시되지 않습니다. 파이프라인 작업 개요 패널(파이프라인 수준 입력의 경우) 또는 구성 요소 패널(구성 요소 수준 입력의 경우)의 설정 탭에서 찾을 수 있습니다. 다음 스크린샷은 파이프라인 작업의 설정 탭을 보여 줍니다. 이 탭은 작업 개요 링크를 선택하여 열 수 있습니다.

구성 요소에 대한 입력을 확인하려면 구성 요소를 두 번 클릭하여 구성 요소 패널을 엽니다.

Screenshot highlighting the job overview setting panel.

마찬가지로 디자이너에서 파이프라인을 편집할 때 파이프라인 인터페이스 패널에서 파이프라인 입력 및 출력을 찾을 수 있으며 구성 요소 패널에서 구성 요소 입력 및 출력을 찾을 수 있습니다(구성 요소를 두 번 클릭하여 트리거).

Screenshot highlighting the pipeline interface in designer.

구성 요소 입력 및 출력을 파이프라인 수준으로 승격하는 방법

구성 요소의 입력/출력을 파이프라인 수준으로 승격하면 파이프라인 작업을 제출할 때 구성 요소의 입력/출력을 덮어쓸 수 있습니다. REST 엔드포인트를 사용하여 파이프라인을 트리거하려는 경우에도 유용합니다.

다음은 구성 요소 입력/출력을 파이프라인 수준 입력/출력으로 승격하는 예제입니다.

$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}}

전체 예제는 등록된 구성 요소가 있는 train-score-eval 파이프라인에서 찾을 수 있습니다. 이 파이프라인은 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를 참조함을 나타냅니다. 마찬가지로 동일한 스키마를 사용하여 파이프라인 출력을 승격할 수 있습니다.

Studio

디자이너 작성 페이지에서 구성 요소의 입력을 파이프라인 수준 입력으로 승격할 수 있습니다. 구성 요소를 두 번 클릭하여 구성 요소의 설정 패널로 이동하고 > 승격할 입력을 찾고 > 오른쪽에 있는 3개 점을 선택하고 > 파이프라인 입력에 추가를 선택합니다.

Screenshot highlighting how to promote to pipeline input in designer.

선택적 입력

기본적으로 모든 입력은 필수이며 파이프라인 작업을 제출할 때마다 값(또는 기본값)을 할당해야 합니다. 그러나 선택적 입력이 필요한 인스턴스가 있을 수 있습니다. 이러한 경우 파이프라인 작업을 제출할 때 입력에 값을 할당하지 않아도 됩니다.

선택적 입력은 다음 두 가지 시나리오에서 유용할 수 있습니다.

  • 선택적 데이터/모델 형식 입력이 있고 파이프라인 작업을 제출할 때 값을 할당하지 않으면 파이프라인에 이전 데이터 종속성이 없는 구성 요소가 발생합니다. 즉, 입력 포트는 구성 요소 또는 데이터/모델 노드에 연결되지 않습니다. 이로 인해 파이프라인 서비스는 이전 종속성이 준비될 때까지 기다리지 않고 이 구성 요소를 직접 호출합니다.

  • 아래 스크린샷은 두 번째 시나리오에 대한 명확한 예제를 제공합니다. 파이프라인에 대해 continue_on_step_failure = True를 설정하고 첫 번째 노드(node1)의 출력을 선택적 입력으로 사용하는 두 번째 노드(node2)가 있는 경우 node1이 실패하더라도 node2는 계속 실행됩니다. 그러나 node2에서 node1의 필수 입력을 사용하는 경우 node1이 실패하면 node2가 실행되지 않습니다.

    Screenshot to show the orchestration logic of optional input and continue on failure.

다음은 선택적 입력을 정의하는 방법에 대한 예제입니다.

$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
version: 9
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.0/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}}

입력이 optional = true로 설정된 경우 $[[]]를 사용하여 입력이 있는 명령줄을 수용해야 합니다. 위의 예제에서 강조 표시된 줄을 참조하세요.

참고 항목

선택적 출력은 지원되지 않습니다.

파이프라인 그래프에서 데이터/모델 형식의 선택적 입력은 점선 원으로 표시됩니다. 기본 형식의 선택적 입력은 설정 탭 아래에 있을 수 있습니다. 필수 입력과 달리 선택적 입력에는 옆에 별표가 없으므로 필수가 아님을 나타냅니다.

Screenshot highlighting the optional input.

출력 경로를 사용자 지정하는 방법

기본적으로 구성 요소의 출력은 azureml://datastores/${{default_datastore}}/paths/${{name}}/${{output_name}}에 저장됩니다. {default_datastore}는 파이프라인에 대해 설정된 기본 데이터 저장소 고객입니다. 설정하지 않으면 작업 영역 Blob Storage입니다. {name}은 작업 실행 시 확인되는 작업 이름입니다. {output_name}은 구성 요소 YAML에 정의된 출력 이름 고객입니다.

그러나 출력의 경로를 정의하여 출력을 저장할 위치를 사용자 지정할 수도 있습니다. 다음은 예제입니다.

pipeline.yaml은 세 개의 파이프라인 수준 출력이 있는 파이프라인을 정의합니다. 전체 YAML은 등록된 구성 요소가 있는 train-score-eval 파이프라인 예제에서 찾을 수 있습니다. 다음 명령을 사용하여 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 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 needed 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

다음 단계