일괄 채점을 위해 REST를 사용하여 모델 배포

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

Azure Machine Learning REST API를 사용하여 일괄 처리 채점 모델을 배포하는 방법에 대해 알아봅니다.

REST API는 표준 HTTP 동사를 사용하여 리소스를 만들고, 검색하고, 업데이트하고, 삭제합니다. REST API는 HTTP 요청을 만들 수 있는 모든 언어 또는 도구에서 작동합니다. REST는 구조가 간단하기 때문에 스크립팅 환경 및 MLOps 자동화에 적합합니다.

이 문서에서는 새 REST API를 사용하여 다음 작업을 수행하는 방법을 알아봅니다.

  • 기계 학습 자산 만들기
  • 일괄 처리 엔드포인트 및 일괄 처리 배포 만들기
  • 일괄 처리 엔드포인트를 호출하여 일괄 처리 채점 작업 시작

사전 요구 사항

중요

이 문서의 코드 조각에서는 Bash 셸을 사용한다고 가정합니다.

코드 조각은 AzureML 예제 리포지토리/cli/batch-score-rest.sh 파일에서 가져옵니다.

엔드포인트 이름 설정

참고

일괄 처리 엔드포인트 이름은 Azure 지역 수준에서 고유해야 합니다. 예를 들어 westus2에는 mybatchendpoint라는 일괄 처리 엔드포인트가 하나만 있을 수 있습니다.

export ENDPOINT_NAME=endpt-`echo $RANDOM`

Azure Machine Learning 일괄 처리 엔드포인트

일괄 처리 엔드포인트는 일괄 처리 채점을 위해 모델을 호스트하는 프로세스를 간소화하므로 인프라가 아닌 기계 학습에 집중할 수 있습니다. 이 문서에서는 일괄 처리 엔드포인트 및 배포를 만들고 이를 호출하여 일괄 처리 채점 작업을 시작합니다. 그러나 먼저 모델, 코드 및 환경을 포함하여 배포에 필요한 자산을 등록해야 합니다.

Azure CLI를 포함하고 시각적으로 스튜디오를 사용하여 Azure Machine Learning 일괄 처리 엔드포인트를 만드는 방법에는 여러 가지가 있습니다. 다음 예제에서는 REST API를 사용하여 일괄 처리 엔드포인트 및 일괄 처리 배포를 만듭니다.

기계 학습 자산 만들기

먼저 Azure Machine Learning 자산을 설정하여 작업을 구성합니다.

다음 REST API 호출에서는 SUBSCRIPTION_ID, RESOURCE_GROUP, LOCATIONWORKSPACE를 자리 표시자로 사용합니다. 자리 표시자를 고유한 값으로 바꿉니다.

관리 REST는 서비스 사용자 인증 토큰을 요청합니다. TOKEN을 고유한 값으로 바꿉니다. 다음 명령을 사용하여 이 토큰을 검색할 수 있습니다.

TOKEN=$(az account get-access-token --query accessToken -o tsv)

서비스 공급자는 api-version 인수를 사용하여 호환성을 보장합니다. api-version 인수는 서비스마다 다릅니다. 이후 버전을 수용할 수 있도록 API 버전을 변수로 설정합니다.

API_VERSION="2022-05-01"

컴퓨팅 만들기

일괄 처리 채점은 로컬이 아닌 클라우드 컴퓨팅 리소스에서만 실행됩니다. 클라우드 컴퓨팅 리소스는 일괄 처리 채점 워크플로를 실행할 수 있는 재사용 가능한 가상 컴퓨터 클러스터입니다.

다음과 같이 컴퓨팅 클러스터를 만듭니다.

response=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/computes/batch-cluster?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
    \"properties\":{
        \"computeType\": \"AmlCompute\",
        \"properties\": {
            \"osType\": \"Linux\",
            \"vmSize\": \"STANDARD_D2_V2\",
            \"scaleSettings\": {
                \"maxNodeCount\": 5,
                \"minNodeCount\": 0
            },
            \"remoteLoginPortPublicAccess\": \"NotSpecified\"
        },
    },
    \"location\": \"$LOCATION\"
}")

기존 컴퓨팅을 대신 사용하려면 일괄 처리 배포를 만들 때 전체 Azure Resource Manager ID를 지정해야 합니다. 전체 ID는 형식 /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/computes/<your-compute-name>을 사용합니다.

스토리지 계정 세부 정보 가져오기

모델 및 코드를 등록하려면 먼저 스토리지 계정에 업로드해야 합니다. 스토리지 계정의 세부 정보는 데이터 저장소에서 확인할 수 있습니다. 이 예제에서는 작업 영역에 대한 기본 데이터 저장소 및 Azure Storage 계정을 가져옵니다. GET 요청을 통해 작업 영역을 쿼리하여 정보가 포함된 JSON 파일을 가져옵니다.

jq 도구를 사용하여 JSON 결과를 구문 분석하고 필요한 값을 얻을 수 있습니다. Azure Portal을 사용하여 동일한 정보를 찾을 수도 있습니다.

# Get values for storage account
response=$(curl --location --request GET "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/datastores?api-version=$API_VERSION&isDefault=true" \
--header "Authorization: Bearer $TOKEN")
DATASTORE_PATH=$(echo $response | jq -r '.value[0].id')
BLOB_URI_PROTOCOL=$(echo $response | jq -r '.value[0].properties.protocol')
BLOB_URI_ENDPOINT=$(echo $response | jq -r '.value[0].properties.endpoint')
AZUREML_DEFAULT_DATASTORE=$(echo $response | jq -r '.value[0].name')
AZUREML_DEFAULT_CONTAINER=$(echo $response | jq -r '.value[0].properties.containerName')
AZURE_STORAGE_ACCOUNT=$(echo $response | jq -r '.value[0].properties.accountName')
export AZURE_STORAGE_ACCOUNT $(echo $AZURE_STORAGE_ACCOUNT)
STORAGE_RESPONSE=$(echo az storage account show-connection-string --name $AZURE_STORAGE_ACCOUNT)
AZURE_STORAGE_CONNECTION_STRING=$($STORAGE_RESPONSE | jq -r '.connectionString')

BLOB_URI_ROOT="$BLOB_URI_PROTOCOL://$AZURE_STORAGE_ACCOUNT.blob.$BLOB_URI_ENDPOINT/$AZUREML_DEFAULT_CONTAINER"

코드 업로드 및 등록

이제 데이터 저장소가 생겼으므로 채점 스크립트를 업로드할 수 있습니다. 채점 스크립트를 작성하는 방법에 대한 자세한 내용은 채점 스크립트 이해를 참조하세요. Azure Storage CLI를 사용하여 Blob을 기본 컨테이너에 업로드합니다.

az storage blob upload-batch -d $AZUREML_DEFAULT_CONTAINER/score -s endpoints/batch/mnist/code/  --connection-string $AZURE_STORAGE_CONNECTION_STRING

Azure Portal 또는 Azure Storage Explorer와 같은 다른 방법을 사용하여 업로드할 수도 있습니다.

코드를 업로드한 후에는 PUT 요청을 통해 코드를 지정할 수 있습니다.

response=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/codes/score-mnist/versions/1?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
  \"properties\": {
    \"description\": \"Score code\",
    \"codeUri\": \"$BLOB_URI_ROOT/score\"
  }
}")

모델 업로드 및 등록

코드와 마찬가지로 모델 파일을 업로드합니다.

az storage blob upload-batch -d $AZUREML_DEFAULT_CONTAINER/model -s endpoints/batch/mnist/model  --connection-string $AZURE_STORAGE_CONNECTION_STRING

이제 모델을 등록합니다.

response=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/models/mnist/versions/1?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
    \"properties\": {
        \"modelUri\":\"azureml://subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/workspaces/$WORKSPACE/datastores/$AZUREML_DEFAULT_DATASTORE/paths/model\"
    }
}")

환경 만들기

필요한 종속성이 있는 환경에서 배포를 실행해야 합니다. PUT 요청을 사용하여 환경을 만듭니다. Microsoft Container Registry의 docker 이미지 사용 image를 사용하여 docker 이미지를 구성하고 condaFile을 사용하여 conda 종속성을 추가할 수 있습니다.

다음 코드를 실행하여 json에 정의된 condaFile을 읽습니다. 소스 파일은 예제 리포지토리의 /cli/endpoints/batch/mnist/environment/conda.json에 있습니다.

CONDA_FILE=$(cat endpoints/batch/mnist/environment/conda.json | sed 's/"/\\"/g')

이제 다음 조각을 실행하여 환경을 만듭니다.

ENV_VERSION=$RANDOM
response=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/environments/mnist-env/versions/$ENV_VERSION?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
    \"properties\":{
        \"condaFile\": $(echo \"$CONDA_FILE\"),
        \"image\": \"mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:latest\"
    }
}")

일괄 처리 엔드포인트를 통해 배포

다음으로 일괄 처리 엔드포인트, 일괄 처리 배포를 만들고 엔드포인트에 대한 기본 배포를 설정합니다.

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

다음과 같이 일괄 처리 엔드포인트를 만듭니다.

response=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/batchEndpoints/$ENDPOINT_NAME?api-version=$API_VERSION" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $TOKEN" \
--data-raw "{
    \"properties\": {
        \"authMode\": \"aadToken\"
    },
    \"location\": \"$LOCATION\"
}")

일괄 처리 배포 만들기

다음과 같이 엔드포인트에서 일괄 처리 배포를 만듭니다.

DEPLOYMENT_NAME="nonmlflowedp"
response=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/batchEndpoints/$ENDPOINT_NAME/deployments/$DEPLOYMENT_NAME?api-version=$API_VERSION" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $TOKEN" \
--data-raw "{
    \"location\": \"$LOCATION\",
    \"properties\": {        
        \"model\": {
            \"referenceType\": \"Id\",
            \"assetId\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/models/mnist/versions/1\"
        },
        \"codeConfiguration\": {
            \"codeId\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/codes/score-mnist/versions/1\",
            \"scoringScript\": \"digit_identification.py\"
        },
        \"environmentId\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/environments/mnist-env/versions/$ENV_VERSION\",
        \"compute\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/computes/batch-cluster\",
        \"resources\": {
            \"instanceCount\": 1
        },
        \"maxConcurrencyPerInstance\": \"4\",
        \"retrySettings\": {
            \"maxRetries\": 3,
            \"timeout\": \"PT30S\"
        },
        \"errorThreshold\": \"10\",
        \"loggingLevel\": \"info\",
        \"miniBatchSize\": \"5\",
    }
}")

엔드포인트에서 기본 일괄 처리 배포 설정

하나의 엔드포인트 아래에는 하나의 기본 일괄 처리 배포만 있으며, 일괄 처리 채점 작업을 실행하기 위해 호출할 때 사용됩니다.

response=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/batchEndpoints/$ENDPOINT_NAME?api-version=$API_VERSION" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $TOKEN" \
--data-raw "{
    \"properties\": {
        \"authMode\": \"aadToken\",
        \"defaults\": {
            \"deploymentName\": \"$DEPLOYMENT_NAME\"
        }
    },
    \"location\": \"$LOCATION\"
}")

operation_id=$(echo $response | jq -r '.properties' | jq -r '.properties' | jq -r '.AzureAsyncOperationUri')
wait_for_completion $operation_id $TOKEN

일괄 처리 채점 실행

일괄 처리 엔드포인트를 호출하면 일괄 처리 채점 작업이 트리거됩니다. 작업 id가 응답에 반환되어 일괄 처리 채점 진행 상황을 추적하는 데 사용할 수 있습니다. 다음 조각에서 jq는 작업 id를 가져오는 데 사용됩니다.

일괄 처리 엔드포인트를 호출하여 일괄 처리 채점 작업 시작

채점 URI 및 액세스 토큰 가져오기

일괄 처리 엔드포인트를 호출하기 위한 채점 URI 및 액세스 토큰을 가져옵니다. 먼저 채점 URI를 가져옵니다.

response=$(curl --location --request GET "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/batchEndpoints/$ENDPOINT_NAME?api-version=$API_VERSION" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $TOKEN")

SCORING_URI=$(echo $response | jq -r '.properties.scoringUri')

다음과 같이 일괄 처리 엔드포인트 액세스 토큰을 가져옵니다.

SCORING_TOKEN=$(az account get-access-token --resource https://ml.azure.com --query accessToken -o tsv)

여러 입력 옵션을 통해 일괄 처리 엔드포인트 호출

일괄 처리 엔드포인트를 호출하여 일괄 처리 채점 작업을 시작할 차례입니다. 데이터가 웹에서 공개적으로 사용할 수 있는 폴더(여러 파일이 있을 수 있음)인 경우 다음 코드 조각을 사용할 수 있습니다.

response=$(curl --location --request POST $SCORING_URI \
--header "Authorization: Bearer $SCORING_TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
    \"properties\": {
    	\"InputData\": {
    		\"mnistinput\": {
    			\"JobInputType\" : \"UriFolder\",
    			\"Uri\":  \"https://pipelinedata.blob.core.windows.net/sampledata/mnist\"
    		}
        }
    }
}")

JOB_ID=$(echo $response | jq -r '.id')
JOB_ID_SUFFIX=$(echo ${JOB_ID##/*/})

이제 일괄 처리 엔드포인트를 호출하는 다른 옵션을 살펴보겠습니다. 입력 데이터와 관련하여 입력 형식(폴더 또는 단일 파일을 지정하는지 여부) 및 URI 형식(Azure Machine Learning에 등록된 데이터 저장소의 경로를 사용하는지 여부, Azure Machine Learning에 등록된 V2 데이터 자산에 대한 참조 또는 퍼블릭 URI)에 따라 선택할 수 있는 여러 시나리오가 있습니다.

  • InputData 속성에는 JobInputTypeUri 키가 있습니다. 단일 파일을 지정하는 경우 "JobInputType": "UriFile"을 사용하고. 폴더를 지정하는 경우 'JobInputType": "UriFolder"를 사용합니다.

  • 파일 또는 폴더가 Azure ML에 등록된 데이터 저장소에 있는 경우 Uri의 구문은 폴더의 경우 azureml://datastores/<datastore-name>/paths/<path-on-datastore>이고 특정 파일의 경우 azureml://datastores/<datastore-name>/paths/<path-on-datastore>/<file-name>입니다. 더 긴 형식을 사용하여 동일한 경로를 나타낼 수도 있습니다(예: azureml://subscriptions/<subscription_id>/resourceGroups/<resource-group-name>/workspaces/<workspace-name>/datastores/<datastore-name>/paths/<path-on-datastore>/).

  • 파일 또는 폴더가 uri_folder 또는 uri_file과 같은 V2 데이터 자산으로 등록된 경우 Uri의 구문은 \"azureml://data/<data-name>/versions/<data-version>/\"(짧은 형식) 또는 \"azureml://subscriptions/<subscription_id>/resourceGroups/<resource-group-name>/workspaces/<workspace-name>/data/<data-name>/versions/<data-version>/\"(긴 형식)입니다.

  • 파일 또는 폴더가 공개적으로 액세스할 수 있는 경로인 경우 URI의 구문은 폴더의 경우 https://<public-path>이고 특정 파일의 경우 https://<public-path>/<file-name>입니다.

참고

데이터 URI에 대한 자세한 내용은 Azure Machine Learning 데이터 참조 URI를 참조하세요.

다양한 형식의 입력 데이터를 사용하는 몇 가지 예제는 아래와 같습니다.

  • 데이터가 Azure ML에 등록된 데이터 저장소의 폴더인 경우 다음 중 하나를 수행할 수 있습니다.

    • 짧은 형식을 사용하여 URI를 나타냅니다.
    response=$(curl --location --request POST $SCORING_URI \
    --header "Authorization: Bearer $SCORING_TOKEN" \
    --header "Content-Type: application/json" \
    --data-raw "{
        \"properties\": {
            \"InputData\": {
                \"mnistInput\": {
                    \"JobInputType\" : \"UriFolder\",
                    \"Uri": \"azureml://datastores/workspaceblobstore/paths/$ENDPOINT_NAME/mnist\"
                }
            }
        }
    }")
    
    JOB_ID=$(echo $response | jq -r '.id')
    JOB_ID_SUFFIX=$(echo ${JOB_ID##/*/})
    
    • 또는 긴 형식을 동일한 URI에 사용합니다.
    response=$(curl --location --request POST $SCORING_URI \
    --header "Authorization: Bearer $SCORING_TOKEN" \
    --header "Content-Type: application/json" \
    --data-raw "{
        \"properties\": {
        	\"InputData\": {
        		\"mnistinput\": {
        			\"JobInputType\" : \"UriFolder\",
        			\"Uri\": \"azureml://subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/workspaces/$WORKSPACE/datastores/workspaceblobstore/paths/$ENDPOINT_NAME/mnist\"
        		}
            }
        }
    }")
    
    JOB_ID=$(echo $response | jq -r '.id')
    JOB_ID_SUFFIX=$(echo ${JOB_ID##/*/})
    
  • 데이터를 uri_folder과 같은 Azure ML에 등록된 V2 데이터 자산으로 관리하려면 아래 두 단계를 수행할 수 있습니다.

    1. V2 데이터 자산을 만듭니다.
    DATA_NAME="mnist"
    DATA_VERSION=$RANDOM
    
    response=$(curl --location --request PUT https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/data/$DATA_NAME/versions/$DATA_VERSION?api-version=$API_VERSION \
    --header "Content-Type: application/json" \
    --header "Authorization: Bearer $TOKEN" \
    --data-raw "{
        \"properties\": {
            \"dataType\": \"uri_folder\",
      \"dataUri\": \"https://pipelinedata.blob.core.windows.net/sampledata/mnist\",
      \"description\": \"Mnist data asset\"
        }
    }")
    
    1. 일괄 처리 채점 작업에서 데이터 자산을 참조합니다.
    response=$(curl --location --request POST $SCORING_URI \
    --header "Authorization: Bearer $SCORING_TOKEN" \
    --header "Content-Type: application/json" \
    --data-raw "{
        \"properties\": {
            \"InputData\": {
                \"mnistInput\": {
                    \"JobInputType\" : \"UriFolder\",
                    \"Uri": \"azureml://data/$DATA_NAME/versions/$DATA_VERSION/\"
                }
            }
        }
    }")
    
    JOB_ID=$(echo $response | jq -r '.id')
    JOB_ID_SUFFIX=$(echo ${JOB_ID##/*/})
    
  • 데이터가 웹에서 공개적으로 사용할 수 있는 단일 파일인 경우 다음 코드 조각을 사용할 수 있습니다.

    response=$(curl --location --request POST $SCORING_URI \
    --header "Authorization: Bearer $SCORING_TOKEN" \
    --header "Content-Type: application/json" \
    --data-raw "{
        \"properties\": {
            \"InputData\": {
                \"mnistInput\": {
                    \"JobInputType\" : \"UriFile\",
                    \"Uri": \"https://pipelinedata.blob.core.windows.net/sampledata/mnist/0.png\"
                }
            }
        }
    }")
    
    JOB_ID=$(echo $response | jq -r '.id')
    JOB_ID_SUFFIX=$(echo ${JOB_ID##/*/})
    

참고

최신 REST API 버전을 일괄 처리 채점에 사용하는 것이 좋습니다.

  • 로컬 데이터를 사용하려는 경우 Azure Machine Learning에 등록된 데이터 저장소에 업로드하고 클라우드용 REST API 데이터를 사용할 수 있습니다.
  • 기존 V1 FileDataset를 일괄 처리 엔드포인트에 사용하는 경우 V2 데이터 자산으로 마이그레이션하고 일괄 처리 엔드포인트를 호출할 때 직접 참조하는 것이 좋습니다. 현재 uri_folder 또는 uri_file 형식의 데이터 자산만 지원됩니다. GA CLIv2(2.4.0 이상) 또는 GA REST API(2022-05-01 이상)를 사용하여 만든 Batch 엔드포인트는 V1 데이터 세트를 지원하지 않습니다.
  • --query 매개 변수가 있는 az ml dataset show 명령을 사용하여 V1 FileDataset에서 추출한 데이터 저장소의 URI 또는 ​​경로를 추출하고 해당 정보를 호출에 사용할 수도 있습니다.
  • 이전 API를 사용하여 만든 Batch 엔드포인트는 V1 FileDataset를 계속 지원하지만, 더 많은 유용성과 유연성을 위해 최신 API 버전을 사용하여 V2 데이터 자산 지원을 추가할 예정입니다. V2 데이터 자산에 대한 자세한 내용은 SDK v2를 사용하여 데이터 작업(미리 보기)을 참조하세요. 새 V2 환경에 대한 자세한 내용은 v2란?을 참조하세요.

출력 위치 구성 및 설정 덮어쓰기

일괄 처리 채점 결과는 기본적으로 작업 이름(시스템에서 생성된 GUID)으로 이름이 지정된 폴더 내에 있는 작업 영역의 기본 Blob 저장소에 저장됩니다. 일괄 처리 엔드포인트를 호출할 때 채점 출력을 저장할 위치를 구성할 수 있습니다. OutputData를 사용하여 Azure Machine Learning에 등록된 데이터 저장소의 출력 파일 경로를 구성합니다. OutputData에는 JobOutputTypeUri 키가 있습니다. UriFile은 유일하게 JobOutputType에 지원되는 값입니다. Uri의 구문은 InputData의 구문, 즉 azureml://datastores/<datastore-name>/paths/<path-on-datastore>/<file-name>와 동일합니다.

일괄 처리 채점 결과의 출력 위치를 구성하는 코드 조각의 예제는 다음과 같습니다.

response=$(curl --location --request POST $SCORING_URI \
--header "Authorization: Bearer $SCORING_TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
    \"properties\": {
        \"InputData\":
        {
            \"mnistInput\": {
                \"JobInputType\" : \"UriFolder\",
                \"Uri": \"azureml://datastores/workspaceblobstore/paths/$ENDPOINT_NAME/mnist\"
            }
        },
        \"OutputData\":
        {
            \"mnistOutput\": {
                \"JobOutputType\": \"UriFile\",
                \"Uri\": \"azureml://datastores/workspaceblobstore/paths/$ENDPOINT_NAME/mnistOutput/$OUTPUT_FILE_NAME\"
            }
        }
    }
}")

JOB_ID=$(echo $response | jq -r '.id')
JOB_ID_SUFFIX=$(echo ${JOB_ID##/*/})

중요

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

일괄 처리 채점 작업 확인

일괄 처리 채점 작업은 일반적으로 전체 입력 집합을 처리하는 데 다소 시간이 소요됩니다. 작업 상태를 모니터링하고 완료된 후에 결과를 확인합니다.

이 예제에서는 일괄 처리 엔드포인트의 기본 배포를 호출합니다. 기본이 아닌 배포를 호출하려면 azureml-model-deployment HTTP 헤더를 사용하고 값을 배포 이름으로 설정합니다. 예를 들어 curl에서 --header "azureml-model-deployment: $DEPLOYMENT_NAME" 매개 변수를 사용합니다.

wait_for_completion $SCORING_URI/$JOB_ID_SUFFIX $SCORING_TOKEN

일괄 처리 채점 결과 확인

결과를 확인하는 방법에 대한 내용은 일괄 처리 채점 결과 확인을 참조하세요.

일괄 처리 엔드포인트 삭제

일괄 처리 엔드포인트를 사용하지 않을 경우 아래 명령을 사용하여 삭제해야 합니다(일괄 처리 엔드포인트 및 모든 기본 배포 삭제).

curl --location --request DELETE "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/batchEndpoints/$ENDPOINT_NAME?api-version=$API_VERSION" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $TOKEN" || true

다음 단계