193 строки
8.3 KiB
Bash
Executable File
193 строки
8.3 KiB
Bash
Executable File
set -x
|
|
|
|
# <create_variables>
|
|
SUBSCRIPTION_ID=$(az account show --query id -o tsv)
|
|
LOCATION=$(az ml workspace show --query location -o tsv)
|
|
RESOURCE_GROUP=$(az group show --query name -o tsv)
|
|
WORKSPACE=$(az configure -l --query "[?name=='workspace'].value" -o tsv)
|
|
|
|
#</create_variables>
|
|
|
|
#<get_access_token>
|
|
TOKEN=$(az account get-access-token --query accessToken -o tsv)
|
|
#</get_access_token>
|
|
|
|
# <set_endpoint_name>
|
|
export ENDPOINT_NAME=endpt-rest-`echo $RANDOM`
|
|
# </set_endpoint_name>
|
|
|
|
#<api_version>
|
|
API_VERSION="2022-05-01"
|
|
#</api_version>
|
|
|
|
echo "Using:\nSUBSCRIPTION_ID: $SUBSCRIPTION_ID\nLOCATION: $LOCATION\nRESOURCE_GROUP: $RESOURCE_GROUP\nWORKSPACE: $WORKSPACE\nENDPOINT_NAME: $ENDPOINT_NAME"
|
|
|
|
# define how to wait
|
|
wait_for_completion () {
|
|
operation_id=$1
|
|
status="unknown"
|
|
|
|
if [[ $operation_id == "" || -z $operation_id || $operation_id == "null" ]]; then
|
|
echo "operation id cannot be empty"
|
|
exit 1
|
|
fi
|
|
|
|
while [[ $status != "Succeeded" && $status != "Failed" ]]
|
|
do
|
|
echo "Getting operation status from: $operation_id"
|
|
operation_result=$(curl --location --request GET $operation_id --header "Authorization: Bearer $TOKEN")
|
|
# TODO error handling here
|
|
status=$(echo $operation_result | jq -r '.status')
|
|
echo "Current operation status: $status"
|
|
sleep 5
|
|
done
|
|
|
|
if [[ $status == "Failed" ]]
|
|
then
|
|
error=$(echo $operation_result | jq -r '.error')
|
|
echo "Error: $error"
|
|
fi
|
|
}
|
|
|
|
# <get_storage_details>
|
|
# 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')
|
|
# </get_storage_details>
|
|
|
|
# TODO: we can get the default container from listing datastores
|
|
# TODO using the latter two as env vars shouldn't be necessary
|
|
|
|
# <upload_code>
|
|
az storage blob upload-batch -d $AZUREML_DEFAULT_CONTAINER/score -s endpoints/online/model-1/onlinescoring
|
|
# </upload_code>
|
|
|
|
# <create_code>
|
|
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\"
|
|
}
|
|
}"
|
|
# </create_code>
|
|
|
|
# <upload_model>
|
|
az storage blob upload-batch -d $AZUREML_DEFAULT_CONTAINER/model -s endpoints/online/model-1/model
|
|
# </upload_model>
|
|
|
|
# <create_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\"
|
|
}
|
|
}"
|
|
# </create_model>
|
|
|
|
# <read_condafile>
|
|
CONDA_FILE=$(cat endpoints/online/model-1/environment/conda.yaml)
|
|
# <read_condafile>
|
|
|
|
# <create_environment>
|
|
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\"
|
|
}
|
|
}"
|
|
# </create_environment>
|
|
|
|
#<create_endpoint>
|
|
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\"
|
|
}")
|
|
#</create_endpoint>
|
|
|
|
echo "Endpoint response: $response"
|
|
operation_id=$(echo $response | jq -r '.properties.properties.AzureAsyncOperationUri')
|
|
wait_for_completion $operation_id
|
|
|
|
# <create_deployment>
|
|
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\": \"Standard_DS2_v2\"
|
|
},
|
|
\"properties\": {
|
|
\"endpointComputeType\": \"Managed\",
|
|
\"scaleSettings\": {
|
|
\"scaleType\": \"Default\"
|
|
},
|
|
\"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\"
|
|
}
|
|
}")
|
|
#</create_deployment>
|
|
|
|
echo "Endpoint response: $response"
|
|
operation_id=$(echo $response | jq -r '.properties.properties.AzureAsyncOperationUri')
|
|
wait_for_completion $operation_id
|
|
|
|
# <get_endpoint>
|
|
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')
|
|
# </get_endpoint>
|
|
|
|
# <get_access_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')
|
|
# </get_access_token>
|
|
|
|
# <score_endpoint>
|
|
curl --location --request POST $scoringUri \
|
|
--header "Authorization: Bearer $accessToken" \
|
|
--header "Content-Type: application/json" \
|
|
--data-raw @endpoints/online/model-1/sample-request.json
|
|
# </score_endpoint>
|
|
|
|
# <get_deployment_logs>
|
|
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 }"
|
|
#</get_deployment_logs>
|
|
|
|
# delete endpoint
|
|
# <delete_endpoint>
|
|
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
|
|
# </delete_endpoint>
|