다음을 통해 공유


일괄 처리 엔드포인트를 사용하여 학습 파이프라인을 운영하는 방법

적용 대상:Azure CLI ml 확장 v2(현재)Python SDK azure-ai-ml v2(현재)

이 문서에서는 일괄 처리 엔드포인트에서 학습 파이프라인을 운영하는 방법을 알아봅니다. 파이프라인은 모델 학습, 데이터 전처리, 모델 평가를 포함하는 여러 구성 요소(또는 단계)를 사용합니다.

다음에 대해 알아봅니다.

  • 학습 파이프라인 만들기 및 테스트
  • 일괄 처리 엔드포인트에 파이프라인 배포
  • 파이프라인을 수정하고 동일한 엔드포인트에서 새 배포를 만듭니다.
  • 새 배포를 테스트하고 기본 배포로 설정

이 예에 대해

이 예에서는 입력 학습 데이터(레이블이 지정됨)를 가져와 평가 결과 및 전처리 중에 적용된 변환과 함께 예측 모델을 생성하는 학습 파이프라인을 배포합니다. 파이프라인은 UCI 심장병 데이터 세트의 표 형식 데이터를 사용하여 XGBoost 모델을 학습합니다. 모델을 맞추고 평가하기 위해 데이터가 학습 구성 요소로 전송되기 전에 데이터 전처리 구성 요소를 사용하여 데이터를 전처리합니다.

파이프라인의 시각화는 다음과 같습니다.

전처리 및 학습 구성 요소를 보여 주는 파이프라인 스크린샷.

이 문서의 예는 azureml-examples 리포지토리에 포함된 코드 샘플을 기반으로 합니다. YAML 및 기타 파일을 복사/붙여넣기하지 않고 로컬로 명령을 실행하려면 먼저 리포지토리를 복제한 후 디렉터리를 폴더로 변경합니다.

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli

이 예의 파일은 다음 위치에 있습니다.

cd endpoints/batch/deploy-pipelines/training-with-components

Jupyter Notebooks에서 따라 하기

복제된 리포지토리에서 sdk-deploy-and-test.ipynb Notebook을 열어 이 예의 Python SDK 버전을 따라갈 수 있습니다.

필수 조건

이 문서의 단계를 수행하기 전에 다음과 같은 필수 구성 요소가 있는지 확인합니다.

  • Azure 구독 Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다. Azure Machine Learning 평가판 또는 유료 버전을 사용해 보세요.

  • Azure Machine Learning 작업 영역 작업 영역이 없으면 Azure Machine Learning 작업 영역 관리 문서의 단계에서 새로 만듭니다.

  • 작업 영역에 다음 권한이 있는지 확인합니다.

    • 일괄 처리 엔드포인트 및 배포 만들기 또는 관리: Microsoft.MachineLearningServices/workspaces/batchEndpoints/*를 허용하는 소유자, 기여자 또는 사용자 지정 역할을 사용합니다.

    • 작업 영역 리소스 그룹에서 ARM 배포 만들기: 작업 영역이 배포된 리소스 그룹에서 Microsoft.Resources/deployments/write를 허용하는 소유자, 기여자 또는 사용자 지정 역할을 사용합니다.

  • Azure Machine Learning을 사용하려면 다음 소프트웨어를 설치해야 합니다.

    Azure CLImlAzure Machine Learning용 확장.

    az extension add -n ml
    

    참고 항목

    일괄 처리 엔드포인트에 대한 파이프라인 구성 요소 배포는 Azure CLI용 ml 확장 버전 2.7에 도입되었습니다. 최신 버전을 가져오려면 az extension update --name ml을 사용합니다.

작업 영역에 연결

작업 영역은 Azure Machine Learning의 최상위 리소스로, Azure Machine Learning을 사용할 때 만든 모든 아티팩트를 사용할 수 있는 중앙 집중식 환경을 제공합니다. 이 섹션에서는 배포 작업을 수행할 작업 영역에 연결합니다.

다음 코드에서 구독 ID, 작업 영역, 위치 및 리소스 그룹에 대한 값을 전달합니다.

az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>

학습 파이프라인 구성 요소 만들기

이 섹션에서는 학습 파이프라인에 필요한 모든 자산을 만듭니다. 모델을 학습하는 데 필요한 라이브러리가 포함된 환경을 만드는 것부터 시작할 예정입니다. 그런 다음 일괄 처리 배포가 실행될 컴퓨팅 클러스터를 만들고 마지막으로 입력 데이터를 데이터 자산으로 등록합니다.

환경 만들기

이 예의 구성 요소는 XGBoostscikit-learn 라이브러리가 있는 환경을 사용합니다. environment/conda.yml 파일에는 환경 구성이 포함되어 있습니다.

environment/conda.yml

channels:
- conda-forge
dependencies:
- python=3.8.5
- pip
- pip:
  - mlflow
  - azureml-mlflow
  - datasets
  - jobtools
  - cloudpickle==1.6.0
  - dask==2023.2.0
  - scikit-learn==1.1.2
  - xgboost==1.3.3
  - pandas==1.4
name: mlflow-env

다음과 같이 환경을 만듭니다.

  1. 환경을 정의합니다.

    environment/xgboost-sklearn-py38.yml

    $schema: https://azuremlschemas.azureedge.net/latest/environment.schema.json
    name: xgboost-sklearn-py38
    image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
    conda_file: conda.yml
    description: An environment for models built with XGBoost and Scikit-learn.
    
  2. 환경 만들기:

    az ml environment create -f environment/xgboost-sklearn-py38.yml
    

컴퓨팅 클러스터 만들기

일괄 처리 엔드포인트 및 배포는 컴퓨팅 클러스터에서 실행됩니다. 작업 영역에 이미 존재하는 모든 Azure Machine Learning 컴퓨팅 클러스터에서 실행할 수 있습니다. 따라서 여러 일괄 처리 배포가 동일한 컴퓨팅 인프라를 공유할 수 있습니다. 이 예에서는 batch-cluster라는 Azure Machine Learning 컴퓨팅 클러스터에 대해 작업합니다. 컴퓨팅이 작업 영역에 있는지 확인하고, 없으면 만들겠습니다.

az ml compute create -n batch-cluster --type amlcompute --min-instances 0 --max-instances 5

학습 데이터를 데이터 자산으로 등록

학습 데이터는 CSV 파일로 표시됩니다. 보다 프로덕션 수준의 워크로드를 모방하기 위해 heart.csv 파일의 학습 데이터를 작업 영역의 데이터 자산으로 등록할 예정입니다. 이 데이터 자산은 나중에 엔드포인트에 대한 입력으로 표시됩니다.

az ml data create --name heart-classifier-train --type uri_folder --path data/train

파이프라인 만들기

Microsoft가 운영하려는 파이프라인은 하나의 입력, 즉 학습 데이터를 취하고 학습된 모델, 평가 결과, 전처리로 적용된 데이터 변환이라는 세 가지 출력을 생성합니다. 파이프라인은 두 가지 구성 요소로 구성됩니다.

  • preprocess_job: 이 단계에서는 입력 데이터를 읽고 준비된 데이터와 적용된 변환을 반환합니다. 이 단계는 세 가지 입력을 받습니다.
    • data: 변환하고 점수를 매길 입력 데이터가 포함된 폴더
    • transformations: (선택 사항) 적용할 변환에 대한 경로입니다(사용 가능한 경우). 경로가 제공되지 않으면 입력 데이터에서 변환이 학습됩니다. transformations 입력은 선택 사항이므로 학습 및 채점 중에 preprocess_job 구성 요소를 사용할 수 있습니다.
    • categorical_encoding: 범주형 기능(ordinal 또는 onehot)에 대한 인코딩 전략입니다.
  • train_job: 이 단계에서는 준비된 데이터를 기반으로 XGBoost 모델을 학습시키고 평가 결과와 학습된 모델을 반환합니다. 이 단계는 세 가지 입력을 받습니다.
    • data: 전처리된 데이터입니다.
    • target_column: 예측하려는 열입니다.
    • eval_size: 평가에 사용된 입력 데이터의 비율을 나타냅니다.

파이프라인 구성은 deployment-ordinal/pipeline.yml 파일에 정의됩니다.

deployment-ordinal/pipeline.yml

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

name: uci-heart-train-pipeline
display_name: uci-heart-train
description: This pipeline demonstrates how to train a machine learning classifier over the UCI heart dataset.

inputs:
  input_data:
    type: uri_folder

outputs: 
  model:
    type: mlflow_model
    mode: upload
  evaluation_results:
    type: uri_folder
    mode: upload
  prepare_transformations:
    type: uri_folder
    mode: upload

jobs:
  preprocess_job:
    type: command
    component: ../components/prepare/prepare.yml
    inputs:
      data: ${{parent.inputs.input_data}}
      categorical_encoding: ordinal
    outputs:
      prepared_data:
      transformations_output: ${{parent.outputs.prepare_transformations}}
  
  train_job:
    type: command
    component: ../components/train_xgb/train_xgb.yml
    inputs:
      data: ${{parent.jobs.preprocess_job.outputs.prepared_data}}
      target_column: target
      register_best_model: false
      eval_size: 0.3
    outputs:
      model: 
        mode: upload
        type: mlflow_model
        path: ${{parent.outputs.model}}
      evaluation_results:
        mode: upload
        type: uri_folder
        path: ${{parent.outputs.evaluation_results}}

참고 항목

pipeline.yml 파일에서 transformations 입력이 preprocess_job에서 누락되었습니다. 따라서 스크립트는 입력 데이터에서 변환 매개 변수를 학습합니다.

파이프라인의 시각화는 다음과 같습니다.

작업 입력, 파이프라인 구성 요소 및 파이프라인 각 단계의 출력을 보여 주는 파이프라인 이미지.

파이프라인 테스트

몇 가지 샘플 데이터를 사용하여 파이프라인을 테스트해 보겠습니다. 이를 위해 파이프라인과 이전에 만들어진 batch-cluster 컴퓨팅 클러스터를 사용하여 작업을 만들 예정입니다.

다음 pipeline-job.yml 파일에는 파이프라인 작업에 대한 구성이 포함되어 있습니다.

deployment-ordinal/pipeline-job.yml

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

experiment_name: uci-heart-train-pipeline
display_name: uci-heart-train-job
description: This pipeline demonstrates how to train a machine learning classifier over the UCI heart dataset.

compute: batch-cluster
component: pipeline.yml
inputs:
  input_data:
    type: uri_folder
outputs: 
  model:
    type: mlflow_model
    mode: upload
  evaluation_results:
    type: uri_folder
    mode: upload
  prepare_transformations:
    mode: upload

테스트 작업을 만듭니다.

az ml job create -f deployment-ordinal/pipeline-job.yml --set inputs.input_data.path=azureml:heart-classifier-train@latest

일괄 처리 엔드포인트 만들기

  1. 엔드포인트에 사용할 이름을 입력합니다. 일괄 처리 엔드포인트의 이름은 호출 URI를 구성하는 데 사용되므로 각 지역에서 고유해야 합니다. 고유성을 보장하려면 다음 코드에 지정된 이름에 후행 문자를 추가합니다.

    ENDPOINT_NAME="uci-classifier-train"
    
  2. 엔드포인트 구성:

    endpoint.yml 파일에는 엔드포인트 구성이 포함되어 있습니다.

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json
    name: uci-classifier-train
    description: An endpoint to perform training of the Heart Disease Data Set prediction task.
    auth_mode: aad_token
    
  3. 엔드포인트 만들기:

    az ml batch-endpoint create --name $ENDPOINT_NAME -f endpoint.yml
    
  4. 엔드포인트 URI를 쿼리합니다.

    az ml batch-endpoint show --name $ENDPOINT_NAME
    

파이프라인 구성 요소 배포

파이프라인 구성 요소를 배포하려면 일괄 처리 배포를 만들어야 합니다. 배포는 실제 작업을 수행하는 자산을 호스팅하는 데 필요한 리소스 집합입니다.

  1. 배포 구성:

    deployment-ordinal/deployment.yml 파일에는 배포 구성이 포함되어 있습니다. 추가 속성은 전체 일괄 처리 엔드포인트 YAML 스키마를 확인합니다.

    deployment-ordinal/deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/pipelineComponentBatchDeployment.schema.json
    name: uci-classifier-train-xgb
    description: A sample deployment that trains an XGBoost model for the UCI dataset.
    endpoint_name: uci-classifier-train
    type: pipeline
    component: pipeline.yml
    settings:
        continue_on_step_failure: false
        default_compute: batch-cluster
    
  2. 배포 만들기:

    다음 코드를 실행하여 일괄 처리 배포를 일괄 처리 엔드포인트 아래에 만들고 기본 배포로 설정합니다.

    az ml batch-deployment create --endpoint $ENDPOINT_NAME -f deployment-ordinal/deployment.yml --set-default
    

    이 새 배포가 이제 기본값임을 나타내기 위해 --set-default 플래그를 사용하는 것에 주목합니다.

  3. 배포를 사용할 준비가 되었습니다.

배포 테스트

배포가 만들어지면 작업을 수신할 준비가 된 것입니다. 테스트하려면 다음 단계를 따릅니다.

  1. 배포에서는 하나의 데이터 입력을 표시해야 합니다.

    inputs.yml 파일에는 입력 데이터 자산에 대한 정의가 포함되어 있습니다.

    inputs.yml

    inputs:
      input_data:
        type: uri_folder
        path: azureml:heart-classifier-train@latest
    

    입력을 표시하는 방법에 대해 자세히 알아보려면 일괄 처리 엔드포인트에 대한 작업 및 입력 데이터 만들기를 참조하세요.

  2. 다음과 같이 기본 배포를 호출할 수 있습니다.

    JOB_NAME=$(az ml batch-endpoint invoke -n $ENDPOINT_NAME --f inputs.yml --query name -o tsv)
    
  3. 다음을 사용하여 쇼 진행 상황을 모니터링하고 로그를 스트리밍할 수 있습니다.

    az ml job stream -n $JOB_NAME
    

파이프라인의 입력만 일괄 처리 엔드포인트의 입력으로 게시된다는 점을 언급할 가치가 있습니다. 예를 들어, categorical_encoding은 파이프라인 단계의 입력이지만 파이프라인 자체의 입력은 아닙니다. 이 팩트를 사용하여 클라이언트에게 노출할 입력과 숨길 입력을 제어합니다.

작업 출력에 액세스

작업이 완료되면 일부 출력에 액세스할 수 있습니다. 이 파이프라인은 해당 구성 요소에 대해 다음과 같은 출력을 생성합니다.

  • preprocess job: 출력은 transformations_output입니다.
  • train job: 출력은 modelevaluation_results입니다.

다음을 사용하여 관련 결과를 다운로드할 수 있습니다.

az ml job download --name $JOB_NAME --output-name transformations
az ml job download --name $JOB_NAME --output-name model
az ml job download --name $JOB_NAME --output-name evaluation_results

엔드포인트에서 새 배포 만들기

엔드포인트는 한 번에 여러 배포를 호스팅하면서 하나의 배포만 기본값으로 유지할 수 있습니다. 따라서 다양한 모델을 반복하고, 다양한 모델을 엔드포인트에 배포하고 테스트한 다음, 마지막으로 기본 배포를 자신에게 가장 적합한 모델 배포로 전환할 수 있습니다.

더 나은 성능을 발휘하는 모델을 가져올 수 있는지 알아보기 위해 파이프라인에서 전처리가 수행되는 방식을 변경해 보겠습니다.

파이프라인의 전처리 구성 요소에서 매개 변수 변경

전처리 구성 요소에는 categorical_encoding이라는 입력이 있으며, 이는 ordinal 또는 onehot 값을 가질 수 있습니다. 이러한 값은 범주형 기능을 인코딩하는 두 가지 다른 방법에 해당합니다.

  • ordinal: [1:n]의 숫자 값(서수)으로 기능 값을 인코딩합니다. 여기서 n은 기능의 범주 수입니다. 서수 인코딩은 기능 범주 간에 자연스러운 순위 순서가 있음을 의미합니다.
  • onehot: 자연스러운 순위 관계를 의미하지는 않지만 범주 수가 많은 경우 차원 문제가 발생합니다.

기본적으로 이전에는 ordinal을 사용했습니다. 이제 onehot을 사용하도록 범주형 인코딩을 변경하고 모델이 어떻게 작동하는지 살펴보겠습니다.

또는 categorial_encoding 입력을 파이프라인 작업 자체에 대한 입력으로 클라이언트에 노출할 수도 있습니다. 그러나 배포 내부에서 매개 변수를 숨기고 제어하고 동일한 엔드포인트에서 여러 배포를 수행할 수 있는 기회를 활용할 수 있도록 전처리 단계에서 매개 변수 값을 변경하기로 결정했습니다.

  1. 파이프라인을 수정합니다. 다음과 같이 보입니다.

    파이프라인 구성은 deployment-onehot/pipeline.yml 파일에 정의됩니다.

    deployment-onehot/pipeline.yml

    $schema: https://azuremlschemas.azureedge.net/latest/pipelineComponent.schema.json
    type: pipeline
    
    name: uci-heart-train-pipeline
    display_name: uci-heart-train
    description: This pipeline demonstrates how to train a machine learning classifier over the UCI heart dataset.
    
    inputs:
      input_data:
        type: uri_folder
    
    outputs: 
      model:
        type: mlflow_model
        mode: upload
      evaluation_results:
        type: uri_folder
        mode: upload
      prepare_transformations:
        type: uri_folder
        mode: upload
    
    jobs:
      preprocess_job:
        type: command
        component: ../components/prepare/prepare.yml
        inputs:
          data: ${{parent.inputs.input_data}}
          categorical_encoding: onehot
        outputs:
          prepared_data:
          transformations_output: ${{parent.outputs.prepare_transformations}}
      
      train_job:
        type: command
        component: ../components/train_xgb/train_xgb.yml
        inputs:
          data: ${{parent.jobs.preprocess_job.outputs.prepared_data}}
          target_column: target
          eval_size: 0.3
        outputs:
          model: 
            type: mlflow_model
            path: ${{parent.outputs.model}}
          evaluation_results:
            type: uri_folder
            path: ${{parent.outputs.evaluation_results}}
    
  2. 배포 구성:

    deployment-onehot/deployment.yml 파일에는 배포 구성이 포함되어 있습니다. 추가 속성은 전체 일괄 처리 엔드포인트 YAML 스키마를 확인합니다.

    deployment-onehot/deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/pipelineComponentBatchDeployment.schema.json
    name: uci-classifier-train-onehot
    description: A sample deployment that trains an XGBoost model for the UCI dataset using onehot encoding for variables.
    endpoint_name: uci-classifier-train
    type: pipeline
    component: pipeline.yml
    settings:
        continue_on_step_failure: false
        default_compute: batch-cluster
    
  3. 배포 만들기:

    다음 코드를 실행하여 일괄 처리 배포를 일괄 처리 엔드포인트 아래에 만들고 기본 배포로 설정합니다.

    az ml batch-deployment create --endpoint $ENDPOINT_NAME -f deployment-onehot/deployment.yml
    

    배포를 사용할 준비가 되었습니다.

  4. 배포를 사용할 준비가 되었습니다.

기본이 아닌 배포 테스트

배포가 만들어지면 작업을 수신할 준비가 된 것입니다. 이전과 동일한 방식으로 테스트할 수 있지만 이제 특정 배포를 호출할 예정입니다.

  1. 특정 배포 uci-classifier-train-onehot을 트리거하도록 배포 매개 변수를 지정하여 다음과 같이 배포를 호출합니다.

    DEPLOYMENT_NAME="uci-classifier-train-onehot"
    JOB_NAME=$(az ml batch-endpoint invoke -n $ENDPOINT_NAME -d $DEPLOYMENT_NAME --f inputs.yml --query name -o tsv)
    
  2. 다음을 사용하여 쇼 진행 상황을 모니터링하고 로그를 스트리밍할 수 있습니다.

    az ml job stream -n $JOB_NAME
    

새 배포를 기본 배포로 구성

새 배포의 성능에 만족하면 이 새 배포를 기본값으로 설정할 수 있습니다.

az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME

이전 배포 삭제

완료한 후 더 이상 필요하지 않으면 이전 배포를 삭제할 수 있습니다.

az ml batch-deployment delete --name uci-classifier-train-xgb --endpoint-name $ENDPOINT_NAME --yes

리소스 정리

완료되면 작업 영역에서 연결된 리소스를 삭제합니다.

다음 코드를 실행하여 일괄 처리 엔드포인트와 기본 배포를 삭제합니다. 삭제를 확인하려면 --yes를 사용합니다.

az ml batch-endpoint delete -n $ENDPOINT_NAME --yes

(선택 사항) 이후 배포에서 컴퓨팅 클러스터를 재사용할 계획이 아닌 경우 컴퓨팅을 삭제합니다.

az ml compute delete -n batch-cluster

다음 단계