استكشاف أخطاء خطوط أنابيب التعلم الآلي وإصلاحها

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

نصائح استكشاف الأخطاء وإصلاحها

يحتوي الجدول التالي على مشاكل شائعة أثناء تطوير خط الأنابيب ، مع الحلول المحتملة.

مشكلة الحل الممكن
غير قادر على تمرير البيانات إلى PipelineData الدليل تأكد من إنشاء دليل في البرنامج النصي يتوافق مع المكان الذي يتوقع فيه خط الأنابيب بيانات إخراج الخطوة. في معظم الحالات، ستقوم وسيطة إدخال بتعريف دليل الإخراج، ومن ثم إنشاء الدليل بشكل صريح. استخدم os.makedirs(args.output_dir, exist_ok=True) لإنشاء دليل الإخراج. راجع البرنامج التعليمي للحصول على مثال على برنامج نصي لتسجيل النقاط يعرض نمط التصميم هذا.
أخطاء التبعية إذا رأيت أخطاء تبعية في خط الأنابيب البعيد لم تحدث عند الاختبار محليا، فتأكد من تطابق تبعيات البيئة البعيدة والإصدارات الموجودة في بيئة الاختبار الخاصة بك. (انظر بناء البيئة والتخزين المؤقت وإعادة الاستخدام
أخطاء غامضة مع أهداف الحوسبة حاول حذف أهداف الحوسبة وإعادة إنشائها. إعادة إنشاء أهداف الحوسبة سريعة ويمكن أن تحل بعض المشكلات العابرة.
خطوات عدم إعادة استخدام خط الأنابيب يتم تمكين إعادة استخدام الخطوة بشكل افتراضي، ولكن تأكد من عدم تعطيلها في خطوة خط الأنابيب. إذا تم تعطيل إعادة الاستخدام، تعيين المعلمة allow_reuse في الخطوة إلى False.
إعادة تشغيل خط الأنابيب دون داع لضمان إعادة تشغيل الخطوات فقط عند تغيير البيانات أو البرامج النصية الأساسية، قم بفصل أدلة التعليمات البرمجية المصدر لكل خطوة. إذا كنت تستخدم نفس الدليل المصدر لخطوات متعددة، قد تواجه عمليات إعادة تشغيل غير ضرورية. استخدم المعلمة الموجودة على كائن خطوة خط أنابيب للإشارة إلى الدليل المعزول لتلك الخطوة source_directory ، وتأكد من أنك لا تستخدم نفس source_directory المسار لخطوات متعددة.
إبطاء الخطوات خلال فترات التدريب أو غيرها من السلوكيات الحلقية حاول تبديل أي عمليات كتابة للملفات، بما في ذلك التسجيل، من as_mount() إلى as_upload(). يستخدم وضع التحميل نظام ملفات افتراضي بعيد ويقوم بتحميل الملف بأكمله في كل مرة يتم إلحاقه بها.
يستغرق حساب الهدف وقتا طويلا للبدء يتم تحميل صور Docker لأهداف الحوسبة من سجل حاويات Azure (ACR). بشكل افتراضي، يقوم Azure التعلم الآلي بإنشاء ACR يستخدم طبقة الخدمة الأساسية. قد يؤدي تغيير ACR لمساحة العمل الخاصة بك إلى المستوى القياسي أو المتميز إلى تقليل الوقت المستغرق لإنشاء الصور وتحميلها. لمزيد من المعلومات، راجع طبقات خدمة تسجيل حاوية Azure.

أخطاء المصادقة

إذا قمت بتنفيذ عملية إدارة على هدف حساب من مهمة بعيدة، فستتلقى أحد الأخطاء التالية:

{"code":"Unauthorized","statusCode":401,"message":"Unauthorized","details":[{"code":"InvalidOrExpiredToken","message":"The request token was either invalid or expired. Please try again with a valid token."}]}
{"error":{"code":"AuthenticationFailed","message":"Authentication failed."}}

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

استكشاف الاخطاء ParallelRunStep

يجب أن يحتوي البرنامج النصي ل ParallelRunStepيجب أن يحتوي على وظيفتين:

  • init()استخدم هذه الوظيفة لأي إعداد مكلف أو شائع للاستدلال اللاحق.: على سبيل المثال، استخدمه لتحميل النموذج إلى كائن عمومي. سيتم استدعاء هذه الوظيفة مرة واحدة فقط في بداية العملية.
  • run(mini_batch)سيتم تشغيل الدالة لكل mini_batch مثيل.:
    • mini_batchسوف يستدعي طريقة التشغيل ويمرر إما قائمة أو الباندا كوسيطة DataFrame إلى الطريقة.: ParallelRunStep سيكون كل إدخال في mini_batch مسار ملف إذا كان الإدخال عبارة عن باندا أو باندا DataFrame إذا كان الإدخال عبارة عن FileDatasetTabularDatasetملف .
    • responseيجب أن ترجع طريقة run() الباندا DataFrame أو الصفيف.: على سبيل append_row output_action، يتم إلحاق هذه العناصر التي تم إرجاعها في ملف الإخراج الشائع. على سبيل summary_only ، يتم تجاهل محتويات العناصر. بالنسبة لجميع إجراءات الإخراج، يشير كل عنصر إخراج تم إرجاعه إلى تشغيل واحد ناجح لعنصر الإدخال في دفعة الإدخال المصغرة. تأكد من تضمين بيانات كافية في نتيجة التشغيل لتعيين الإدخال لتشغيل نتيجة الإخراج. سيتم كتابة إخراج التشغيل في ملف الإخراج وليس مضمونا أن يكون بالترتيب ، يجب عليك استخدام بعض المفاتيح في الإخراج لتعيينه إلى الإدخال.
%%writefile digit_identification.py
# Snippets from a sample script.
# Refer to the accompanying digit_identification.py
# (https://github.com/Azure/MachineLearningNotebooks/tree/master/how-to-use-azureml/machine-learning-pipelines/parallel-run)
# for the implementation script.

import os
import numpy as np
import tensorflow as tf
from PIL import Image
from azureml.core import Model


def init():
    global g_tf_sess

    # Pull down the model from the workspace
    model_path = Model.get_model_path("mnist")

    # Construct a graph to execute
    tf.reset_default_graph()
    saver = tf.train.import_meta_graph(os.path.join(model_path, 'mnist-tf.model.meta'))
    g_tf_sess = tf.Session()
    saver.restore(g_tf_sess, os.path.join(model_path, 'mnist-tf.model'))


def run(mini_batch):
    print(f'run method start: {__file__}, run({mini_batch})')
    resultList = []
    in_tensor = g_tf_sess.graph.get_tensor_by_name("network/X:0")
    output = g_tf_sess.graph.get_tensor_by_name("network/output/MatMul:0")

    for image in mini_batch:
        # Prepare each image
        data = Image.open(image)
        np_im = np.array(data).reshape((1, 784))
        # Perform inference
        inference_result = output.eval(feed_dict={in_tensor: np_im}, session=g_tf_sess)
        # Find the best probability, and add it to the result list
        best_result = np.argmax(inference_result)
        resultList.append("{}: {}".format(os.path.basename(image), best_result))

    return resultList

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

script_dir = os.path.realpath(os.path.join(__file__, '..',))
file_path = os.path.join(script_dir, "<file_name>")

معلمات ل ParallelRunConfig

ParallelRunConfigهو التكوين الرئيسي على سبيل ParallelRunStep المثال داخل خط أنابيب Azure التعلم الآلي. يمكنك استخدامه لالتفاف البرنامج النصي وتكوين المعلمات الضرورية، بما في ذلك كافة الإدخالات التالية:

  • entry_scriptبرنامج نصي للمستخدم كمسار ملف محلي سيتم تشغيله بالتوازي على عقد متعددة.: إذا كان source_directory موجودا، فاستخدم مسارا نسبيا. وإلا، فاستخدم أي مسار يمكن الوصول إليه على الجهاز.
  • mini_batch_sizeتم تمرير حجم الدفعة المصغرة إلى مكالمة واحدة run() .: (اختياري؛ القيمة الافتراضية هي 10 الملفات الخاصة FileDataset ب .)1MBTabularDataset
    • بالنسبة إلى FileDataset، إنه عدد الملفات التي لا تقل قيمتها عن 1. يمكنك دمج ملفات متعددة في دفعة واحدة مصغرة.
    • بالنسبة ل TabularDataset، إنه حجم البيانات. مثال على القيم هي 1024، ، ، 1024KB10MBو 1GB. القيمة الموصى بها هي 1MB. لن تعبر الدفعة المصغرة من TabularDataset حدود الملف أبدا. على سبيل المثال، إذا كان لديك .csv الملفات بأحجام مختلفة، فإن أصغر ملف هو 100 كيلوبايت وأكبرها هو 10 ميغابايت. إذا قمت بتعيين mini_batch_size = 1MB، التعامل مع الملفات ذات الحجم الأصغر من 1 ميغابايت كدفعة صغيرة واحدة. سيتم تقسيم الملفات التي يزيد حجمها عن 1 ميغابايت إلى دفعات صغيرة متعددة.
  • error_thresholdيجب تجاهل عدد حالات فشل TabularDataset السجلات وفشل FileDataset الملفات الخاصة بذلك أثناء المعالجة.: إذا تجاوز عدد الأخطاء للإدخال بأكمله هذه القيمة، إحباط المهمة. عتبة الخطأ هي للإدخال بأكمله وليس للدفعة المصغرة الفردية المرسلة إلى run() الطريقة. النطاق هو [-1, int.max]. -1 يشير الجزء إلى تجاهل جميع حالات الفشل أثناء المعالجة.
  • output_actionتشير إحدى القيم التالية إلى كيفية تنظيم المخرجات.:
    • summary_onlyسيقوم البرنامج النصي للمستخدم بتخزين الإخراج.: ParallelRunStep سيستخدم الإخراج فقط لحساب عتبة الخطأ.
    • append_rowبالنسبة لجميع المدخلات، سيتم إنشاء ملف واحد فقط في مجلد المخرجات لإلحاق جميع المخرجات مفصولة بسطر.:
  • append_row_file_nameلتخصيص اسم ملف الإخراج append_row output_action (اختياري؛ القيمة الافتراضية هي parallel_run_step.txt):
  • source_directoryمسارات إلى المجلدات التي تحتوي على كافة الملفات المراد تنفيذها على هدف الحوسبة (اختياري).:
  • compute_targetAmlCompute مدعوم فقط.:
  • node_countعدد عقد الحوسبة التي سيتم استخدامها لتشغيل البرنامج النصي للمستخدم.:
  • process_count_per_nodeعدد العمليات لكل عقدة.: أفضل الممارسات هي التعيين على عدد GPU أو وحدة المعالجة المركزية التي تحتوي عليها عقدة واحدة (اختياري ؛ القيمة الافتراضية هي 1).
  • environmentتعريف بيئة بايثون.: يمكنك تكوينه لاستخدام بيئة Python موجودة أو لإعداد بيئة مؤقتة. التعريف مسؤول أيضا عن تعيين تبعيات التطبيق المطلوبة (اختياري).
  • logging_levelسجل الإسهاب.: القيم في زيادة الإسهاب هي: WARNING، ، INFOو DEBUG. (اختياري؛ القيمة الافتراضية هي INFO)
  • run_invocation_timeoutrun() طريقة استدعاء المهلة في ثوان.: (اختياري؛ القيمة الافتراضية هي 60)
  • run_max_tryالحد الأقصى لعدد المحاولات run() لدفعة صغيرة.: فشل A إذا تم run() طرح استثناء ، أو لم يتم إرجاع أي شيء عند run_invocation_timeout الوصول إليه (اختياري ؛ القيمة الافتراضية هي 3).

يمكنك تحديد mini_batch_size، ، ، ، ، ، process_count_per_noderun_invocation_timeoutlogging_levelو run_max_try ك PipelineParameter، بحيث عند إعادة إرسال تشغيل خط أنابيب ، node_countيمكنك ضبط قيم المعلمات. في هذا المثال، يمكنك استخدام PipelineParametermini_batch_size هذه القيم وستقوم Process_count_per_node بتغييرها عند إعادة إرسال عملية تشغيل لاحقا.

معلمات لإنشاء ParallelRunStep

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

  • nameاسم الخطوة، مع قيود التسمية التالية: فريد، 3-32 حرفا، وregex ^[a-z]([-a-z0-9]*[a-z0-9])؟$.:
  • parallel_run_configكائن، كما هو ParallelRunConfig معرف سابقا.:
  • inputsواحد أو أكثر من Azure أحادي النوع التعلم الآلي مجموعات البيانات التي سيتم تقسيمها للمعالجة المتوازية.:
  • side_inputsواحد أو أكثر من البيانات المرجعية أو مجموعات البيانات المستخدمة كمدخلات جانبية دون الحاجة إلى تقسيمها.:
  • outputOutputFileDatasetConfig كائن يتوافق مع دليل الإخراج.:
  • argumentsقائمة بالوسيطات التي تم تمريرها إلى البرنامج النصي للمستخدم.: استخدم unknown_args لاستردادها في البرنامج النصي للإدخال (اختياري).
  • allow_reuseما إذا كان يجب على الخطوة إعادة استخدام النتائج السابقة عند تشغيلها بنفس الإعدادات/المدخلات.: إذا كانت هذه المعلمة ، Falseفسيتم دائما إنشاء تشغيل جديد لهذه الخطوة أثناء تنفيذ خط الأنابيب. (اختياري؛ القيمة الافتراضية هي True.)
from azureml.pipeline.steps import ParallelRunStep

parallelrun_step = ParallelRunStep(
    name="predict-digits-mnist",
    parallel_run_config=parallel_run_config,
    inputs=[input_mnist_ds_consumption],
    output=output_dir,
    allow_reuse=True
)

تقنيات تصحيح الأخطاء

هناك ثلاث تقنيات رئيسية لتصحيح أخطاء خطوط الأنابيب:

  • تصحيح خطوات خط الأنابيب الفردية على الكمبيوتر المحلي الخاص بك
  • استخدام التسجيل Insights التطبيق لعزل وتشخيص مصدر المشكلة
  • إرفاق مصحح أخطاء عن بعد بخط أنابيب يعمل في Azure

تصحيح البرامج النصية محليا

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

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

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

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

  • إرفاق تكوين تصحيح مخصص
  • إيقاف التنفيذ مؤقتا وفحص حالة الكائن
  • التقاط الأخطاء الكتابية أو المنطقية التي لن يتم كشفها حتى وقت التشغيل

تلميح

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

تكوين سجلات خطوط الأنابيب والكتابة إليها ومراجعتها

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

خيارات التسجيل والسلوك

يوفر الجدول أدناه معلومات عن خيارات تصحيح الأخطاء المختلفة لخطوط الأنابيب. إنها ليست قائمة شاملة ، حيث توجد خيارات أخرى إلى جانب خيارات Azure التعلم الآلي و Python و OpenCensus الموضحة هنا.

المكتبة النوع مثال الوجهة الموارد
Azure التعلم الآلي SDK متري run.log(name, val) Azure التعلم الآلي Portal UI كيفية تتبع التجارب
azureml.core.Run class
طباعة / تسجيل بايثون سجل print(val)
logging.info(message)
Driver logs, Azure التعلم الآلي designer كيفية تتبع التجارب

تسجيل بايثون
OpenCensus Python سجل logger.addHandler(AzureLogHandler())
logging.log(message)
Insights التطبيق - آثار تصحيح خطوط الأنابيب في Insights التطبيق

OpenCensus Azure Monitor Exporters
بايثون تسجيل كتاب الطبخ

مثال على خيارات التسجيل

import logging

from azureml.core.run import Run
from opencensus.ext.azure.log_exporter import AzureLogHandler

run = Run.get_context()

# Azure ML Scalar value logging
run.log("scalar_value", 0.95)

# Python print statement
print("I am a python print statement, I will be sent to the driver logs.")

# Initialize Python logger
logger = logging.getLogger(__name__)
logger.setLevel(args.log_level)

# Plain Python logging statements
logger.debug("I am a plain debug statement, I will be sent to the driver logs.")
logger.info("I am a plain info statement, I will be sent to the driver logs.")

handler = AzureLogHandler(connection_string='<connection string>')
logger.addHandler(handler)

# Python logging with OpenCensus AzureLogHandler
logger.warning("I am an OpenCensus warning statement, find me in Application Insights!")
logger.error("I am an OpenCensus error statement with custom dimensions", {'step_id': run.id})

مصمم التعلم الآلي من Microsoft Azure

بالنسبة لخطوط الأنابيب التي تم إنشاؤها في المصمم، يمكنك العثور على ملف 70_driver_log إما في صفحة التأليف أو في صفحة تفاصيل تشغيل خط الأنابيب.

تمكين التسجيل لنقاط النهاية في الوقت الفعلي

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

الحصول على سجلات من صفحة التأليف

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

  1. حدد مكونا انتهى تشغيله في لوحة التأليف.

  2. في الجزء الأيسر من المكون، انتقل إلى علامة التبويب المخرجات + السجلات .

  3. قم بتوسيع الجزء الأيسر، وحدد 70_driver_log.txt لعرض الملف في المستعرض. يمكنك أيضا تنزيل السجلات محليا.

    Expanded output pane in the designer

الحصول على سجلات من عمليات تشغيل خطوط الأنابيب

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

  1. حدد تشغيل خط أنابيب تم إنشاؤه في المصمم.

    Pipeline run page

  2. حدد مكونا في جزء المعاينة.

  3. في الجزء الأيسر من المكون، انتقل إلى علامة التبويب المخرجات + السجلات .

  4. قم بتوسيع الجزء الأيسر لعرض ملف std_log.txt في المستعرض، أو حدد الملف لتنزيل السجلات محليا.

هام

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

Application Insights

لمزيد من المعلومات حول استخدام مكتبة OpenCensus Python بهذه الطريقة، راجع هذا الدليل: تصحيح أخطاء خطوط أنابيب التعلم الآلي واستكشاف الأخطاء وإصلاحها في التطبيق Insights

تصحيح الأخطاء التفاعلي باستخدام رمز Visual Studio

في بعض الحالات ، قد تحتاج إلى تصحيح أخطاء رمز Python المستخدم في خط أنابيب ML بشكل تفاعلي. باستخدام Visual Studio Code (VS Code) وتصحيح الأخطاء، يمكنك إرفاقه بالتعليمة البرمجية أثناء تشغيلها في بيئة التدريب. لمزيد من المعلومات، تفضل بزيارة دليل تصحيح الأخطاء التفاعلي في VS Code.

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