توزيع النماذج باستخدام REST

تعلم كيفية استخدام واجهة برمجة تطبيقات REST للتعلم الآلي من Microsoft Azure لنشر النماذج.

تقوم واجهة برمجة تطبيقات REST باستخدام أفعال HTTP القياسية لإنشاء الموارد واستردادها وتحديثها وحذفها. كما تعمل واجهة برمجة تطبيقات REST مع أي لغة أو أداة بإمكانها تقديم طلبات HTTP. بنية REST المباشرة تجعل منها خيارًا جيدًا في بيئات البرمجة النصية وأتمتة MLOps.

وفي هذه المقالة، ستتعرّف على كيفية استخدام واجهات برمجة تطبيقات REST الجديدة من أجل:

  • إنشاء أصول للتعلم الآلي
  • إنشاء مهمة أساسية للتدريب
  • إنشاء مهمة مسح لضبط المعلّمات الفائقة

المتطلبات الأساسية

تعيين اسم نقطة النهاية

إشعار

ينبغي أن تكون أسماء نقاط النهاية مميزة على مستوى منطقة Azure. على سبيل المثال، يمكن أن تكون هناك نقطة نهاية واحدة فقط باسم my-endpoint في westus2.

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

نقاط نهاية التعلم الآلي من Microsoft Azure عبر الإنترنت

تسمح لك نقاط النهاية عبر الإنترنت بنشر النموذج الخاص بك دون الحاجة إلى إنشاء وإدارة البنية الأساسية بالإضافة إلى مجموعات Kubernetes. في هذه المقالة، ستقوم بإنشاء نقطة نهاية ونشر عبر الإنترنت، والتأكد من صحتها عن طريق استدعائها. ولكن أولا سيتعين عليك تسجيل الأصول اللازمة للتوزيع، بما في ذلك النموذج والتعليمة برمجية والبيئة.

هناك العديد من الطرق لإنشاء نقطة نهاية Azure التعلم الآلي عبر الإنترنت بما في ذلك Azure CLI، وبشكل مرئي مع الاستوديو. المثال التالي يمثل نقطة نهاية عبر الإنترنت مع واجهة برمجة التطبيقات REST.

إنشاء أصول للتعلم الآلي

أولًا، قم بإعداد أصول التعلم الآلي من Microsoft Azure لتكوين المهمة.

في استدعاءات واجهة برمجة تطبيقات REST التالية، نستخدم SUBSCRIPTION_ID وRESOURCE_GROUP وLOCATION و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 كمُتغير للتوافق مع الإصدارات المستقبلية:

API_VERSION="2022-05-01"

احصل على التفاصيل الخاصة بحساب التخزين

لتسجيل النموذج والتعليمات البرمجية، يجب أولاً أن يتم تحميلهما إلى حساب تخزين. تتوفر تفاصيل حساب التخزين في مخزن البيانات. في هذا المثال، بإمكانك الحصول على مخزن البيانات الافتراضي وحساب Azure Storage لمساحة عملك. استعلم عن مساحة عملك مع طلب GET للحصول على ملف JSON بالمعلومات.

بإمكانك استخدام أداة jq لتوزيع نتيجة JSON والحصول على القيم المطلوبة. يمكنك أيضاً استخدام مدخل Microsoft Azure للبحث عن نفس المعلومات:

# 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 لتحميل كائن ثنائي كبير الحجم إلى حاويتك الافتراضية:

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

تلميح

يمكنك أيضاً استخدام أساليب أخرى للتحميل، مثل مدخل Microsoft Azure أو 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\"
  }
}"

تحميل نموذج وتسجيلها

على غرار التعليمات البرمجية، قم بتحميل ملفات النموذج:

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. قم باستخدام صورة docker من Microsoft Container Registry. بإمكانك تكوين صورة docker باستخدام Docker وإضافة تبعيات conda باستخدام condaFile.

في القصاصة البرمجية الآتية، تمت قراءة محتويات بيئة 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\": \"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\"
    }
}")

استدعي نقطة النهاية لتسجيل البيانات باستخدام نموذجك

نحتاج إلى معرف موارد منتظم للتسجيل والرمز المميز للوصول لاستدعاء نقطة النهاية. أولا احصل على معرف موارد منتظم للتسجيل:

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

الخطوات التالية