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

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

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

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

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

تلميح

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

حول المثال

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

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

تستند المعلومات الواردة في هذه المقالة إلى نماذج التعليمات البرمجية الموجودة في مستودع azureml-examples. لتشغيل الأوامر محليا دون الحاجة إلى نسخ/لصق YAML والملفات الأخرى، قم باستنساخ المستودع، ثم قم بتغيير الدلائل إلى cli، إذا كنت تستخدم Azure CLI. إذا كنت تستخدم Azure التعلم الآلي SDK ل Python، فقم بتغيير الدلائل إلى sdk/python/endpoints/online/mlflow.

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

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

يمكنك اتباع الخطوات لاستخدام Azure التعلم الآلي Python SDK عن طريق فتح نموذج Deploy MLflow إلى دفتر ملاحظات نقاط النهاية عبر الإنترنت في المستودع المستنسخ.

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

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

  • اشتراك Azure. في حال لم يكن لديك اشتراك Azure، فأنشئ حساباً مجانيّاً قبل البدء. جرّب الإصدار المجاني أو المدفوع من «التعلم الآلي» من Azure.

  • يتم استخدام عناصر التحكم في الوصول المستندة إلى الدور في (Azure RBAC) لمنح الوصول إلى العمليات في التعلم الآلي من Microsoft Azure. لتنفيذ الخطوات الواردة في هذه المقالة، يجب تعيين دور المالك أو المساهم لحساب المستخدم الخاص بك لمساحة عمل Azure التعلم الآلي، أو دور مخصص يسمح .Microsoft.MachineLearningServices/workspaces/onlineEndpoints/* لمزيد من المعلومات حول الأدوار، راجع إدارة الوصول إلى مساحة عمل Azure التعلم الآلي.

  • يجب أن يكون لديك نموذج MLflow مسجل في مساحة العمل الخاصة بك. تسجل هذه المقالة نموذجا مدربا لمجموعة بيانات Diabetes في مساحة العمل.

  • تحتاج أيضا إلى:

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

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

أولا، اتصل بمساحة عمل Azure التعلم الآلي حيث ستعمل.

az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> 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 التعلم الآلي CLI v2 لإنشاء نموذج من إخراج مهمة تدريبية. في المثال التالي، يتم تسجيل نموذج مسمى $MODEL_NAME باستخدام البيانات الاصطناعية لوظيفة ذات المعرف $RUN_ID. المسار حيث يتم تخزين النموذج هو $MODEL_PATH.

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

إشعار

المسار $MODEL_PATH هو الموقع الذي تم تخزين النموذج فيه في التشغيل.

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

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

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

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    

    تكوين نقطة النهاية:

    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. تكوين النشر. يشكل التوزيع مجموعة من الموارد اللازمة لاستضافة النموذج الذي يقوم بالاستدلال الفعلي.

    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: 1
      path: sklearn-diabetes/model
      type: mlflow_model
    instance_type: Standard_DS3_v2
    instance_count: 1
    

    إشعار

    يتم دعم الإنشاء التلقائي ل 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
    

    إذا لم يكن لدى نقطة النهاية اتصال خروج، فاستخدم حزمة النموذج (معاينة) عن طريق تضمين العلامة --with-package:

    az ml online-deployment create --with-package --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. لمزيد من المعلومات حول كيفية تحديث حركة المرور، راجع تحديث نسبة استخدام الشبكة تدريجيا.

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

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

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

إشعار

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

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

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

سيكون الرد مشابهًا للنص التالي:

[ 
  11633.100167144921,
  8522.117402884991
]

هام

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

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

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

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

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

هام

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

‏‏الخطوات

لنشر نموذج MLflow مع برنامج نصي مخصص لتسجيل النقاط:

  1. حدد المجلد حيث يوجد نموذج MLflow الخاص بك.

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

    ب. انتقل إلى قسم Models .

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

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

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

  2. إنشاء برنامج نصي لتسجيل النقاط. لاحظ كيفية تضمين اسم model المجلد الذي حددته مسبقا في الدالة init() .

    تلميح

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

    score.py

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

    تحذير

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

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

    ملف تعريف conda كما يلي:

    conda.yml

    channels:
    - conda-forge
    dependencies:
    - python=3.9
    - pip
    - pip:
      - mlflow
      - scikit-learn==1.2.2
      - cloudpickle==2.2.1
      - psutil==5.9.4
      - pandas==2.0.0
      - azureml-inference-server-http
    name: mlflow-env
    

    إشعار

    azureml-inference-server-http تمت إضافة الحزمة إلى ملف تبعيات conda الأصلي.

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

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

  4. إنشاء التوزيع:

    إنشاء ملف تكوين نشر 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.yml
    code_configuration:
      code: sklearn-diabetes/src
      scoring_script: score.py
    instance_type: Standard_F2s_v2
    instance_count: 1
    

    إنشاء التوزيع:

    az ml online-deployment create -f deployment.yml
    
  5. بمجرد اكتمال النشر الخاص بك، يكون جاهزا لخدمة الطلبات. إحدى طرق اختبار النشر هي باستخدام نموذج ملف طلب مع 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": [ 
        11633.100167144921,
        8522.117402884991
      ]
    }
    

    تحذير

    نصيحة MLflow 2.0: في MLflow 1.X، predictions سيكون المفتاح مفقودا.

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

بمجرد الانتهاء من استخدام نقطة النهاية، احذف الموارد المقترنة بها:

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