REST ile modelleri dağıtma

Bu makalede, çevrimiçi uç noktaları kullanarak modelleri dağıtmak için Azure Machine Learning REST API'sinin nasıl kullanılacağı açıklanmaktadır. Çevrimiçi uç noktalar, temel alınan altyapıyı ve Kubernetes kümelerini oluşturmak ve yönetmek zorunda kalmadan modelinizi dağıtmanıza olanak sağlar. Aşağıdaki yordamlarda çevrimiçi uç nokta oluşturma ve dağıtımın nasıl oluşturulacağı ve çağrılarak uç noktanın nasıl doğrulanacağı gösterilmektedir.

Azure Machine Learning çevrimiçi uç noktası oluşturmanın birçok yolu vardır. Azure CLI, Azure Machine Learning stüdyosu veya REST API'yi kullanabilirsiniz. REST API, kaynakları oluşturmak, almak, güncelleştirmek ve silmek için standart HTTP fiillerini kullanır. HTTP isteğinde bulunabilen herhangi bir dil veya araçla çalışır. REST API'nin basit yapısı, betik oluşturma ortamlarında ve makine öğrenmesi işlemleri otomasyonu için iyi bir seçimdir.

Ö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önetim REST istekleri hizmet sorumlusu kimlik doğrulaması kullanır.

  • Hizmet sorumlusu kimlik doğrulama belirteci. Hizmet sorumlusu kimlik doğrulama belirtecini alma bölümünde yer alan adımları izleyerek belirteci alabilirsiniz.

  • Curl yardımcı programı.

    • Microsoft Windows 10 ve Windows 11'in tüm yüklemeleri varsayılan olarak curl yüklüdür. 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.

    • UNIX platformları için curl programı Linux için Windows Alt Sistemi veya herhangi bir UNIX dağıtımında kullanılabilir.

Uç nokta adını ayarlama

Uç nokta adları Azure bölge düzeyinde benzersiz olmalıdır. My-endpoint gibi bir uç nokta adı, belirtilen bölgede bu ada sahip tek uç nokta olmalıdır.

değerine endpt-restsonek olarak rastgele bir sayı ekleyen yardımcı programını çağırarak RANDOM benzersiz bir uç nokta adı oluşturun:

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

Makine öğrenmesi varlıkları oluşturma

Dağıtıma hazırlanmak için Azure Machine Learning varlıklarınızı ayarlayın ve işinizi yapılandırın. Model, kod ve ortam dahil olmak üzere dağıtım için gerekli varlıkları kaydedersiniz.

İpucu

Aşağıdaki yordamlardaki REST API çağrıları, bazı bağımsız değişkenler için yer tutucu olarak , $RESOURCE_GROUP, $LOCATION (bölge) ve Azure Machine Learning'i $WORKSPACE kullanır$SUBSCRIPTION_ID. Dağıtımınız için kodu uyguladığınızda, bağımsız değişken yer tutucularını belirli dağıtım değerlerinizle değiştirin.

Yönetim REST bir hizmet sorumlusu kimlik doğrulama belirteci istemektedir. Dağıtımınız için kodu uyguladığınızda, yer tutucu örneklerini $TOKEN dağıtımınız için hizmet sorumlusu belirteci ile değiştirin. 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.

Değişkenini API_version gelecekteki sürümleri barındıracak şekilde ayarlayın:

API_VERSION="2022-05-01"

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

Modeli ve kodu kaydetmek için önce bu öğeleri bir Azure Depolama hesabına yüklemeniz gerekir. Azure Depolama hesabının ayrıntıları veri deposunda bulunabilir. Bu örnekte, çalışma alanınız için varsayılan veri deponuzu 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 deponuz olduğuna göre puanlama betiğini karşıya yükleyebilirsiniz. Blobu varsayılan kapsayıcınıza 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

İpucu

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

Kodunuzu karşıya yükledikten sonra, kodunuzu put isteğiyle belirtebilir ve tanımlayıcıyla veri deposuna datastoreId 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

Benzer bir REST API çağrısıyla model dosyalarını karşıya yükleyin:

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

Karşıya yükleme tamamlandıktan sonra 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ü komutuyla docker yapılandırabilir ve komutuyla condaFile conda bağımlılıkları ekleyebilirsiniz.

Aşağıdaki kod, conda ortamının (YAML dosyası) içeriğini bir ortam değişkenine okur:

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

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

Dağıtım uç noktasını çağırmak için puanlama URI'sine ve erişim belirtecine ihtiyacınız vardır.

İlk olarak 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')

Ardından 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')

Son olarak curl yardımcı programını 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

Dağıtım günlüklerini 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ı daha fazla kullanmayacaksanız kaynakları silin.

Uç noktayı ve temel alınan tüm dağıtımları silen aşağıdaki komutu çalıştırın:

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