البرامج النصية لتسجيل التأليف لتوزيع الدفعات

ينطبق على:ملحق ML Azure CLI v2 (الحالي)Python SDK azure-ai-ml v2 (الحالي)

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

تلميح

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

تحذير

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

فهم البرنامج النصي لتسجيل النقاط

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

deployment.yml

code_configuration:
  code: code
  scoring_script: batch_driver.py

يجب أن يحتوي البرنامج النصي لتسجيل النقاط على طريقتين:

الأسلوب init

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

def init():
    global model

    # AZUREML_MODEL_DIR is an environment variable created during deployment
    # The path "model" is the name of the registered model's folder
    model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")

    # load the model
    model = load_model(model_path)

في هذا المثال، نضع النموذج في المتغير modelالعمومي . لتوفير الأصول المطلوبة لإجراء الاستدلال على وظيفة تسجيل النقاط، استخدم المتغيرات العمومية.

الأسلوب run

run(mini_batch: List[str]) -> Union[List[Any], pandas.DataFrame] استخدم الأسلوب لمعالجة تسجيل كل دفعة صغيرة ينشئها نشر الدفعة. يتم استدعاء هذا الأسلوب مرة واحدة لكل mini_batch تم إنشاؤه لبيانات الإدخال الخاصة بك. تقرأ عمليات توزيع الدفعات البيانات على دفعات وفقا لكيفية تكوين التوزيع.

import pandas as pd
from typing import List, Any, Union

def run(mini_batch: List[str]) -> Union[List[Any], pd.DataFrame]:
    results = []

    for file in mini_batch:
        (...)

    return pd.DataFrame(results)

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

إشعار

كيف يتم توزيع العمل؟

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

run() يجب أن يرجع الأسلوب Pandas DataFrame أو صفيف/قائمة. يشير كل عنصر إخراج تم إرجاعه إلى تشغيل واحد ناجح لعنصر إدخال في الإدخال mini_batch. بالنسبة لأصول بيانات الملف أو المجلد، يمثل كل صف/عنصر تم إرجاعه ملفا واحدا تمت معالجته. بالنسبة لأصل بيانات جدولي، يمثل كل صف/عنصر تم إرجاعه صفا في ملف تمت معالجته.

هام

كيفية كتابة التنبؤات؟

سيتم إلحاق كل شيء تقوم الدالة run() بإرجاعه في ملف تنبؤات الإخراج الذي تنشئه وظيفة الدفعة. من المهم إرجاع نوع البيانات الصحيح من هذه الدالة. إرجاع الصفائف عندما تحتاج إلى إخراج تنبؤ واحد. إرجاع Pandas DataFrames عندما تحتاج إلى إرجاع أجزاء متعددة من المعلومات. على سبيل المثال، بالنسبة للبيانات الجدولية، قد تحتاج إلى إلحاق تنبؤاتك بالسجل الأصلي. استخدم pandas DataFrame للقيام بذلك. على الرغم من أن pandas DataFrame قد يحتوي على أسماء أعمدة، فإن ملف الإخراج لا يتضمن هذه الأسماء.

لكتابة التنبؤات بطريقة مختلفة، يمكنك تخصيص المخرجات في عمليات نشر الدفعات.

تحذير

في الدالة run ، لا تقم لإخراج أنواع البيانات المعقدة (أو قوائم أنواع البيانات المعقدة) بدلا من pandas.DataFrame. سيتم تحويل هذه المخرجات إلى سلاسل وسيصبح من الصعب قراءتها.

يتم إلحاق DataFrame أو الصفيف الناتج إلى ملف الإخراج المشار إليه. لا يوجد أي شرط حول العلاقة الأساسية للنتائج. يمكن أن يقوم ملف واحد بإنشاء 1 أو العديد من الصفوف/العناصر في الإخراج. تتم كتابة جميع العناصر في النتيجة DataFrame أو الصفيف إلى ملف الإخراج كما هو (مع الأخذ في output_action الاعتبار أن ليس summary_only).

حزم Python لتسجيل النقاط

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

mnist/environment/conda.yaml

name: mnist-env
channels:
  - conda-forge
dependencies:
  - python=3.8.5
  - pip<22.0
  - pip:
    - torch==1.13.0
    - torchvision==0.14.0
    - pytorch-lightning
    - pandas
    - azureml-core
    - azureml-dataset-runtime[fuse]

تفضل بزيارة إنشاء نشر دفعة للحصول على مزيد من المعلومات حول كيفية الإشارة إلى بيئة النموذج الخاص بك.

كتابة التنبؤات بطريقة مختلفة

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

  • تنسيق الملف (CSV وparquet وjson وما إلى ذلك) المستخدم لكتابة التنبؤات
  • طريقة تقسيم البيانات في الإخراج

تفضل بزيارة تخصيص المخرجات في عمليات توزيع الدفعات للحصول على مزيد من المعلومات حول كيفية تحقيق ذلك.

التحكم بالمصادر في البرامج النصية لتسجيل النقاط

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

أفضل الممارسات لكتابة البرامج النصية لتسجيل النقاط

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

  • حجم كل ملف
  • كمية البيانات على كل ملف
  • مقدار الذاكرة المطلوبة لقراءة كل ملف
  • مقدار الذاكرة المطلوبة لقراءة دفعة كاملة من الملفات
  • بصمة ذاكرة النموذج
  • بصمة ذاكرة النموذج، عند التشغيل عبر بيانات الإدخال
  • الذاكرة المتوفرة في الحساب الخاص بك

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

العلاقة بين درجة التوازي والبرنامج النصي لتسجيل النقاط

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

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

تشغيل الاستدلال على مستوى الدفعة المصغرة أو الملف أو الصف

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

مستوى دفعة صغيرة

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

تحذير

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

تفضل بزيارة عمليات توزيع معدل النقل العالي لمعرفة كيفية تحقيق ذلك. يعالج هذا المثال دفعة كاملة من الملفات في كل مرة.

مستوى الملف

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

تلميح

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

تفضل بزيارة معالجة الصور مع عمليات نشر الدفعات لمعرفة كيفية القيام بذلك. يعالج هذا المثال ملفا في كل مرة.

مستوى الصف (جدولي)

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

تفضل بزيارة معالجة النص مع عمليات نشر الدفعات لمعرفة كيفية القيام بذلك. يعالج هذا المثال صفا في كل مرة.

استخدام النماذج التي هي مجلدات

AZUREML_MODEL_DIR يحتوي متغير البيئة على المسار إلى موقع النموذج المحدد، وعادة ما تستخدمه الدالة init() لتحميل النموذج في الذاكرة. ومع ذلك، قد تحتوي بعض النماذج على ملفاتها في مجلد، وقد تحتاج إلى حساب ذلك عند تحميلها. يمكنك تحديد بنية مجلد النموذج الخاص بك كما هو موضح هنا:

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

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

  3. حدد النموذج الذي تريد نشره، وحدد علامة التبويب Artifacts .

  4. لاحظ المجلد المعروض. تمت الإشارة إلى هذا المجلد عند تسجيل النموذج.

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

استخدم هذا المسار لتحميل النموذج:

def init():
    global model

    # AZUREML_MODEL_DIR is an environment variable created during deployment
    # The path "model" is the name of the registered model's folder
    model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")

    model = load_model(model_path)

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