استكشاف أخطاء خطوط أنابيب التعلم الآلي وإصلاحها
في هذه المقالة، ستتعرف على كيفية استكشاف الأخطاء وإصلاحها عند حدوث أخطاء أثناء تشغيل خط أنابيب التعلم الآلي في 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. يتيح لك التسجيل استكشاف مشكلات نشر النموذج واستخدامه وإصلاحها وتصحيحها. لمزيد من المعلومات، راجع تسجيل الدخول للنماذج المنشورة.
الحصول على سجلات من صفحة التأليف
عند إرسال تشغيل خط أنابيب والبقاء في صفحة التأليف، يمكنك العثور على ملفات السجل التي تم إنشاؤها لكل مكون عند انتهاء تشغيل كل مكون.
حدد مكونا انتهى تشغيله في لوحة التأليف.
في الجزء الأيسر من المكون، انتقل إلى علامة التبويب المخرجات + السجلات .
قم بتوسيع الجزء الأيسر، وحدد 70_driver_log.txt لعرض الملف في المستعرض. يمكنك أيضا تنزيل السجلات محليا.

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

حدد مكونا في جزء المعاينة.
في الجزء الأيسر من المكون، انتقل إلى علامة التبويب المخرجات + السجلات .
قم بتوسيع الجزء الأيسر لعرض ملف std_log.txt في المستعرض، أو حدد الملف لتنزيل السجلات محليا.
هام
لتحديث خط أنابيب من صفحة تفاصيل تشغيل خط الأنابيب، يجب استنساخ خط الأنابيب الذي تم تشغيله إلى مسودة خط أنابيب جديدة. تشغيل خط الأنابيب هو لقطة من خط الأنابيب. إنه مشابه لملف السجل ، ولا يمكن تغييره.
Application Insights
لمزيد من المعلومات حول استخدام مكتبة OpenCensus Python بهذه الطريقة، راجع هذا الدليل: تصحيح أخطاء خطوط أنابيب التعلم الآلي واستكشاف الأخطاء وإصلاحها في التطبيق Insights
تصحيح الأخطاء التفاعلي باستخدام رمز Visual Studio
في بعض الحالات ، قد تحتاج إلى تصحيح أخطاء رمز Python المستخدم في خط أنابيب ML بشكل تفاعلي. باستخدام Visual Studio Code (VS Code) وتصحيح الأخطاء، يمكنك إرفاقه بالتعليمة البرمجية أثناء تشغيلها في بيئة التدريب. لمزيد من المعلومات، تفضل بزيارة دليل تصحيح الأخطاء التفاعلي في VS Code.
الخطوات التالية
للحصول على برنامج تعليمي كامل باستخدام
ParallelRunStep، راجع البرنامج التعليمي: إنشاء خط أنابيب Azure التعلم الآلي لتسجيل الدفعات.للحصول على مثال كامل يعرض التعلم الآلي التلقائي في خطوط أنابيب ML، راجع استخدام التعلم الآلي التلقائي في خط أنابيب Azure التعلم الآلي في Python.
راجع مرجع SDK للحصول على مساعدة بشأن حزمة azureml-pipelines-core وحزمة خطوات خطوط أنابيب azureml .
راجع قائمة استثناءات المصمم ورموز الخطأ.