مشاركة عبر


نشر نماذج MLflow إلى نقاط النهاية عبر الإنترنت

ينطبق على:ملحق التعلم الآلي من Azure CLI v2 (الحالي)

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

من أجل عدم نشر التعليمات البرمجية، التعلم الآلي من Azure:

  • تثبيت حزم Python التي تقوم بإدراجها في ملف conda.yaml ديناميكيا. ونتيجة لذلك، يتم تثبيت التبعيات أثناء وقت تشغيل الحاوية.
  • يوفر صورة أساسية MLflow أو بيئة منسقة تحتوي على العناصر التالية:

Prerequisites

  • اشتراك Azure. في حال لم يكن لديك اشتراك Azure، فأنشئ حساباً مجانيّاً قبل البدء.

  • حساب مستخدم يحتوي على واحد على الأقل من أدوار التحكم في الوصول استنادا إلى الدور (Azure RBAC) التالية:

    • دور المالك لمساحة عمل التعلم الآلي من Azure
    • دور مساهم لمساحة عمل التعلم الآلي من Azure
    • دور مخصص لديه Microsoft.MachineLearningServices/workspaces/onlineEndpoints/* أذونات

    لمزيد من المعلومات، راجع إدارة الوصول إلى مساحات عمل التعلم الآلي من Azure.

  • الوصول إلى التعلم الآلي من Azure:

    تثبيت Azure CLI والملحق ml إلى Azure CLI. للحصول على خطوات التثبيت، راجع تثبيت وإعداد CLI (v2).

حول المثال

يوضح لك المثال في هذه المقالة كيفية نشر نموذج MLflow إلى نقطة نهاية عبر الإنترنت لتنفيذ التنبؤات. يستخدم المثال نموذج MLflow الذي يستند إلى مجموعة بيانات مرض السكري. تحتوي مجموعة البيانات هذه على 10 متغيرات أساسية: العمر والجنس ومؤشر كتلة الجسم ومتوسط ضغط الدم و6 قياسات مصل الدم التي تم الحصول عليها من 442 مريضا بمرض السكري. كما أنه يحتوي على استجابة الاهتمام، وهو مقياس كمي لتطور المرض بعد عام واحد من تاريخ البيانات الأساسية.

تم تدريب النموذج باستخدام تراجع scikit-learn . يتم حزم جميع المعالجة المسبقة المطلوبة كبنية أساسية لبرنامج ربط العمليات التجارية، لذلك هذا النموذج هو مسار شامل ينتقل من البيانات الأولية إلى التنبؤات.

تستند المعلومات الواردة في هذه المقالة إلى عينات التعليمات البرمجية من مستودع azureml-examples . إذا قمت باستنساخ المستودع، يمكنك تشغيل الأوامر في هذه المقالة محليا دون الحاجة إلى نسخ ملفات YAML والملفات الأخرى أو لصقها. استخدم الأوامر التالية لاستنساخ المستودع والانتقال إلى المجلد للغة الترميز الخاصة بك:

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli

المتابعة في Jupyter Notebook

لمتابعة الخطوات الواردة في هذه المقالة، راجع دفتر ملاحظات نشر نموذج MLflow إلى نقاط النهاية عبر الإنترنت في مستودع الأمثلة.

الاتصال بمساحة العمل الخاصة بك

الاتصال بمساحة عمل التعلم الآلي من Azure:

az account set --subscription <subscription-ID>
az configure --defaults workspace=<workspace-name> group=<resource-group-name> location=<location>

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

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

MODEL_NAME='sklearn-diabetes'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "endpoints/online/ncd/sklearn-diabetes/model"

ماذا لو تم تسجيل النموذج الخاص بك داخل تشغيل؟

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

لتسجيل النموذج، تحتاج إلى معرفة موقع التخزين الخاص به:

  • إذا كنت تستخدم ميزة MLflow autolog ، يعتمد المسار إلى النموذج على نوع النموذج وإطار العمل. تحقق من إخراج الوظيفة لتحديد اسم مجلد النموذج. يحتوي هذا المجلد على ملف يسمى MLModel.
  • إذا كنت تستخدم log_model الأسلوب لتسجيل النماذج يدويا، يمكنك تمرير المسار إلى النموذج كوسيطة لهذا الأسلوب. على سبيل المثال، إذا كنت تستخدم mlflow.sklearn.log_model(my_model, "classifier") لتسجيل النموذج، classifier فهو المسار الذي يتم تخزين النموذج عليه.

يمكنك استخدام Azure Machine Learning CLI v2 لإنشاء نموذج من إخراج مهمة التدريب. تستخدم التعليمات البرمجية التالية البيانات الاصطناعية لوظيفة ذات معرف $RUN_ID لتسجيل نموذج يسمى $MODEL_NAME. $MODEL_PATH هو المسار الذي تستخدمه الوظيفة لتخزين النموذج.

az ml model create --name $MODEL_NAME --path azureml://jobs/$RUN_ID/outputs/artifacts/$MODEL_PATH

نشر نموذج MLflow إلى نقطة نهاية عبر الإنترنت

  1. استخدم التعليمات البرمجية التالية لتكوين الاسم ووضع المصادقة لنقطة النهاية التي تريد توزيع النموذج إليها:

    تعيين اسم نقطة نهاية عن طريق تشغيل الأمر التالي. أولا استبدل YOUR_ENDPOINT_NAME باسم فريد.

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    

    لتكوين نقطة النهاية الخاصة بك، قم بإنشاء ملف YAML باسم create-endpoint.yaml يحتوي على الأسطر التالية:

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: my-endpoint
    auth_mode: key
    
  2. إنشاء نقطة النهاية:

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
    
  3. تكوين النشر. التوزيع هو مجموعة من الموارد المطلوبة لاستضافة النموذج الذي يقوم بالاستدلال الفعلي.

    أنشئ ملف YAML باسم sklearn-deployment.yaml يحتوي على الأسطر التالية:

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: sklearn-deployment
    endpoint_name: my-endpoint
    model:
      name: mir-sample-sklearn-ncd-model
      version: 2
      path: sklearn-diabetes/model
      type: mlflow_model
    instance_type: Standard_DS3_v2
    instance_count: 1
    

    Note

    يتم دعم الجيل التلقائي من scoring_script و environment فقط لنكهة PyFunc النموذج. لاستخدام نكهة نموذج مختلفة، راجع تخصيص عمليات نشر نموذج MLflow.

  4. إنشاء النشر:

    az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
    
    az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
    
  5. تعيين كافة نسبة استخدام الشبكة إلى النشر. حتى الآن، تحتوي نقطة النهاية على نشر واحد، ولكن لم يتم تعيين أي من حركة المرور الخاصة بها إليها.

    هذه الخطوة غير مطلوبة في Azure CLI إذا كنت تستخدم العلامة --all-traffic أثناء الإنشاء. إذا كنت بحاجة إلى تغيير نسبة استخدام الشبكة، يمكنك استخدام az ml online-endpoint update --traffic الأمر . لمزيد من المعلومات حول كيفية تحديث حركة المرور، راجع تحديث نسبة استخدام الشبكة تدريجيا.

  6. تحديث تكوين نقطة النهاية:

    هذه الخطوة غير مطلوبة في Azure CLI إذا كنت تستخدم العلامة --all-traffic أثناء الإنشاء. إذا كنت بحاجة إلى تغيير حركة المرور، يمكنك استخدام az ml online-endpoint update --traffic الأمر . لمزيد من المعلومات حول كيفية تحديث حركة المرور، راجع تحديث نسبة استخدام الشبكة تدريجيا.

استدعاء نقطة النهاية

عندما يكون النشر جاهزا، يمكنك استخدامه لخدمة الطلبات. تتمثل إحدى طرق اختبار النشر في استخدام إمكانية استدعاء المضمنة في عميل النشر الخاص بك. في مستودع الأمثلة، يحتوي ملف sample-request-sklearn.json على التعليمات البرمجية JSON التالية. يمكنك استخدامه كملف طلب عينة للنشر.

{"input_data": {
    "columns": [
      "age",
      "sex",
      "bmi",
      "bp",
      "s1",
      "s2",
      "s3",
      "s4",
      "s5",
      "s6"
    ],
    "data": [
      [ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ],
      [ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0]
    ],
    "index": [0,1]
  }}

Note

يستخدم input_data هذا الملف المفتاح بدلا من inputs، الذي تستخدمه خدمة MLflow. يتطلب التعلم الآلي من Azure تنسيق إدخال مختلف ليتمكن من إنشاء عقود Swagger تلقائيا لنقاط النهاية. لمزيد من المعلومات حول تنسيقات الإدخال المتوقعة، راجع النشر في خادم MLflow المضمن مقابل النشر في خادم الاستدلال للتعلم الآلي من Microsoft Azure.

إرسال طلب إلى نقطة النهاية:

az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json

يجب أن تكون الاستجابة مشابهة للنص التالي:

[ 
  11633.100167144921,
  8522.117402884991
]

Important

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

تخصيص عمليات نشر نموذج MLflow

لا يتعين عليك تحديد برنامج نصي لتسجيل النقاط في تعريف التوزيع لنموذج MLflow إلى نقطة نهاية عبر الإنترنت. ولكن يمكنك تحديد برنامج نصي لتسجيل النقاط إذا كنت تريد تخصيص عملية الاستدلال الخاصة بك.

عادة ما تريد تخصيص توزيع نموذج MLflow في الحالات التالية:

  • لا يحتوي النموذج على نكهة PyFunc .
  • تحتاج إلى تخصيص الطريقة التي تشغل بها النموذج. على سبيل المثال، تحتاج إلى استخدام mlflow.<flavor>.load_model() نكهة معينة لتحميل النموذج.
  • تحتاج إلى إجراء المعالجة المسبقة أو المعالجة اللاحقة في روتين التسجيل الخاص بك، لأن النموذج لا يقوم بهذه المعالجة.
  • لا يمكن تمثيل إخراج النموذج بشكل جيد في البيانات الجدولية. على سبيل المثال، الإخراج هو موتر يمثل صورة.

Important

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

نشر برنامج نصي مخصص لتسجيل النقاط

لنشر نموذج MLflow يستخدم برنامجا نصيا مخصصا لتسجيل النقاط، اتبع الخطوات الواردة في الأقسام التالية.

تحديد مجلد النموذج

حدد المجلد الذي يحتوي على نموذج MLflow الخاص بك عن طريق اتخاذ الخطوات التالية:

  1. انتقل إلى Azure التعلم الآلي studio.

  2. انتقل إلى قسم النماذج .

  3. حدد النموذج الذي تريد نشره وانتقل إلى علامة التبويب البيانات الاصطناعية الخاصة به.

  4. دون المجلد المعروض. عند تسجيل نموذج، يمكنك تحديد هذا المجلد.

    لقطة شاشة تعرض المجلد الذي يحتوي على بيانات النموذج الاصطناعية.

إنشاء برنامج نصي لتسجيل النقاط

يوفر البرنامج النصي لتسجيل النقاط التالي، score.py، مثالا على كيفية إجراء الاستدلال باستخدام نموذج MLflow. يمكنك تكييف هذا البرنامج النصي لاحتياجاتك أو تغيير أي من أجزائه ليعكس السيناريو الخاص بك. لاحظ أن اسم المجلد الذي حددته مسبقا، model، مضمن في الدالة init() .

import logging
import os
import json
import mlflow
from io import StringIO
from mlflow.pyfunc.scoring_server import infer_and_parse_json_input, predictions_to_json


def init():
    global model
    global input_schema
    # "model" is the path of the mlflow artifacts when the model was registered. For automl
    # models, this is generally "mlflow-model".
    model_path = os.path.join(os.getenv("AZUREML_MODEL_DIR"), "model")
    model = mlflow.pyfunc.load_model(model_path)
    input_schema = model.metadata.get_input_schema()


def run(raw_data):
    json_data = json.loads(raw_data)
    if "input_data" not in json_data.keys():
        raise Exception("Request must contain a top level key named 'input_data'")

    serving_input = json.dumps(json_data["input_data"])
    data = infer_and_parse_json_input(serving_input, input_schema)
    predictions = model.predict(data)

    result = StringIO()
    predictions_to_json(predictions, result)
    return result.getvalue()

Warning

نصيحة MLflow 2.0: يعمل مثال البرنامج النصي لتسجيل النقاط مع MLflow 1.X وMLflow 2.X. ومع ذلك، يمكن أن تختلف تنسيقات الإدخال والإخراج المتوقعة على هذه الإصدارات. تحقق من تعريف البيئة لمعرفة إصدار MLflow الذي تستخدمه. MLflow 2.0 مدعوم فقط في Python 3.8 والإصدارات الأحدث.

إنشاء بيئة

الخطوة التالية هي إنشاء بيئة يمكنك تشغيل البرنامج النصي لتسجيل النقاط فيها. نظرا لأن النموذج هو نموذج MLflow، يتم تحديد متطلبات conda أيضا في حزمة النموذج. لمزيد من المعلومات حول الملفات المضمنة في نموذج MLflow، راجع تنسيق MLmodel. يمكنك إنشاء البيئة باستخدام تبعيات conda من الملف. ومع ذلك، تحتاج أيضا إلى تضمين الحزمة azureml-inference-server-http المطلوبة للتوزيع عبر الإنترنت في التعلم الآلي من Microsoft Azure.

يمكنك إنشاء ملف تعريف conda باسم conda.yaml يحتوي على الأسطر التالية:

channels:
- conda-forge
dependencies:
- python=3.12
- pip
- pip:
  - mlflow
  - scikit-learn==1.7.0
  - cloudpickle==3.1.1
  - psutil==7.0.0
  - pandas==2.3.0
  - azureml-inference-server-http
name: mlflow-env

Note

dependencies يتضمن قسم ملف conda هذا الحزمةazureml-inference-server-http.

استخدم ملف تبعيات conda هذا لإنشاء البيئة:

يتم إنشاء البيئة مضمنة في تكوين النشر.

إنشاء النشر

في المجلد endpoints/online/ncd، أنشئ ملف تكوين نشر، deployment.yml، يحتوي على الأسطر التالية:

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: sklearn-diabetes-custom
endpoint_name: my-endpoint
model: azureml:sklearn-diabetes@latest
environment: 
    image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04
    conda_file: sklearn-diabetes/environment/conda.yaml
code_configuration:
    code: sklearn-diabetes/src
    scoring_script: score.py
instance_type: Standard_F2s_v2
instance_count: 1

إنشاء النشر:

az ml online-deployment create -f endpoints/online/ncd/deployment.yml

خدمة الطلبات

عند اكتمال النشر الخاص بك، يكون جاهزا لخدمة الطلبات. إحدى طرق اختبار النشر هي استخدام invoke الأسلوب مع نموذج ملف طلب مثل الملف التالي، sample-request-sklearn.json:

{"input_data": {
    "columns": [
      "age",
      "sex",
      "bmi",
      "bp",
      "s1",
      "s2",
      "s3",
      "s4",
      "s5",
      "s6"
    ],
    "data": [
      [ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ],
      [ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0]
    ],
    "index": [0,1]
  }}

إرسال طلب إلى نقطة النهاية:

az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json

يجب أن تكون الاستجابة مشابهة للنص التالي:

{
    "predictions": [ 
    1095.2797413413252,
    1134.585328803727
    ]
}

Warning

نصيحة MLflow 2.0: في MLflow 1.X، لا تحتوي الاستجابة على predictions المفتاح.

تنظيف الموارد

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

az ml online-endpoint delete --name $ENDPOINT_NAME --yes