REST로 모델 배포
이 문서에서는 Azure Machine Learning REST API를 사용하여 온라인 엔드포인트를 사용하여 모델을 배포하는 방법을 설명합니다. 온라인 엔드포인트를 사용하면 기본 인프라 및 Kubernetes 클러스터를 만들고 관리할 필요 없이 모델을 배포할 수 있습니다. 다음 절차에서는 온라인 엔드포인트와 배포를 만들고, 엔드포인트를 호출하여 유효성을 검사하는 방법을 보여 줍니다.
Azure Machine Learning 온라인 엔드포인트를 만드는 방법에는 여러 가지가 있습니다. Azure CLI, Azure Machine Learning 스튜디오 또는 REST API를 사용할 수 있습니다. REST API는 표준 HTTP 동사를 사용하여 리소스를 만들고, 검색하고, 업데이트하고, 삭제합니다. HTTP 요청을 할 수 있는 모든 언어나 도구에서 작동합니다. REST API는 구조가 간단하여 스크립팅 환경과 기계 학습 작업 자동화에 적합한 선택입니다.
필수 조건
본인에게 관리 권한이 있는 Azure 구독 이러한 구독이 없는 경우 평가판 또는 유료 개인 구독을 사용해 보세요.
작업 영역의 서비스 주체. 관리 REST 요청은 서비스 사용자 인증을 사용합니다.
서비스 주체 인증 토큰. 서비스 주체 인증 토큰 검색의 단계에 따라 토큰을 가져올 수 있습니다.
curl 유틸리티.
모든 Microsoft Windows 10 및 Windows 11 설치에는 기본적으로 curl이 설치되어 있습니다. PowerShell에서 curl은 Invoke-WebRequest의 별칭으로,
curl -d "key=val" -X POST uri
는Invoke-WebRequest -Body "key=val" -Method POST -Uri uri
가 됩니다.UNIX 플랫폼의 경우 curl 프로그램은 Linux용 Windows 하위 시스템 또는 모든 UNIX 배포판에서 사용할 수 있습니다.
엔드포인트 이름 설정
엔드포인트 이름은 Azure 지역 수준에서 고유해야 합니다. my-endpoint와 같은 엔드포인트 이름은 지정된 지역 내에서 해당 이름을 갖는 유일한 엔드포인트여야 합니다.
RANDOM
유틸리티를 호출하여 고유한 엔드포인트 이름을 만듭니다. 이 이름에 값 endpt-rest
에 접미사로 난수가 추가됩니다.
export ENDPOINT_NAME=endpt-rest-`echo $RANDOM`
기계 학습 자산 만들기
배포를 준비하려면 Azure Machine Learning 자산을 설정하고 작업을 구성합니다. 모델, 코드, 환경 등 배포에 필요한 자산을 등록합니다.
팁
다음 프로시저의 REST API 호출은 일부 인수에 대한 자리 표시자로 $SUBSCRIPTION_ID
, $RESOURCE_GROUP
, $LOCATION
(지역) 및 Azure Machine Learning $WORKSPACE
를 사용합니다. 배포에 대한 코드를 구현할 때 인수 자리 표시자를 특정 배포 값으로 바꿉니다.
관리 REST는 서비스 사용자 인증 토큰을 요청합니다. 배포에 대한 코드를 구현할 때 $TOKEN
자리 표시자의 인스턴스를 배포에 대한 서비스 주체 토큰으로 바꿉니다. 다음 명령을 사용하여 이 토큰을 검색할 수 있습니다.
response=$(curl -H "Content-Length: 0" --location --request POST "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/onlineEndpoints/$ENDPOINT_NAME/token?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN")
accessToken=$(echo $response | jq -r '.accessToken')
서비스 공급자는 api-version
인수를 사용하여 호환성을 보장합니다. api-version
인수는 서비스마다 다릅니다.
향후 버전을 수용하려면 API_version
변수를 설정합니다.
API_VERSION="2022-05-01"
스토리지 계정 세부 정보 가져오기
모델과 코드를 등록하려면 먼저 이러한 항목을 Azure Storage 계정에 업로드해야 합니다. Azure Storage 계정의 세부 정보는 데이터 저장소에서 사용할 수 있습니다. 이 예에서는 작업 영역에 대한 기본 데이터 저장소 및 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")
AZUREML_DEFAULT_DATASTORE=$(echo $response | jq -r '.value[0].name')
AZUREML_DEFAULT_CONTAINER=$(echo $response | jq -r '.value[0].properties.containerName')
export AZURE_STORAGE_ACCOUNT=$(echo $response | jq -r '.value[0].properties.accountName')
코드 업로드 및 등록
이제 데이터 저장소가 생겼으니 채점 스크립트를 업로드할 수 있습니다. Azure Storage CLI를 사용하여 Blob을 기본 컨테이너에 업로드합니다.
az storage blob upload-batch -d $AZUREML_DEFAULT_CONTAINER/score -s endpoints/online/model-1/onlinescoring
팁
Azure Portal이나 Azure Storage Explorer와 같은 다른 방법을 사용하여 업로드를 완료할 수 있습니다.
코드를 업로드한 후 PUT 요청으로 코드를 지정하고 datastoreId
식별자로 데이터 저장소를 참조할 수 있습니다.
curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/codes/score-sklearn/versions/1?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
\"properties\": {
\"codeUri\": \"https://$AZURE_STORAGE_ACCOUNT.blob.core.windows.net/$AZUREML_DEFAULT_CONTAINER/score\"
}
}"
모델 업로드 및 등록
비슷한 REST API 호출로 모델 파일을 업로드합니다.
az storage blob upload-batch -d $AZUREML_DEFAULT_CONTAINER/model -s endpoints/online/model-1/model
업로드가 완료되면 모델을 등록합니다.
curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/models/sklearn/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 이미지를 사용합니다. docker
명령으로 Docker 이미지를 구성하고 condaFile
명령으로 conda 종속성을 추가할 수 있습니다.
다음 코드는 Conda 환경(YAML 파일)의 콘텐츠를 환경 변수로 읽어옵니다.
ENV_VERSION=$RANDOM
curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/environments/sklearn-env/versions/$ENV_VERSION?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
\"properties\":{
\"condaFile\": \"$CONDA_FILE\",
\"image\": \"mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:20210727.v1\"
}
}"
엔드포인트 만들기
온라인 엔드포인트를 만듭니다.
response=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/onlineEndpoints/$ENDPOINT_NAME?api-version=$API_VERSION" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $TOKEN" \
--data-raw "{
\"identity\": {
\"type\": \"systemAssigned\"
},
\"properties\": {
\"authMode\": \"AMLToken\"
},
\"location\": \"$LOCATION\"
}")
배포 만들기
엔드포인트 아래에 배포를 만듭니다.
response=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/onlineEndpoints/$ENDPOINT_NAME/deployments/blue?api-version=$API_VERSION" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $TOKEN" \
--data-raw "{
\"location\": \"$LOCATION\",
\"sku\": {
\"capacity\": 1,
\"name\": \"default\"
},
\"properties\": {
\"endpointComputeType\": \"Managed\",
\"instanceType\": \"Standard_DS3_v2\",
\"model\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/models/sklearn/versions/1\",
\"codeConfiguration\": {
\"codeId\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/codes/score-sklearn/versions/1\",
\"scoringScript\": \"score.py\"
},
\"environmentId\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/environments/sklearn-env/versions/$ENV_VERSION\"
}
}")
모델로 데이터 점수를 매기기 위해 엔드포인트 호출
배포 엔드포인트를 호출하려면 채점 URI와 액세스 토큰이 필요합니다.
먼저 채점 URI를 가져옵니다.
response=$(curl --location --request GET "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/onlineEndpoints/$ENDPOINT_NAME?api-version=$API_VERSION" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $TOKEN")
scoringUri=$(echo $response | jq -r '.properties.scoringUri')
다음으로, 엔드포인트 액세스 토큰을 가져옵니다.
response=$(curl -H "Content-Length: 0" --location --request POST "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/onlineEndpoints/$ENDPOINT_NAME/token?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN")
accessToken=$(echo $response | jq -r '.accessToken')
마지막으로 curl 유틸리티를 사용하여 엔드포인트를 호출합니다.
curl --location --request POST $scoringUri \
--header "Authorization: Bearer $accessToken" \
--header "Content-Type: application/json" \
--data-raw @endpoints/online/model-1/sample-request.json
배포 로그 확인
배포 로그를 확인합니다.
curl --location --request POST "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/onlineEndpoints/$ENDPOINT_NAME/deployments/blue/getLogs?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{ \"tail\": 100 }"
엔드포인트 삭제
배포를 더 이상 사용하지 않을 경우 리소스를 삭제합니다.
다음 명령을 실행하면 엔드포인트와 모든 기본 배포가 삭제됩니다.
curl --location --request DELETE "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/onlineEndpoints/$ENDPOINT_NAME?api-version=$API_VERSION" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $TOKEN" || true