REST ile modelleri dağıtma

Modelleri dağıtmak için Azure Machine Learning REST API'sini kullanmayı öğrenin.

REST API, kaynakları oluşturmak, almak, güncelleştirmek ve silmek için standart HTTP fiillerini kullanır. REST API, HTTP isteğinde bulunabilen herhangi bir dil veya araçla çalışır. REST'in basit yapısı, betik oluşturma ortamlarında ve MLOps otomasyonu için iyi bir seçim olmasını sağlar.

Bu makalede, yeni REST API'lerini kullanarak şunları yapmayı öğreneceksiniz:

  • Makine öğrenmesi varlıkları oluşturma
  • Temel eğitim işi oluşturma
  • Hiper parametre ayarlama süpürme işi oluşturma

Önkoşullar

  • Yönetici haklarına sahip olduğunuz bir Azure aboneliği. Böyle bir aboneliğiniz yoksa ücretsiz veya ücretli kişisel aboneliği deneyin.
  • Azure Machine Learning çalışma alanı.
  • Çalışma alanınızdaki bir hizmet sorumlusu. Yönetici strative REST istekleri, hizmet sorumlusu kimlik doğrulaması kullanır.
  • Hizmet sorumlusu kimlik doğrulama belirteci. Bu belirteci almak için Hizmet sorumlusu kimlik doğrulama belirtecini alma'daki adımları izleyin.
  • Curl yardımcı programı. Curl programı Linux için Windows Alt Sistemi veya herhangi bir UNIX dağıtımında kullanılabilir. PowerShell'de curl, Invoke-WebRequest için bir diğer addır ve curl -d "key=val" -X POST uri olurInvoke-WebRequest -Body "key=val" -Method POST -Uri uri.

Uç nokta adını ayarlama

Dekont

Uç nokta adlarının Azure bölge düzeyinde benzersiz olması gerekir. Örneğin, westus2'de my-endpoint adlı tek bir uç nokta olabilir.

export ENDPOINT_NAME=endpt-rest-`echo $RANDOM`

Azure Machine Learning çevrimiçi uç noktaları

Çevrimiçi uç noktalar, hem temel alınan altyapıyı hem de Kubernetes kümelerini oluşturmak ve yönetmek zorunda kalmadan modelinizi dağıtmanıza olanak sağlar. Bu makalede, çevrimiçi bir uç nokta ve dağıtım oluşturacak ve çağırarak bunu doğrulayacaksınız. Ancak önce model, kod ve ortam dahil olmak üzere dağıtım için gereken varlıkları kaydetmeniz gerekir.

Azure CLI dahil olmak üzere bir Azure Machine Learning çevrimiçi uç noktası oluşturmanın birçok yolu vardır ve stüdyo ile görsel olarak. Aşağıdaki örnek, REST API ile çevrimiçi bir uç noktadır.

Makine öğrenmesi varlıkları oluşturma

İlk olarak, işinizi yapılandırmak için Azure Machine Learning varlıklarınızı ayarlayın.

Aşağıdaki REST API çağrılarında, yer tutucu olarak , RESOURCE_GROUP, LOCATIONve WORKSPACE kullanırızSUBSCRIPTION_ID. Yer tutucuları kendi değerlerinizle değiştirin.

Yönetici strative REST bir hizmet sorumlusu kimlik doğrulama belirteci istemektedir. değerini kendi değerinizle değiştirin TOKEN . Bu belirteci aşağıdaki komutla alabilirsiniz:

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')

Hizmet sağlayıcısı, uyumluluğu sağlamak için bağımsız değişkenini api-version kullanır. Bağımsız api-version değişken hizmetten hizmete değişir. API sürümünü, gelecekteki sürümleri kapsayacak şekilde bir değişken olarak ayarlayın:

API_VERSION="2022-05-01"

Depolama hesabı ayrıntılarını alma

Modeli ve kodu kaydetmek için önce bir depolama hesabına yüklenmesi gerekir. Depolama hesabının ayrıntıları veri deposunda bulunabilir. Bu örnekte, çalışma alanınız için varsayılan veri deposu ve Azure Depolama hesabını alırsınız. Bilgileri içeren bir JSON dosyası almak için çalışma alanınızı GET isteğiyle sorgular.

JSON sonucunu ayrıştırmak ve gerekli değerleri almak için jq aracını kullanabilirsiniz. Aynı bilgileri bulmak için Azure portalını da kullanabilirsiniz:

# 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')

Kodu karşıya yükleme ve kaydetme

Artık veri deposuna sahip olduğunuz için puanlama betiğini karşıya yükleyebilirsiniz. Varsayılan kapsayıcınıza blob yüklemek için Azure Depolama CLI'sini kullanın:

az storage blob upload-batch -d $AZUREML_DEFAULT_CONTAINER/score -s endpoints/online/model-1/onlinescoring

Bahşiş

Karşıya yüklemek için Azure portalı veya Azure Depolama Gezgini gibi diğer yöntemleri de kullanabilirsiniz.

Kodunuzu karşıya yükledikten sonra bir PUT isteğiyle kodunuzu belirtebilir ve ile datastoreIdveri deposuna başvurabilirsiniz:

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\"
  }
}"

Modeli karşıya yükleme ve kaydetme

Koda benzer şekilde, Model dosyalarını karşıya yükleyin:

az storage blob upload-batch -d $AZUREML_DEFAULT_CONTAINER/model -s endpoints/online/model-1/model

Şimdi modeli kaydedin:

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\"
    }
}"

Ortam oluşturma

Dağıtımın gerekli bağımlılıklara sahip bir ortamda çalıştırılması gerekir. Bir PUT isteğiyle ortamı oluşturun. Microsoft Container Registry'den bir docker görüntüsü kullanın. docker görüntüsünü ile yapılandırabilir ve ile DockercondaFileconda bağımlılıkları ekleyebilirsiniz.

Aşağıdaki kod parçacığında Conda ortamının (YAML dosyası) içeriği bir ortam değişkenine okunmlanmıştır:

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\"
    }
}"

Uç nokta oluşturma

Çevrimiçi uç noktayı oluşturun:

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\"
}")

Dağıtım oluşturma

Uç noktanın altında bir dağıtım oluşturun:

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\"
    }
}")

Modelinizle veri puanını almak için uç noktayı çağırma

Uç noktayı çağırmak için puanlama uri'sine ve erişim belirtecine ihtiyacımız var. Önce puanlama uri'sini alın:

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')

Uç nokta erişim belirtecini alın:

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')

Şimdi curl kullanarak uç noktayı çağırın:

curl --location --request POST $scoringUri \
--header "Authorization: Bearer $accessToken" \
--header "Content-Type: application/json" \
--data-raw @endpoints/online/model-1/sample-request.json

Günlükleri denetleme

Dağıtım günlüklerini denetleyin:

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 }"

Uç noktayı silme

Dağıtımı kullanmayacaksanız, aşağıdaki komutla silmelisiniz (uç noktayı ve temel alınan tüm dağıtımları siler):

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

Sonraki adımlar