توزيع نماذج MLflow وتشغيلها في وظائف Spark

في هذه المقالة، تعرف على كيفية نشر نموذج MLflow وتشغيله في وظائف Spark لإجراء استدلال على كميات كبيرة من البيانات أو كجزء من مهام متشابكة للبيانات.

حول هذا المثال

يوضح هذا المثال كيف يمكنك نشر نموذج MLflow المسجل في Azure التعلم الآلي إلى وظائف Spark التي تعمل في مجموعات Spark المدارة (معاينة) أو Azure Databricks أو Azure Synapse Analytics، لإجراء الاستدلال على كميات كبيرة من البيانات.

يستند النموذج إلى مجموعة بيانات أمراض القلب UCI. تحتوي قاعدة البيانات على 76 سمة، لكننا نستخدم مجموعة فرعية من 14 منها. يحاول النموذج التنبؤ بوجود مرض القلب في المريض. وهو عدد صحيح يقدر من 0 (بدون حضور) إلى 1 (حالة حضور). وقد تم تدريبه باستخدام XGBBoost مصنف وتم حزم جميع المعالجة المسبقة المطلوبة كبنية scikit-learn أساسية لبرنامج ربط العمليات التجارية، مما يجعل هذا النموذج مسارا من طرف إلى طرف ينتقل من البيانات الأولية إلى التنبؤات.

تستند المعلومات الواردة في هذه المقالة إلى نماذج التعليمات البرمجية الموجودة في مستودع azureml-examples. لتشغيل الأوامر محليا دون الحاجة إلى نسخ/لصق الملفات، قم باستنساخ المستودع، ثم قم بتغيير الدلائل إلى sdk/using-mlflow/deploy.

git clone https://github.com/Azure/azureml-examples --depth 1
cd sdk/python/using-mlflow/deploy

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

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

  • قم بتثبيت حزمة mlflow MLflow SDK والمكون الإضافي Azure التعلم الآلي ل MLflow azureml-mlflow.

    pip install mlflow azureml-mlflow
    

    تلميح

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

  • مساحة عمل للتعلم الآلي من Microsoft Azure. يمكنك إنشاء واحد باتباع البرنامج التعليمي إنشاء موارد التعلم الآلي.

  • إذا كنت تقوم بإجراء تعقب عن بعد (أي تعقب التجارب التي تعمل خارج Azure التعلم الآلي)، فبادر بتكوين MLflow للإشارة إلى تعقب URI لمساحة عمل Azure التعلم الآلي. لمزيد من المعلومات حول كيفية توصيل MLflow بمساحة العمل الخاصة بك، راجع تكوين MLflow ل Azure التعلم الآلي.

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

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

أولا، دعنا نتصل بمساحة عمل Azure التعلم الآلي حيث تم تسجيل النموذج الخاص بك.

تم تكوين التعقب بالفعل لك. سيتم أيضا استخدام بيانات الاعتماد الافتراضية عند العمل مع MLflow.

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

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

model_name = 'heart-classifier'
model_local_path = "model"

registered_model = mlflow_client.create_model_version(
    name=model_name, source=f"file://{model_local_path}"
)
version = registered_model.version

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

تلميح

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

model_name = 'heart-classifier'

registered_model = mlflow_client.create_model_version(
    name=model_name, source=f"runs://{RUN_ID}/{MODEL_PATH}"
)
version = registered_model.version

إشعار

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


الحصول على بيانات الإدخال للتسجيل

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

import urllib

urllib.request.urlretrieve("https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data/heart.csv", "/tmp/data")

نقل البيانات إلى حساب تخزين مثبت متوفر للمجموعة بأكملها.

dbutils.fs.mv("file:/tmp/data", "dbfs:/")

هام

تستخدم dbutilsالتعليمات البرمجية السابقة ، وهي أداة متوفرة في مجموعة Azure Databricks. استخدم الأداة المناسبة اعتمادا على النظام الأساسي الذي تستخدمه.

ثم يتم وضع بيانات الإدخال في المجلد التالي:

input_data_path = "dbfs:/data"

تشغيل النموذج في مجموعات Spark

يشرح القسم التالي كيفية تشغيل نماذج MLflow المسجلة في Azure التعلم الآلي في وظائف Spark.

  1. تأكد من تثبيت المكتبات التالية في نظام المجموعة:

    - mlflow<3,>=2.1
    - cloudpickle==2.2.0
    - scikit-learn==1.2.0
    - xgboost==1.7.2
    
  2. سنستخدم دفتر ملاحظات لتوضيح كيفية إنشاء روتين تسجيل باستخدام نموذج MLflow مسجل في Azure التعلم الآلي. إنشاء دفتر ملاحظات واستخدام PySpark كلغة افتراضية.

  3. استيراد مساحات الأسماء المطلوبة:

    import mlflow
    import pyspark.sql.functions as f
    
  4. تكوين URI النموذج. يجلب URI التالي نموذجا مسمى heart-classifier في أحدث إصدار له.

    model_uri = "models:/heart-classifier/latest"
    
  5. تحميل النموذج كدالة UDF. الدالة المعرفة من قبل المستخدم (UDF) هي دالة يحددها المستخدم، ما يسمح بإعادة استخدام المنطق المخصص في بيئة المستخدم.

    predict_function = mlflow.pyfunc.spark_udf(spark, model_uri, result_type='double') 
    

    تلميح

    استخدم الوسيطة result_type للتحكم في النوع الذي تم إرجاعه بواسطة الدالة predict() .

  6. اقرأ البيانات التي تريد تسجيلها:

    df = spark.read.option("header", "true").option("inferSchema", "true").csv(input_data_path).drop("target")
    

    في حالتنا، تكون بيانات الإدخال بتنسيق CSV ويتم وضعها في المجلد dbfs:/data/. كما أننا نسقط العمود target لأن مجموعة البيانات هذه تحتوي على المتغير الهدف للتنبؤ به. في سيناريوهات الإنتاج، لن تحتوي بياناتك على هذا العمود.

  7. قم بتشغيل الدالة predict_function ووضع التنبؤات على عمود جديد. في هذه الحالة، نضع التنبؤات في العمود predictions.

    df.withColumn("predictions", score_function(*df.columns))
    

    تلميح

    يتلقى predict_function كوسيطات الأعمدة المطلوبة. في حالتنا، يتوقع النموذج جميع أعمدة إطار البيانات ومن ثم df.columns يتم استخدامها. إذا كان النموذج الخاص بك يتطلب مجموعة فرعية من الأعمدة، يمكنك تقديمها يدويا. إذا كان النموذج يحتوي على توقيع، يجب أن تكون الأنواع متوافقة بين المدخلات والأنواع المتوقعة.

  8. يمكنك كتابة تنبؤاتك مرة أخرى إلى التخزين:

    scored_data_path = "dbfs:/scored-data"
    scored_data.to_csv(scored_data_path)
    

تشغيل النموذج في مهمة Spark مستقلة في Azure التعلم الآلي

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

إشعار

لمعرفة المزيد حول وظائف Spark في Azure التعلم الآلي، راجع إرسال مهام Spark في Azure التعلم الآلي (معاينة).

  1. تتطلب مهمة Spark برنامج نصي Python يأخذ وسيطات. إنشاء برنامج نصي لتسجيل النقاط:

    score.py

    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument("--model")
    parser.add_argument("--input_data")
    parser.add_argument("--scored_data")
    
    args = parser.parse_args()
    print(args.model)
    print(args.input_data)
    
    # Load the model as an UDF function
    predict_function = mlflow.pyfunc.spark_udf(spark, args.model, env_manager="conda")
    
    # Read the data you want to score
    df = spark.read.option("header", "true").option("inferSchema", "true").csv(input_data).drop("target")
    
    # Run the function `predict_function` and place the predictions on a new column
    scored_data = df.withColumn("predictions", score_function(*df.columns))
    
    # Save the predictions
    scored_data.to_csv(args.scored_data)
    

    يأخذ البرنامج النصي أعلاه ثلاث وسيطات --modelو--input_data.--scored_data الأولان هما المدخلات ويمثلان النموذج الذي نريد تشغيله وبيانات الإدخال، والأخير هو الإخراج وهو مجلد الإخراج حيث سيتم وضع التنبؤات.

    تلميح

    تثبيت حزم Python: يقوم البرنامج النصي السابق لتسجيل النقاط بتحميل نموذج MLflow في دالة UDF، ولكنه يشير إلى المعلمة env_manager="conda". عند تعيين هذه المعلمة، سيقوم MLflow باستعادة الحزم المطلوبة كما هو محدد في تعريف النموذج في بيئة معزولة حيث يتم تشغيل وظيفة UDF فقط. لمزيد من التفاصيل، راجع mlflow.pyfunc.spark_udf الوثائق.

  2. إنشاء تعريف وظيفة:

    mlflow-score-spark-job.yml

    $schema: http://azureml/sdk-2-0/SparkJob.json
    type: spark
    
    code: ./src
    entry:
      file: score.py
    
    conf:
      spark.driver.cores: 1
      spark.driver.memory: 2g
      spark.executor.cores: 2
      spark.executor.memory: 2g
      spark.executor.instances: 2
    
    inputs:
      model:
        type: mlflow_model
        path: azureml:heart-classifier@latest
      input_data:
        type: uri_file
        path: https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data/heart.csv
        mode: direct
    
    outputs:
      scored_data:
        type: uri_folder
    
    args: >-
      --model ${{inputs.model}}
      --input_data ${{inputs.input_data}}
      --scored_data ${{outputs.scored_data}}
    
    identity:
      type: user_identity
    
    resources:
      instance_type: standard_e4s_v3
      runtime_version: "3.2"
    

    تلميح

    لاستخدام تجمع Synapse Spark مرفق، حدد compute الخاصية في نموذج ملف مواصفات YAML الموضح أعلاه بدلا من الخاصية resources .

  3. يمكن استخدام ملفات YAML الموضحة az ml job create أعلاه في الأمر ، مع المعلمة --file ، لإنشاء مهمة Spark مستقلة كما هو موضح:

    az ml job create -f mlflow-score-spark-job.yml
    

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