일괄 처리 엔드포인트에서 채점을 위한 모델 배포

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

일괄 처리 엔드포인트는 대량의 데이터에 대해 유추를 실행하는 모델을 배포할 수 있는 편리한 방법을 제공합니다. 이러한 엔드포인트는 일괄 처리 채점을 위해 모델을 호스트하는 프로세스를 간소화하므로 인프라가 아닌 기계 학습에 집중할 수 있습니다.

다음의 경우 모델 배포를 위한 일괄 처리 엔드포인트를 사용합니다.

  • 유추를 실행하는 데 더 오랜 시간이 필요한 비용이 많이 드는 많이 드는 모델이 있습니다.
  • 여러 파일에 분산된 대량의 데이터에 대해 유추를 수행해야 합니다.
  • 낮은 대기 시간 요구 사항이 없습니다.
  • 병렬 처리를 활용할 수 있습니다.

이 문서에서는 일괄 처리 엔드포인트를 사용하여 클래식 MNIST(Modified National Institute of Standards and Technology) 숫자 인식 문제를 해결하는 기계 학습 모델을 배포합니다. 그런 다음 배포된 모델에서 대량의 데이터(이 경우 이미지 파일)에 대해 일괄 처리 유추을 수행합니다. 먼저 Torch를 사용하여 만든 모델의 일괄 배포를 만듭니다. 이 배포가 엔드포인트에서 기본 배포가 됩니다. 나중에 TensorFlow(Keras)를 사용하여 만든 모드의 두 번째 배포를 만들고, 두 번째 배포를 테스트한 다음, 엔드포인트의 기본 배포로 설정할 수도 있습니다.

이 문서의 명령을 로컬로 실행하는 데 필요한 코드 샘플 및 파일을 따라가려면 예제 리포지토리 복제 섹션을 참조하세요. 코드 샘플 및 파일은 azureml-examples 리포지토리에 포함되어 있습니다.

필수 조건

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

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

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

  • 다음 작업을 수행하려면 작업 영역에 다음 권한이 있는지 확인합니다.

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

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

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

    적용 대상:Azure CLI ml 확장 v2(현재)

    Azure CLImlAzure Machine Learning용 확장.

    az extension add -n ml
    

예제 리포지토리 복제

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

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli/endpoints/batch/deploy-models/mnist-classifier

시스템 준비

작업 영역에 연결

먼저 작업을 수행할 Azure Machine Learning 작업 영역에 연결합니다.

Azure CLI에 대한 기본값을 아직 설정하지 않은 경우 기본 설정을 저장합니다. 구독, 작업 영역, 리소스 그룹 및 위치에 대한 값을 여러 번 전달하지 않으려면 다음 코드를 실행하세요.

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

컴퓨팅 만들기

일괄 처리 엔드포인트는 컴퓨팅 클러스터에서 실행되고 Azure Machine Learning 컴퓨팅 클러스터(AmlCompute)Kubernetes 클러스터를 모두 지원합니다. 클러스터는 공유 리소스이므로 하나의 클러스터가 하나 이상의 일괄 처리 배포를 호스트할 수 있습니다(원하는 경우 다른 워크로드와 함께).

다음 코드와 같이 이름이 batch-cluster인 컴퓨팅을 만듭니다. 필요에 따라 조정하고 azureml:<your-compute-name>을 사용하여 컴퓨팅을 참조할 수 있습니다.

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

참고 항목

일괄 처리 엔드포인트가 호출되고 일괄 처리 채점 작업이 제출될 때까지 클러스터가 0개 노드로 유지되기 때문에 이 시점에는 컴퓨팅에 대한 요금이 청구되지 않습니다. 컴퓨팅 비용에 대한 자세한 내용은 AmlCompute에 대한 비용 관리 및 최적화를 참조하세요.

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

일괄 처리 엔드포인트는 클라이언트가 일괄 처리 채점 작업을 트리거하기 위해 호출할 수 있는 HTTPS 엔드포인트입니다. 일괄 처리 채점 작업은 여러 입력을 채점하는 작업입니다. 일괄 처리 배포는 실제 일괄 처리 채점(일괄 처리 유추)을 수행하는 모델을 호스트하는 컴퓨팅 리소스 집합입니다. 하나의 일괄 처리 엔드포인트에 여러 일괄 처리 배포가 있을 수 있습니다. 일괄 처리 엔드포인트에 대한 자세한 내용은 일괄 처리 엔드포인트란?을 참조하세요.

일괄 처리 배포 중 하나가 엔드포인트의 기본 배포 역할을 합니다. 기본 배포는 엔드포인트가 호출될 때 실제 일괄 처리 채점을 수행합니다. 일괄 처리 엔드포인트 및 배포에 대한 자세한 내용은 일괄 처리 엔드포인트 및 일괄 배포를 참조하세요.

  1. 엔드포인트를 명명합니다. 엔드포인트의 이름은 엔드포인트의 URI에 포함되어 있으므로 Azure 지역 내에서 고유해야 합니다. 예를 들어, westus2에는 이름이 mybatchendpoint인 일괄 처리 엔드포인트가 하나만 있을 수 있습니다.

    나중에 쉽게 참조할 수 있도록 엔드포인트 이름을 변수에 배치합니다.

    ENDPOINT_NAME="mnist-batch"
    
  2. 일괄 처리 엔드포인트 구성

    다음 YAML 파일은 일괄 처리 엔드포인트를 정의합니다. 일괄 처리 엔드포인트를 만들기 위해 CLI 명령으로 이 파일을 사용할 수 있습니다.

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json
    name: mnist-batch
    description: A batch endpoint for scoring images from the MNIST dataset.
    tags:
      type: deep-learning
    

    다음 표에서는 엔드포인트의 주요 속성에 대해 설명합니다. 전체 일괄 처리 엔드포인트 YAML 스키마는 CLI(v2) 일괄 처리 엔드포인트 YAML 스키마를 참조하세요.

    설명
    name 일괄 처리 엔드포인트의 이름입니다. Azure 지역 수준에서 고유해야 합니다.
    description 일괄 처리 엔드포인트에 대한 설명입니다. 이 속성은 선택 사항입니다.
    tags 엔드포인트에 포함할 태그입니다. 이 속성은 선택 사항입니다.
  3. 엔드포인트 만들기:

    다음 코드를 실행하여 일괄 처리 엔드포인트를 만듭니다.

    az ml batch-endpoint create --file endpoint.yml  --name $ENDPOINT_NAME
    

일괄 처리 배포 만들기

모델 배포는 실제 유추를 수행하는 모델을 호스팅하는 데 필요한 리소스의 집합입니다. 일괄 처리 모델 배포를 만들려면 다음 항목이 필요합니다.

  • 작업 영역에 등록된 모델
  • 모델 채점하는 코드
  • 모델의 종속성이 설치된 환경
  • 미리 생성된 컴퓨팅 및 리소스 설정
  1. 먼저 배포할 모델, 즉 MNIST(인기 있는 숫자 인식 문제)에 대한 Torch 모델을 등록합니다. 일괄 처리 배포는 작업 영역에 등록된 모델만 배포할 수 있습니다. 배포하려는 모델이 이미 등록된 경우 이 단계를 건너뛸 수 있습니다.

    모델은 엔드포인트가 아닌 배포와 연결됩니다. 이는 다른 모델(또는 모델 버전)이 다른 배포에 배포되는 경우, 단일 엔드포인트가 동일한 엔드포인트에서 다른 모델(또는 모델 버전)을 제공할 수 있음을 의미합니다.

    MODEL_NAME='mnist-classifier-torch'
    az ml model create --name $MODEL_NAME --type "custom_model" --path "deployment-torch/model"
    
  2. 이제 점수 매기기 스크립트를 만들 차례입니다. 일괄 처리 배포는 지정된 모델이 어떻게 실행되고 입력 데이터가 어떻게 처리되어야 하는지를 나타내는 채점 스크립트가 필요합니다. 일괄 처리 엔드포인트는 Python에서 만든 스크립트를 지원합니다. 이 경우 숫자를 나타내는 이미지 파일을 읽고 해당 숫자를 출력하는 모델을 배포합니다. 채점 스크립트는 다음과 같습니다.

    참고 항목

    MLflow 모델의 경우 Azure Machine Learning에서 채점 스크립트를 자동으로 생성하므로 제공할 필요가 없습니다. 모델이 MLflow 모델인 경우 이 단계를 건너뛸 수 있습니다. 일괄 처리 엔드포인트가 MLflow 모델에서 작동하는 방식에 대한 자세한 내용은 일괄 처리 배포에서 MLflow 모델 사용 문서를 참조하세요.

    Warning

    일괄 처리 엔드포인트에서 자동화된 기계 학습(AutoML) 모델을 배포하는 경우 AutoML이 제공하는 점수 매기기 스크립트는 온라인 엔드포인트에서만 작동하며 일괄 처리 실행용으로 설계되지 않았습니다. 일괄 배포를 위한 채점 스크립트를 만드는 방법에 대한 지침은 일괄 처리 배포에 대한 채점 스크립트 작성을 참조하세요.

    deployment-torch/code/batch_driver.py

    import os
    import pandas as pd
    import torch
    import torchvision
    import glob
    from os.path import basename
    from mnist_classifier import MnistClassifier
    from typing import List
    
    
    def init():
        global model
        global device
    
        # AZUREML_MODEL_DIR is an environment variable created during deployment
        # It is the path to the model folder
        model_path = os.environ["AZUREML_MODEL_DIR"]
        model_file = glob.glob(f"{model_path}/*/*.pt")[-1]
    
        model = MnistClassifier()
        model.load_state_dict(torch.load(model_file))
        model.eval()
    
        device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    
    
    def run(mini_batch: List[str]) -> pd.DataFrame:
        print(f"Executing run method over batch of {len(mini_batch)} files.")
    
        results = []
        with torch.no_grad():
            for image_path in mini_batch:
                image_data = torchvision.io.read_image(image_path).float()
                batch_data = image_data.expand(1, -1, -1, -1)
                input = batch_data.to(device)
    
                # perform inference
                predict_logits = model(input)
    
                # Compute probabilities, classes and labels
                predictions = torch.nn.Softmax(dim=-1)(predict_logits)
                predicted_prob, predicted_class = torch.max(predictions, axis=-1)
    
                results.append(
                    {
                        "file": basename(image_path),
                        "class": predicted_class.numpy()[0],
                        "probability": predicted_prob.numpy()[0],
                    }
                )
    
        return pd.DataFrame(results)
    
  3. 일괄 처리 배포가 실행될 환경을 만듭니다. 이 환경에는 일괄 처리 엔드포인트에 필요한 패키지 azureml-coreazureml-dataset-runtime[fuse]과 실행을 위해 코드에 필요한 종속성이 포함되어야 합니다. 이 경우 종속성은 conda.yaml 파일에서 캡처되었습니다.

    deployment-torch/environment/conda.yaml

    name: mnist-env
    channels:
      - conda-forge
    dependencies:
      - python=3.8.5
      - pip<22.0
      - pip:
        - torch==1.13.0
        - torchvision==0.14.0
        - pytorch-lightning
        - pandas
        - azureml-core
        - azureml-dataset-runtime[fuse]
    

    Important

    패키지 azureml-coreazureml-dataset-runtime[fuse]는 일괄 배포에 필요하며 환경 종속성에 포함되어야 합니다.

    다음과 같이 환경을 지정합니다.

    환경 정의는 배포 정의 자체에 익명 환경으로 포함됩니다. 배포의 다음 줄에 표시됩니다.

    environment:
      name: batch-torch-py38
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    

    Warning

    큐레이팅된 환경은 일괄 처리 배포에서 지원되지 않습니다. 사용자 고유의 환경을 지정해야 합니다. 큐레이팅된 환경의 기본 이미지를 항상 자신의 이미지로 사용하여 프로세스를 단순화할 수 있습니다.

  4. 배포 정의 만들기

    deployment-torch/deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json
    name: mnist-torch-dpl
    description: A deployment using Torch to solve the MNIST classification dataset.
    endpoint_name: mnist-batch
    type: model
    model:
      name: mnist-classifier-torch
      path: model
    code_configuration:
      code: code
      scoring_script: batch_driver.py
    environment:
      name: batch-torch-py38
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    compute: azureml:batch-cluster
    resources:
      instance_count: 1
    settings:
      max_concurrency_per_instance: 2
      mini_batch_size: 10
      output_action: append_row
      output_file_name: predictions.csv
      retry_settings:
        max_retries: 3
        timeout: 30
      error_threshold: -1
      logging_level: info
    

    다음 표에서는 일괄 배포의 주요 속성에 대해 설명합니다. 전체 일괄 처리 배포 YAML 스키마는 CLI(v2) 일괄 처리 배포 YAML 스키마를 참조하세요.

    설명
    name 배포의 이름입니다.
    endpoint_name 배포를 만들 엔드포인트의 이름입니다.
    model 일괄 처리 채점에 사용할 모델입니다. 이 예제에서는 path를 사용하여 인라인으로 모델을 정의합니다. 이 정의를 통해 모델 파일이 자동으로 업로드되고 자동 생성되는 이름 및 버전으로 등록됩니다. 자세한 옵션은 모델 스키마를 참조하세요. 프로덕션 시나리오에 대한 모범 사례로 모델을 별도로 만들고 여기에서 참조해야 합니다. 기존 모델을 참조하려면 azureml:<model-name>:<model-version> 구문을 사용합니다.
    code_configuration.code 모델을 채점하는 데 필요한 모든 Python 소스 코드가 포함된 로컬 디렉터리입니다.
    code_configuration.scoring_script code_configuration.code 디렉터리에 있는 Python 파일입니다. 이 파일에는 init() 함수와 run() 함수가 있어야 합니다. 비용이 많이 들거나 일반적인 준비에는 init() 함수를 사용합니다(예: 메모리에 모델 로드). init()는 프로세스 시작 시 한 번만 호출됩니다. run(mini_batch)를 사용하여 각 항목의 점수를 매길 수 있습니다. mini_batch의 값은 파일 경로 목록입니다. run() 함수는 pandas DataFrame 또는 배열을 반환해야 합니다. 반환되는 각 요소는 mini_batch의 입력 요소의 성공적인 실행 1건을 나타냅니다. 채점 스크립트를 작성하는 방법에 대한 자세한 내용은 채점 스크립트 이해를 참조하세요.
    environment 모델을 채점하는 환경입니다. 이 예제에서는 conda_fileimage를 사용하여 환경 인라인을 정의합니다. conda_file 종속성은 image 위에 설치됩니다. 환경은 자동으로 생성되는 이름 및 버전으로 자동 등록됩니다. 자세한 옵션은 환경 스키마를 참조하세요. 프로덕션 시나리오에 대한 모범 사례로 환경을 별도로 만들고 여기에서 참조해야 합니다. 기존 환경을 참조하려면 azureml:<environment-name>:<environment-version> 구문을 사용합니다.
    compute 일괄 처리 채점을 실행할 컴퓨팅입니다. 이 예에서는 처음에 만든 batch-cluster를 사용하고 azureml:<compute-name> 구문을 사용하여 참조합니다.
    resources.instance_count 각 일괄 처리 채점 작업에 사용할 인스턴스 수입니다.
    settings.max_concurrency_per_instance [선택 사항] 인스턴스당 최대 병렬 scoring_script 실행 수입니다.
    settings.mini_batch_size [선택 사항] scoring_script에서 한 번의 run() 호출로 처리할 수 있는 파일 수입니다.
    settings.output_action [선택 사항] 출력 파일에서 출력을 구성하는 방법입니다. append_rowrun()에서 반환한 모든 출력 결과를 output_file_name이라는 단일 파일에 병합합니다. summary_only는 출력 결과를 병합하지 않고 error_threshold만 계산합니다.
    settings.output_file_name [선택 사항] append_rowoutput_action의 일괄 처리 채점 출력 파일 이름입니다.
    settings.retry_settings.max_retries [선택 사항] 실패한 scoring_scriptrun()에 대한 최대 시도 횟수입니다.
    settings.retry_settings.timeout [선택 사항] scoring_scriptrun()의 미니 일괄 처리 채점에 대한 시간 제한(초)입니다.
    settings.error_threshold [선택 사항] 무시해야 하는 입력 파일 채점 오류 수입니다. 전체 입력의 오류 횟수가 이 값을 초과하면 일괄 처리 채점 작업이 중단됩니다. 이 예제에서는 일괄 처리 채점 작업을 종료하지 않고 허용되는 오류 수를 나타내는 -1를 사용합니다.
    settings.logging_level [선택 사항] 로그의 세부 정보 표시입니다. 세부 정보 표시가 증가하는 값은 WARNING, INFO 및 DEBUG입니다.
    settings.environment_variables [선택 사항] 각 일괄 처리 채점 작업에 대해 설정할 환경 변수 이름-값 쌍의 사전입니다.
  5. 배포 만들기:

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

    az ml batch-deployment create --file deployment-torch/deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
    

    --set-default 매개 변수는 새로 생성된 배포를 엔드포인트의 기본 배포로 설정합니다. 특히 첫 번째 배포를 만들 때 엔드포인트의 새 기본 배포를 편리하게 만들 수 있는 방법입니다. 프로덕션 시나리오의 모범 사례로, 새 배포를 기본값으로 설정하지 않고 만드는 것이 좋습니다. 배포가 예상대로 작동하는지 확인한 다음 나중에 기본 배포를 업데이트합니다. 이 프로세스를 구현하는 방법에 대한 자세한 내용은 새 모델 배포 섹션을 참조하세요.

  6. 일괄 처리 엔드포인트 및 배포 세부 정보를 확인합니다.

    show를 사용하여 일괄 처리 엔드포인트 및 배포 세부 정보를 확인합니다. 일괄 처리 배포를 확인하려면 다음 코드를 실행합니다.

    DEPLOYMENT_NAME="mnist-torch-dpl"
    az ml batch-deployment show --name $DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME
    

일괄 처리 엔드포인트 실행 및 결과 액세스

일괄 처리 엔드포인트를 호출하면 일괄 처리 채점 작업이 트리거됩니다. name 작업은 호출 응답에서 반환되며 일괄 처리 채점 진행 상황을 추적하는 데 사용할 수 있습니다. 일괄 처리 엔드포인트에서 채점을 위해 모델을 실행하는 경우 엔드포인트에서 채점할 데이터를 찾도록 입력 데이터 경로를 지정해야 합니다. 다음 예에서는 Azure Storage 계정에 저장된 MNIST 데이터 세트의 샘플 데이터를 통해 새 작업을 시작하는 방법을 보여 줍니다.

Azure CLI, Azure Machine Learning SDK 또는 REST 엔드포인트를 사용하여 일괄 처리 엔드포인트를 실행하고 호출할 수 있습니다. 이러한 옵션에 대한 자세한 내용은 일괄 처리 엔드포인트에 대한 작업 및 입력 데이터 만들기를 참조하세요.

참고 항목

병렬 처리는 어떻게 작동하나요?

일괄 처리 배포는 파일 수준에서 작업을 배포합니다. 즉, 10개 파일의 미니 일괄 처리가 포함된 100개의 파일이 포함된 폴더는 각각 10개 파일의 10개 일괄 처리를 생성합니다. 이는 관련된 파일의 크기에 관계없이 발생합니다. 파일이 너무 커서 대형 미니 일괄 처리로 처리할 수 없는 경우 파일을 더 작은 파일로 분할하여 더 높은 수준의 병렬 처리를 달성하거나 미니 일괄 처리당 파일 수를 줄이는 것이 좋습니다. 현재 일괄 처리 배포는 파일 크기 분포의 기울이기를 설명할 수 없습니다.

JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input https://azuremlexampledata.blob.core.windows.net/data/mnist/sample --input-type uri_folder --query name -o tsv)

일괄 처리 엔드포인트는 다른 위치에 있는 파일 또는 폴더 읽기를 지원합니다. 지원되는 형식과 이를 지정하는 방법에 대한 자세한 내용은 일괄 처리 엔드포인트 작업에서 데이터 액세스를 참조하세요.

일괄 처리 작업 실행 진행률 모니터링

일괄 처리 채점 작업은 일반적으로 전체 입력 집합을 처리하는 데 다소 시간이 소요됩니다.

다음 코드는 작업 상태를 확인하고 자세한 내용을 위해 Azure Machine Learning 스튜디오에 대한 링크를 출력합니다.

az ml job show -n $JOB_NAME --web

일괄 처리 채점 결과 확인

작업 출력은 클라우드 스토리지, 작업 영역의 기본 Blob Storage 또는 지정한 스토리지에 저장됩니다. 기본값을 변경하는 방법을 알아보려면 출력 위치 구성을 참조하세요. 작업이 완료될 때 Azure Storage Explorer에서 채점 결과를 보려면 다음 단계를 따르세요.

  1. Azure Machine Learning 스튜디오에서 일괄 처리 채점 작업을 열려면 다음 코드를 실행합니다. 작업 스튜디오 링크는 invoke의 응답에 interactionEndpoints.Studio.endpoint의 값으로 포함됩니다.

    az ml job show -n $JOB_NAME --web
    
  2. 작업 그래프에서 batchscoring 단계를 선택합니다.

  3. 출력 + 로그 탭을 선택한 다음, 데이터 출력 표시를 선택합니다.

  4. 데이터 출력에서 아이콘을 선택하여 Storage Explorer를 엽니다.

    보기 데이터 출력 위치를 보여 주는 Studio 스크린샷.

    Storage Explorer의 채점 결과는 다음 샘플 페이지와 비슷합니다.

    채점 결과 스크린샷.

출력 위치 구성

일괄 처리 채점 결과는 기본적으로 작업 이름(시스템에서 생성된 GUID)으로 이름이 지정된 폴더 내에 있는 작업 영역의 기본 Blob 저장소에 저장됩니다. 일괄 처리 엔드포인트를 호출할 때 채점 출력을 저장할 위치를 구성할 수 있습니다.

output-path를 사용하여 Azure Machine Learning에 등록된 데이터 저장소의 폴더를 구성합니다. --output-path의 구문은 폴더를 지정할 때의 --input, 즉 azureml://datastores/<datastore-name>/paths/<path-on-datastore>/와 동일합니다. --set output_file_name=<your-file-name>을 사용하여 새 출력 파일 이름을 구성합니다.

OUTPUT_FILE_NAME=predictions_`echo $RANDOM`.csv
OUTPUT_PATH="azureml://datastores/workspaceblobstore/paths/$ENDPOINT_NAME"

JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input https://azuremlexampledata.blob.core.windows.net/data/mnist/sample --output-path $OUTPUT_PATH --set output_file_name=$OUTPUT_FILE_NAME --query name -o tsv)

Warning

고유한 출력 위치를 사용해야 합니다. 출력 파일이 있으면 일괄 처리 채점 작업이 실패합니다.

Important

입력과 달리 출력은 Blob Storage 계정에서 실행되는 Azure Machine Learning 데이터 저장소에만 저장할 수 있습니다.

작업별 배포 구성 덮어쓰기

컴퓨팅 리소스를 최대한 활용하고 성능을 향상시키기 위해 일괄 처리 엔드포인트를 호출할 때 일부 설정을 덮어쓸 수 있습니다. 다음 설정은 작업별로 구성할 수 있습니다.

  • 인스턴스 수: 이 설정을 사용하여 컴퓨팅 클러스터에서 요청할 인스턴스 수를 덮어씁니다. 예를 들어 대량의 데이터 입력에 더 많은 인스턴스를 사용하여 엔드투엔드 일괄 처리 채점의 속도를 높일 수 있습니다.
  • 미니 일괄 처리 크기: 이 설정을 사용하여 각 미니 일괄 처리에 포함할 파일 수를 덮어씁니다. 미니 일괄 처리 수는 총 입력 파일 수 및 mini-batch 크기에 의해 결정됩니다. mini-batch 크기가 작을수록 더 작은 일괄 처리가 생성됩니다. 미니 일괄 처리는 병렬로 실행될 수 있지만 추가 예약 및 호출 오버헤드가 있을 수 있습니다.
  • 최대 다시 시도, 시간 제한오류 임계값과 같은 다른 설정은 덮어쓸 수 있습니다. 이러한 설정은 여러 워크로드의 엔드투엔드 일괄 처리 채점 시간에 영향을 줄 수 있습니다.
JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input https://azuremlexampledata.blob.core.windows.net/data/mnist/sample --mini-batch-size 20 --instance-count 5 --query name -o tsv)

엔드포인트에 배포 추가

배포가 포함된 일괄 처리 엔드포인트가 있으면 계속해서 모델을 구체화하고 새 배포를 추가할 수 있습니다. 일괄 처리 엔드포인트는 동일한 엔드포인트에서 새 모델을 개발하고 배포하는 동안 기본 배포를 계속 제공합니다. 배포는 서로에게 영향을 주지 않습니다.

이 예에서는 Keras 및 TensorFlow로 빌드된 모델을 사용하여 동일한 MNIST 문제를 해결하는 두 번째 배포를 추가합니다.

두 번째 배포 추가

  1. 일괄 처리 배포가 실행될 환경을 만듭니다. 코드를 실행하는 데 필요한 모든 종속성을 환경에 포함합니다. 일괄 처리 배포가 작동하려면 라이브러리 azureml-core도 추가해야 합니다. 다음 환경 정의에는 TensorFlow로 모델을 실행하는 데 필요한 라이브러리가 있습니다.

    환경 정의는 배포 정의 자체에 익명 환경으로 포함됩니다.

    environment:
      name: batch-tensorflow-py38
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    

    사용되는 conda 파일은 다음과 같습니다.

    deployment-keras/environment/conda.yaml

    name: tensorflow-env
    channels:
      - conda-forge
    dependencies:
      - python=3.8.5
      - pip
      - pip:
        - pandas
        - tensorflow
        - pillow
        - azureml-core
        - azureml-dataset-runtime[fuse]
    
  2. 모델에 대한 채점 스크립트 만들기:

    deployment-keras/code/batch_driver.py

    import os
    import numpy as np
    import pandas as pd
    import tensorflow as tf
    from typing import List
    from os.path import basename
    from PIL import Image
    from tensorflow.keras.models import load_model
    
    
    def init():
        global model
    
        # AZUREML_MODEL_DIR is an environment variable created during deployment
        model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")
    
        # load the model
        model = load_model(model_path)
    
    
    def run(mini_batch: List[str]) -> pd.DataFrame:
        print(f"Executing run method over batch of {len(mini_batch)} files.")
    
        results = []
        for image_path in mini_batch:
            data = Image.open(image_path)
            data = np.array(data)
            data_batch = tf.expand_dims(data, axis=0)
    
            # perform inference
            pred = model.predict(data_batch)
    
            # Compute probabilities, classes and labels
            pred_prob = tf.math.reduce_max(tf.math.softmax(pred, axis=-1)).numpy()
            pred_class = tf.math.argmax(pred, axis=-1).numpy()
    
            results.append(
                {
                    "file": basename(image_path),
                    "class": pred_class[0],
                    "probability": pred_prob,
                }
            )
    
        return pd.DataFrame(results)
    
  3. 배포 정의 만들기

    deployment-keras/deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json
    name: mnist-keras-dpl
    description: A deployment using Keras with TensorFlow to solve the MNIST classification dataset.
    endpoint_name: mnist-batch
    type: model
    model: 
      name: mnist-classifier-keras
      path: model
    code_configuration:
      code: code
      scoring_script: batch_driver.py
    environment:
      name: batch-tensorflow-py38
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    compute: azureml:batch-cluster
    resources:
      instance_count: 1
    settings:
      max_concurrency_per_instance: 2
      mini_batch_size: 10
      output_action: append_row
      output_file_name: predictions.csv
    
  4. 배포 만들기:

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

    az ml batch-deployment create --file deployment-keras/deployment.yml --endpoint-name $ENDPOINT_NAME
    

    이 경우 --set-default 매개 변수가 누락되었습니다. 프로덕션 시나리오의 모범 사례로, 새 배포를 기본값으로 설정하지 않고 만듭니다. 그런 다음 이를 확인하고 나중에 기본 배포를 업데이트합니다.

기본이 아닌 일괄 처리 배포 테스트

기본이 아닌 새 배포를 테스트하려면 실행할 배포의 이름을 알아야 합니다.

DEPLOYMENT_NAME="mnist-keras-dpl"
JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --deployment-name $DEPLOYMENT_NAME --input https://azuremlexampledata.blob.core.windows.net/data/mnist/sample --input-type uri_folder --query name -o tsv)

알림 --deployment-name은 실행할 배포를 지정하는 데 사용됩니다. 이 매개 변수를 사용하면 일괄 처리 엔드포인트의 기본 배포를 업데이트하지 않고 기본이 아닌 배포를 invoke할 수 있습니다.

기본 일괄 처리 배포 업데이트

엔드포인트 내에서 특정 배포를 호출할 수 있지만 일반적으로 엔드포인트 자체를 호출하고 엔드포인트에서 사용할 배포(기본 배포)를 결정하도록 합니다. 엔드포인트를 호출하는 사용자와의 계약을 변경하지 않고도 기본 배포를 변경할 수 있으므로 배포를 제공하는 모델을 변경할 수 있습니다. 다음 코드를 사용하여 기본 배포를 업데이트합니다.

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

일괄 처리 엔드포인트 및 배포 삭제

이전 일괄 처리 배포를 사용하지 않을 경우 다음 코드를 실행하여 삭제하세요. 삭제를 확인하려면 --yes를 사용합니다.

az ml batch-deployment delete --name mnist-torch-dpl --endpoint-name $ENDPOINT_NAME --yes

일괄 처리 엔드포인트와 모든 기본 배포를 삭제하려면 다음 코드를 실행합니다. 일괄 처리 채점 작업은 삭제되지 않습니다.

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