نشر النماذج باستخدام REST (المعاينة) لتسجيل الدفعات

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

هام

تُعد هذه الميزة قيد المعاينة العامة في الوقت الحالي. يجري توفير إصدار المعاينة هذا من دون اتفاقية على مستوى الخدمة، ولا يوصى به لأحمال العمل الخاصة بالإنتاج. بعض الميزات ربما لا تكون مدعمة أو بها بعض القدرات المقيدة. لمزيد من المعلومات، راجع ⁧⁩شروط الاستخدام التكميلية لمعاينات Microsoft Azure⁧⁩.

ملاحظة

تستخدم هذه المقالة أحدث إصدار من الإصدار 2 من CLI الموجود في المعاينة العامة. للحصول على إرشادات حول تحديث أحدث إصدار وتثبيته، راجع مستند تثبيت CLI (الإصدار 2) وإعداده .

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

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

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

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

هام

مقتطفات التعليمات البرمجية في هذه المقالة تفترض أنك تستخدم قذيفة باش.

يتم سحب مقتطفات التعليمات البرمجية من /cli/batch-score-rest.sh الملف في مستودع أمثلة AzureML.

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

ملاحظة

يجب أن تكون أسماء نقاط نهاية الدفعات فريدة على مستوى منطقة Azure. على سبيل المثال ، يمكن أن يكون هناك نقطة نهاية دفعة واحدة فقط تحمل اسم mybatchendpoint في westus2.

export ENDPOINT_NAME=endpt-`echo $RANDOM`

Azure التعلم الآلي نقاط نهاية الدفعات

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

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

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

أولا، قم بإعداد أصول Azure التعلم الآلي لتكوين وظيفتك.

في استدعاءات واجهة برمجة تطبيقات REST التالية، نستخدم SUBSCRIPTION_ID، RESOURCE_GROUP، ، LOCATIONوكعناصر WORKSPACE نائبة. استبدل العناصر النائبة بقيمتك الخاصة.

يطلب REST الإداري رمزا مميزا للمصادقة الرئيسية للخدمة. استبدل TOKEN بقيمتك الخاصة. يمكنك استرداد هذا الرمز المميز باستخدام الأمر التالي:

TOKEN=$(az account get-access-token --query accessToken -o tsv)

يستخدم موفر الخدمة الوسيطة لضمان التوافق api-version . تختلف الوسيطة api-version من خدمة إلى أخرى. قم بتعيين إصدار واجهة برمجة التطبيقات كمتغير لاستيعاب الإصدارات المستقبلية:

API_VERSION="2021-10-01"

إنشاء حوسبة

يتم تشغيل تسجيل الدفعات فقط على موارد الحوسبة السحابية ، وليس محليا. مورد الحوسبة السحابية عبارة عن مجموعة كمبيوتر افتراضية قابلة لإعادة الاستخدام حيث يمكنك تشغيل مهام سير عمل تسجيل الدفعات.

إنشاء مجموعة حوسبة:

response=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/computes/batch-cluster?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
    \"properties\":{
        \"computeType\": \"AmlCompute\",
        \"properties\": {
            \"osType\": \"Linux\",
            \"vmSize\": \"STANDARD_D2_V2\",
            \"scaleSettings\": {
                \"maxNodeCount\": 5,
                \"minNodeCount\": 0
            },
            \"remoteLoginPortPublicAccess\": \"NotSpecified\"
        },
    },
    \"location\": \"$LOCATION\"
}")

تلميح

إذا كنت ترغب في استخدام حوسبة موجودة بدلا من ذلك، فيجب عليك تحديد معرف Azure Resource Manager الكامل عند إنشاء نشر الدفعة. يستخدم المعرف الكامل التنسيق /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/computes/<your-compute-name>.

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

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

يمكنك استخدام الأداة jq لتحليل نتيجة JSON والحصول على القيم المطلوبة. يمكنك أيضا استخدام مدخل 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")
DATASTORE_PATH=$(echo $response | jq -r '.value[0].id')
BLOB_URI_PROTOCOL=$(echo $response | jq -r '.value[0].properties.protocol')
BLOB_URI_ENDPOINT=$(echo $response | jq -r '.value[0].properties.endpoint')
AZUREML_DEFAULT_DATASTORE=$(echo $response | jq -r '.value[0].name')
AZUREML_DEFAULT_CONTAINER=$(echo $response | jq -r '.value[0].properties.containerName')
AZURE_STORAGE_ACCOUNT=$(echo $response | jq -r '.value[0].properties.accountName')
export AZURE_STORAGE_ACCOUNT $(echo $AZURE_STORAGE_ACCOUNT)
STORAGE_RESPONSE=$(echo az storage account show-connection-string --name $AZURE_STORAGE_ACCOUNT)
AZURE_STORAGE_CONNECTION_STRING=$($STORAGE_RESPONSE | jq -r '.connectionString')

BLOB_URI_ROOT="$BLOB_URI_PROTOCOL://$AZURE_STORAGE_ACCOUNT.blob.$BLOB_URI_ENDPOINT/$AZUREML_DEFAULT_CONTAINER"

& رمز التسجيل Upload

الآن بعد أن أصبح لديك مخزن البيانات ، يمكنك تحميل البرنامج النصي لتسجيل النقاط. استخدم واجهة سطر الأوامر لتخزين Azure لتحميل نقطة إلى الحاوية الافتراضية:

az storage blob upload-batch -d $AZUREML_DEFAULT_CONTAINER/score -s endpoints/batch/mnist/code/  --connection-string $AZURE_STORAGE_CONNECTION_STRING

تلميح

يمكنك أيضا استخدام طرق أخرى للتحميل، مثل مدخل Azure أو مستكشف تخزين Azure.

بمجرد تحميل التعليمات البرمجية الخاصة بك، يمكنك تحديد التعليمات البرمجية الخاصة بك مع طلب PUT:

response=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/codes/score-mnist/versions/1?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
  \"properties\": {
    \"description\": \"Score code\",
    \"codeUri\": \"$BLOB_URI_ROOT/score\"
  }
}")

نموذج Upload والتسجيل

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

az storage blob upload-batch -d $AZUREML_DEFAULT_CONTAINER/model -s endpoints/batch/mnist/model  --connection-string $AZURE_STORAGE_CONNECTION_STRING

الآن ، سجل النموذج:

response=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/models/mnist/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. استخدم صورة عامل رصيف من سجل حاويات Microsoft. يمكنك تكوين صورة عامل الرصيف باستخدام وإضافة تبعيات conda باستخدام imagecondaFile.

قم بتشغيل التعليمة البرمجية التالية لقراءة condaFile المعرفة في json. الملف المصدر موجود في /cli/endpoints/batch/mnist/environment/conda.json مستودع الأمثلة:

CONDA_FILE=$(cat endpoints/batch/mnist/environment/conda.json | sed 's/"/\\"/g')

الآن، قم بتشغيل المقتطف التالي لإنشاء بيئة:

ENV_VERSION=$RANDOM
response=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/environments/mnist-env/versions/$ENV_VERSION?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
    \"properties\":{
        \"condaFile\": $(echo \"$CONDA_FILE\"),
        \"image\": \"mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:latest\"
    }
}")

النشر باستخدام نقاط نهاية الدفعات

بعد ذلك ، قم بإنشاء نقطة نهاية الدفعات ، والنشر ، وتعيين النشر الافتراضي.

إنشاء نقطة نهاية دفعة

إنشاء نقطة نهاية الدفعة:

response=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/batchEndpoints/$ENDPOINT_NAME?api-version=$API_VERSION" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $TOKEN" \
--data-raw "{
    \"properties\": {
        \"authMode\": \"aadToken\"
    },
    \"location\": \"$LOCATION\"
}")

إنشاء نشر الدفعات

إنشاء نشر دفعة ضمن نقطة النهاية:

DEPLOYMENT_NAME="nonmlflowedp"
response=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/batchEndpoints/$ENDPOINT_NAME/deployments/$DEPLOYMENT_NAME?api-version=$API_VERSION" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $TOKEN" \
--data-raw "{
    \"location\": \"$LOCATION\",
    \"properties\": {        
        \"model\": {
            \"referenceType\": \"Id\",
            \"assetId\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/models/mnist/versions/1\"
        },
        \"codeConfiguration\": {
            \"codeId\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/codes/score-mnist/versions/1\",
            \"scoringScript\": \"digit_identification.py\"
        },
        \"environmentId\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/environments/mnist-env/versions/$ENV_VERSION\",
        \"compute\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/computes/batch-cluster\",
        \"resources\": {
            \"instanceCount\": 1
        },
        \"maxConcurrencyPerInstance\": \"4\",
        \"retrySettings\": {
            \"maxRetries\": 3,
            \"timeout\": \"PT30S\"
        },
        \"errorThreshold\": \"10\",
        \"loggingLevel\": \"info\",
        \"miniBatchSize\": \"5\",
    }
}")

تعيين نشر الدفعات الافتراضي ضمن نقطة النهاية

هناك نشر دفعة افتراضية واحدة فقط ضمن نقطة نهاية واحدة، والتي سيتم استخدامها عند الاستدعاء لتشغيل مهمة تسجيل الدفعات.

response=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/batchEndpoints/$ENDPOINT_NAME?api-version=$API_VERSION" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $TOKEN" \
--data-raw "{
    \"properties\": {
        \"authMode\": \"aadToken\",
        \"defaults\": {
            \"deploymentName\": \"$DEPLOYMENT_NAME\"
        }
    },
    \"location\": \"$LOCATION\"
}")

operation_id=$(echo $response | jq -r '.properties' | jq -r '.properties' | jq -r '.AzureAsyncOperationUri')
wait_for_completion $operation_id $TOKEN

تشغيل تسجيل الدفعات

يؤدي استدعاء نقطة نهاية دفعة إلى تشغيل مهمة تسجيل الدفعات. يتم إرجاع وظيفة id في الاستجابة ، ويمكن استخدامها لتتبع تقدم تسجيل الدفعة. في المقتطفات التالية ، jq يتم استخدامه للحصول على الوظيفة id.

استدعاء نقطة نهاية الدفعات لبدء مهمة تسجيل الدفعات

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

response=$(curl --location --request GET "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/batchEndpoints/$ENDPOINT_NAME?api-version=$API_VERSION" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $TOKEN")

SCORING_URI=$(echo $response | jq -r '.properties.scoringUri')

احصل على الرمز المميز للوصول إلى نقطة نهاية الدفعة:

SCORING_TOKEN=$(az account get-access-token --resource https://ml.azure.com --query accessToken -o tsv)

الآن ، استدعي نقطة نهاية الدفعة لبدء مهمة تسجيل الدفعة. يسجل المثال التالي البيانات المتاحة للجمهور في السحابة:

response=$(curl --location --request POST $SCORING_URI \
--header "Authorization: Bearer $SCORING_TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
    \"properties\": {
        \"dataset\": {
            \"dataInputType\": \"DataUrl\",
            \"Path\": \"https://pipelinedata.blob.core.windows.net/sampledata/mnist\"
        }
    }
}")

JOB_ID=$(echo $response | jq -r '.id')
JOB_ID_SUFFIX=$(echo ${JOB_ID##/*/})

إذا تم تخزين بياناتك في مخزن بيانات مسجل في Azure التعلم الآلي، فيمكنك استدعاء نقطة نهاية الدفعة باستخدام مجموعة بيانات. التعليمة البرمجية التالية بإنشاء مجموعة بيانات جديدة:

DATASET_NAME="mnist"
DATASET_VERSION=$RANDOM

response=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/datasets/$DATASET_NAME/versions/$DATASET_VERSION?api-version=$API_VERSION" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $TOKEN" \
--data-raw "{
    \"properties\": {
        \"paths\": [
            {
                \"folder\": \"https://pipelinedata.blob.core.windows.net/sampledata/mnist\"
            }
        ]
    }
}")

بعد ذلك، قم بالرجوع إلى مجموعة البيانات عند استدعاء نقطة نهاية الدفعة:

response=$(curl --location --request POST $SCORING_URI \
--header "Authorization: Bearer $SCORING_TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
    \"properties\": {
        \"dataset\": {
            \"dataInputType\": \"DatasetVersion\",
            \"datasetName\": \"$DATASET_NAME\",
            \"datasetVersion\": \"$DATASET_VERSION\"
        },
        \"outputDataset\": {
            \"datastoreId\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/datastores/workspaceblobstore\",
            \"path\": \"$ENDPOINT_NAME\"
        },
        \"outputFileName\": \"$OUTPUT_FILE_NAME\"
    }
}")

في مقتطف التعليمات البرمجية السابق، يتم توفير موقع إخراج مخصص باستخدام datastoreId، pathو outputFileName. تسمح لك هذه الإعدادات بتكوين مكان تخزين نتائج تسجيل الدفعات.

هام

يجب عليك توفير موقع إخراج فريد. إذا كان ملف الإخراج موجودا بالفعل، فستفشل مهمة تسجيل الدفعات.

على سبيل المثال، يتم تخزين الإخراج في وحدة تخزين blob الافتراضية لمساحة العمل. اسم المجلد هو نفسه اسم نقطة النهاية، ويتم إنشاء اسم الملف عشوائيا بواسطة التعليمة البرمجية التالية:

export OUTPUT_FILE_NAME=predictions_`echo $RANDOM`.csv

تحقق من مهمة تسجيل الدفعات

عادة ما تستغرق مهام تسجيل الدفعات بعض الوقت لمعالجة المجموعة الكاملة من المدخلات. راقب حالة الوظيفة وتحقق من النتائج بعد اكتمالها:

تلميح

يستدعي المثال النشر الافتراضي لنقطة نهاية الدفعة. لاستدعاء نشر غير افتراضي، استخدم azureml-model-deployment رأس HTTP وقم بتعيين القيمة إلى اسم النشر. على سبيل المثال ، باستخدام معلمة مع --header "azureml-model-deployment: $DEPLOYMENT_NAME" حليقة.

wait_for_completion $SCORING_URI/$JOB_ID_SUFFIX $SCORING_TOKEN

تحقق من نتائج تسجيل الدفعات

للحصول على معلومات حول التحقق من النتائج، راجع التحقق من نتائج تسجيل الدفعات.

حذف نقطة نهاية الدفعة

إذا كنت لن تستخدم نقطة نهاية الدفعة، فيجب حذفها باستخدام الأمر أدناه (يحذف نقطة نهاية الدفعة وجميع عمليات النشر الأساسية):

curl --location --request DELETE "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/batchEndpoints/$ENDPOINT_NAME?api-version=$API_VERSION" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $TOKEN" || true

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