Menyebarkan model dengan REST

Pelajari cara menggunakan REST API Azure Machine Learning untuk menyebarkan model.

REST API menggunakan kata kerja HTTP standar untuk membuat, mengambil, memperbarui, dan menghapus sumber daya. REST API bekerja dengan bahasa atau alat apa pun yang dapat membuat permintaan HTTP. Struktur langsung REST sering menjadikannya pilihan yang baik dalam lingkungan pembuatan skrip dan untuk otomatisasi MLOp.

Dalam artikel ini, Anda akan mempelajari cara menggunakan REST API baru untuk:

  • Membuat aset pembelajaran mesin
  • Membuat pekerjaan pelatihan dasar
  • Membuat pekerjaan pembersihan penyetelan hyperparameter

Prasyarat

Menetapkan nama titik akhir

Catatan

Nama titik akhir harus unik di tingkat wilayah Azure. Misalnya, hanya boleh ada satu titik akhir dengan nama titik akhir-saya di westus2.

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

Titik akhir online Azure Machine Learning

Titik akhir online memungkinkan Anda untuk menyebarkan model Anda tanpa harus membuat dan mengelola infrastruktur yang mendasarinya serta kluster Kubernetes. Dalam artikel ini, Anda akan membuat titik akhir dan penyebaran online, dan memvalidasinya dengan memanggilnya. Tetapi pertama-tama, Anda harus mendaftarkan aset yang diperlukan untuk penyebaran, termasuk model, kode, dan lingkungan.

Ada banyak cara untuk membuat titik akhir online Azure Pembelajaran Mesin termasuk Azure CLI, dan secara visual dengan studio. Berikut contoh titik akhir online dengan REST API.

Membuat aset pembelajaran mesin

Pertama, siapkan aset Azure Machine Learning untuk mengonfigurasi pekerjaan Anda.

Dalam panggilan REST API berikut, kami menggunakan SUBSCRIPTION_ID, RESOURCE_GROUP, LOCATION, dan WORKSPACE sebagai tempat penampung. Ganti tempat penampung dengan nilai Anda sendiri.

REST administratif meminta token autentikasi perwakilan layanan. Ganti TOKEN dengan nilai Anda sendiri. Anda dapat mengambil token ini dengan perintah berikut:

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

Penyedia layanan menggunakan argumen api-version untuk memastikan kompatibilitas. Argumen api-version bervariasi dari layanan ke layanan. Atur versi API sebagai variabel untuk mengakomodasi versi mendatang:

API_VERSION="2022-05-01"

Mendapatkan detail akun penyimpanan

Sebelum didaftarkan, model dan kode harus terlebih dahulu diunggah ke akun penyimpanan. Detail akun penyimpanan tersedia di penyimpanan data. Dalam contoh ini, Anda mendapatkan penyimpanan data default dan akun Azure Storage untuk ruang kerja Anda. Ajukan kueri ruang kerja Anda dengan permintaan GET untuk mendapatkan file JSON dengan informasi tersebut.

Anda dapat menggunakan alat jq untuk mengurai hasil JSON dan mendapatkan nilai yang diperlukan. Anda juga dapat menggunakan portal Azure untuk melihat informasi ini:

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

Unggah & daftarkan kode

Setelah memiliki penyimpanan data, Anda dapat mengunggah skrip penilaian. Gunakan CLI Azure Storage untuk mengunggah blob ke dalam kontainer default Anda:

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

Tip

Anda juga dapat menggunakan metode lain untuk mengunggah, seperti portal Azure atau Azure Storage Explorer.

Setelah mengunggah kode, Anda dapat menentukan kode dengan permintaan PUT dan melihat penyimpanan data dengan 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\"
  }
}"

Mengunggah dan mendaftarkan model

Seperti halnya kode, Unggah file model:

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

Sekarang, daftarkan 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\"
    }
}"

Membuat lingkungan

Penyebaran harus dijalankan di lingkungan yang memiliki dependensi yang diperlukan. Buat lingkungan dengan permintaan PUT. Gunakan gambar docker dari Microsoft Container Registry. Anda dapat mengonfigurasi gambar docker dengan Docker dan menambahkan dependensi conda dengan condaFile.

Dalam cuplikan berikut, konten lingkungan Conda (file YAML) telah dibaca ke dalam variabel lingkungan:

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

Membuat titik akhir

Buat titik akhir online:

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

Membuat penyebaran

Buat penyebaran di bagian titik akhir:

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

Memanggil titik akhir untuk menilai data dengan model Anda

Kita memerlukan uri penilaian dan token akses untuk memanggil titik akhir. Pertama, dapatkan uri penilaian:

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

Dapatkan token akses titik akhir:

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

Sekarang, panggil titik akhir menggunakan curl:

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

Memeriksa log

Periksa log penyebaran:

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

Menghapus titik akhir

Jika tidak ingin menggunakan penyebaran, Anda harus menghapusnya dengan perintah berikut (ini akan menghapus titik akhir dan semua penyebaran yang mendasarinya):

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

Langkah berikutnya