구성 요소 및 파이프라인의 입력 및 출력 관리
이 문서에서는 다음에 대해 알아봅니다.
- 구성 요소 및 파이프라인의 입력 및 출력 개요
- 구성 요소 입력/출력을 파이프라인 입력/출력으로 승격하는 방법
- 선택적 입력을 정의하는 방법
- 출력 경로를 사용자 지정하는 방법
- 출력을 다운로드하는 방법
- 출력을 명명된 자산으로 등록하는 방법
입력 및 출력 개요
Azure Machine Learning 파이프라인은 구성 요소 및 파이프라인 수준 모두에서 입력 및 출력을 지원합니다.
구성 요소 수준에서 입력 및 출력은 구성 요소의 인터페이스를 정의합니다. 한 구성 요소의 출력을 동일한 부모 파이프라인의 다른 구성 요소에 대한 입력으로 사용하여 데이터 또는 모델을 구성 요소 간에 전달할 수 있습니다. 이 상호 연결은 파이프라인 내의 데이터 흐름을 보여 주는 그래프를 형성합니다.
파이프라인 수준에서 입력 및 출력은 학습 논리를 제어하는 다양한 데이터 입력 또는 매개 변수를 사용하여 파이프라인 작업을 제출하는 데 유용합니다(예: learning_rate
). REST 엔드포인트를 통해 파이프라인을 호출할 때 특히 유용합니다. 이러한 입력 및 출력을 사용하면 파이프라인 입력에 다른 값을 할당하거나 REST 엔드포인트를 통해 파이프라인 작업의 출력에 액세스할 수 있습니다. 자세한 내용은 일괄 처리 엔드포인트에 대한 작업 및 입력 데이터 만들기를 참조하세요.
입력 및 출력 유형
다음 형식은 구성 요소 또는 파이프라인의 출력으로 지원됩니다.
데이터 형식 데이터 형식에 대해 자세히 알아보려면 Azure Machine Learning에서 데이터 형식을 확인하세요.
uri_file
uri_folder
mltable
모델 형식.
mlflow_model
custom_model
기본적으로 출력을 직렬화하는 데이터 또는 모델 출력을 사용하고 스토리지 위치에 파일로 저장합니다. 이후 단계에서는 이 스토리지 위치를 컴퓨팅 대상 파일 시스템에 탑재, 다운로드 또는 업로드할 수 있으며, 다음 단계를 진행하여 작업 실행 중에 파일에 액세스합니다.
이 프로세스를 수행하려면 구성 요소의 소스 코드가 원하는 출력 개체(일반적으로 메모리에 저장됨)를 파일로 직렬화해야 합니다. 예를 들어 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에서 찾을 수 있습니다.
스튜디오의 파이프라인 작업 페이지에서 구성 요소의 데이터/모델 형식 입력/출력은 입력/출력 포트라고 하는 해당 구성 요소에 작은 원으로 표시됩니다. 이러한 포트는 파이프라인의 데이터 흐름을 나타냅니다.
파이프라인 수준 출력은 쉽게 식별할 수 있는 자주색 상자로 표시됩니다.
입력/출력 포트를 마우스를 가리키면 해당 형식이 표시됩니다.
기본 형식 입력은 그래프에 표시되지 않습니다. 파이프라인 작업 개요 패널(파이프라인 수준 입력의 경우) 또는 구성 요소 패널(구성 요소 수준 입력의 경우)의 설정 탭에서 찾을 수 있습니다. 다음 스크린샷은 파이프라인 작업의 설정 탭을 보여 줍니다. 이 탭은 작업 개요 링크를 선택하여 열 수 있습니다.
구성 요소에 대한 입력을 확인하려면 구성 요소를 두 번 클릭하여 구성 요소 패널을 엽니다.
마찬가지로 디자이너에서 파이프라인을 편집할 때 파이프라인 인터페이스 패널에서 파이프라인 입력 및 출력을 찾을 수 있으며 구성 요소 패널에서 구성 요소 입력 및 출력을 찾을 수 있습니다(구성 요소를 두 번 클릭하여 트리거).
구성 요소 입력 및 출력을 파이프라인 수준으로 승격하는 방법
구성 요소의 입력/출력을 파이프라인 수준으로 승격하면 파이프라인 작업을 제출할 때 구성 요소의 입력/출력을 덮어쓸 수 있습니다. 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개 점을 선택하고 > 파이프라인 입력에 추가를 선택합니다.
선택적 입력
기본적으로 모든 입력은 필수이며 파이프라인 작업을 제출할 때마다 값(또는 기본값)을 할당해야 합니다. 그러나 선택적 입력이 필요한 인스턴스가 있을 수 있습니다. 이러한 경우 파이프라인 작업을 제출할 때 입력에 값을 할당하지 않아도 됩니다.
선택적 입력은 다음 두 가지 시나리오에서 유용할 수 있습니다.
선택적 데이터/모델 형식 입력이 있고 파이프라인 작업을 제출할 때 값을 할당하지 않으면 파이프라인에 이전 데이터 종속성이 없는 구성 요소가 발생합니다. 즉, 입력 포트는 구성 요소 또는 데이터/모델 노드에 연결되지 않습니다. 이로 인해 파이프라인 서비스는 이전 종속성이 준비될 때까지 기다리지 않고 이 구성 요소를 직접 호출합니다.
아래 스크린샷은 두 번째 시나리오에 대한 명확한 예제를 제공합니다. 파이프라인에 대해
continue_on_step_failure = True
를 설정하고 첫 번째 노드(node1)의 출력을 선택적 입력으로 사용하는 두 번째 노드(node2)가 있는 경우 node1이 실패하더라도 node2는 계속 실행됩니다. 그러나 node2에서 node1의 필수 입력을 사용하는 경우 node1이 실패하면 node2가 실행되지 않습니다.
다음은 선택적 입력을 정의하는 방법에 대한 예제입니다.
$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
로 설정된 경우 $[[]]
를 사용하여 입력이 있는 명령줄을 수용해야 합니다. 위의 예제에서 강조 표시된 줄을 참조하세요.
참고 항목
선택적 출력은 지원되지 않습니다.
파이프라인 그래프에서 데이터/모델 형식의 선택적 입력은 점선 원으로 표시됩니다. 기본 형식의 선택적 입력은 설정 탭 아래에 있을 수 있습니다. 필수 입력과 달리 선택적 입력에는 옆에 별표가 없으므로 필수가 아님을 나타냅니다.
출력 경로를 사용자 지정하는 방법
기본적으로 구성 요소의 출력은 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>
출력을 명명된 자산으로 등록하는 방법
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