قم بنشر نماذج MLflow إلى نقاط النهاية عبر الإنترنت
ينطبق على:ملحق CLI للتعلم الآلي من Microsoft Azure v2 (الحالي)
في هذه المقالة، تعرف على كيفية نشر نموذج MLflow الخاص بك إلى نقطة نهاية عبر الإنترنت للاستدلال في الوقت الحقيقي. عند نشر نموذج MLflow الخاص بك إلى نقطة نهاية عبر الإنترنت، لا تحتاج إلى تحديد برنامج نصي لتسجيل النقاط أو بيئة - تعرف هذه الوظيفة باسم نشر بدون تعليمات برمجية.
بالنسبة إلى عدم نشر التعليمات البرمجية، التعلم الآلي Azure:
- تثبيت حزم Python المتوفرة
conda.yaml
في الملف ديناميكيا. ومن ثم، يتم تثبيت التبعيات أثناء وقت تشغيل الحاوية. - يوفر صورة أساسية MLflow/ بيئة منسقة تحتوي على العناصر التالية:
azureml-inference-server-http
mlflow-skinny
- برنامج نصي لتسجيل النقاط للاستدلال.
تلميح
مساحات العمل دون الوصول إلى الشبكة العامة: قبل أن تتمكن من نشر نماذج 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 CLI والملحق
الاتصال بمساحة العمل
أولا، اتصل بمساحة عمل 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 إلى نقطة نهاية عبر الإنترنت
تكوين نقطة النهاية حيث سيتم نشر النموذج. يقوم المثال التالي بتكوين الاسم ووضع المصادقة لنقطة النهاية:
تعيين اسم نقطة نهاية عن طريق تشغيل الأمر التالي (استبدل
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
أنشئ نقطة النهاية:
az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.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: 1 path: sklearn-diabetes/model type: mlflow_model instance_type: Standard_DS3_v2 instance_count: 1
إشعار
يتم دعم الإنشاء التلقائي ل
scoring_script
وenvironment
فقط لنكهةpyfunc
النموذج. لاستخدام نكهة نموذج مختلفة، راجع تخصيص عمليات توزيع نموذج MLflow.إنشاء التوزيع:
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
تعيين كافة نسبة استخدام الشبكة إلى النشر. حتى الآن، تحتوي نقطة النهاية على نشر واحد، ولكن لم يتم تعيين أي من حركة المرور الخاصة بها إليها.
هذه الخطوة غير مطلوبة في Azure CLI، حيث استخدمت العلامة
--all-traffic
أثناء الإنشاء. إذا كنت بحاجة إلى تغيير حركة المرور، يمكنك استخدام الأمرaz ml online-endpoint update --traffic
. لمزيد من المعلومات حول كيفية تحديث حركة المرور، راجع تحديث نسبة استخدام الشبكة تدريجيا.تحديث تكوين نقطة النهاية:
هذه الخطوة غير مطلوبة في 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 مع برنامج نصي مخصص لتسجيل النقاط:
حدد المجلد حيث يوجد نموذج MLflow الخاص بك.
أ. انتقل إلى "Azure التعلم الآلي studio".
ب. انتقل إلى قسم Models .
جـ. حدد النموذج الذي تحاول نشره وانتقل إلى علامة التبويب Artifacts الخاصة به.
د. دون المجلد الذي يتم عرضه. تم تحديد هذا المجلد عند تسجيل النموذج.
إنشاء برنامج نصي لتسجيل النقاط. لاحظ كيفية تضمين اسم
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+.
إنشاء بيئة حيث يمكن تنفيذ البرنامج النصي لتسجيل النقاط. نظرا لأن النموذج هو نموذج 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 هذا لإنشاء البيئة:
سيتم إنشاء البيئة مضمنة في تكوين النشر.
إنشاء التوزيع:
إنشاء ملف تكوين نشر 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
بمجرد اكتمال النشر الخاص بك، يكون جاهزا لخدمة الطلبات. إحدى طرق اختبار النشر هي باستخدام نموذج ملف طلب مع
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