استكشاف أخطاء نشر النموذج عن بعد وإصلاحها
تعرف على كيفية استكشاف الأخطاء الشائعة التي قد تواجهها وحلها وحلها أو حل هذه الأخطاء عند نشر نموذج إلى مثيلات حاوية Azure (ACI) وخدمة Azure Kubernetes (AKS) باستخدام Azure التعلم الآلي.
ملاحظة
إذا كنت تقوم بنشر نموذج إلى Azure Kubernetes Service (AKS)، فإننا ننصحك بتمكين Azure Monitor لهذه المجموعة. سيساعدك ذلك على فهم سلامة المجموعة بشكل عام واستخدام الموارد. قد تجد أيضا الموارد التالية مفيدة:
- التحقق من وجود أحداث "صحة الموارد" التي تؤثر على مجموعة AKS الخاصة بك
- Azure Kubernetes Service Diagnostics
إذا كنت تحاول نشر نموذج إلى مجموعة غير صحية أو محملة بشكل زائد، فمن المتوقع أن تواجه مشكلات. إذا كنت بحاجة إلى مساعدة في استكشاف مشكلات مجموعة AKS وإصلاحها، فيرجى الاتصال بدعم AKS.
المتطلبات الأساسية
- اشتراك Azure. جرب الإصدار المجاني أو المدفوع من Azure التعلم الآلي.
- The Azure التعلم الآلي SDK.
- Azure CLI.
- ملحق CLI ل Azure التعلم الآلي.
خطوات نشر Docker لنماذج التعلم الآلي
عند نشر نموذج إلى حساب غير محلي في Azure التعلم الآلي، تحدث الأشياء التالية:
- يتم إرسال ملف Dockerfile الذي حددته في كائن البيئات في InferenceConfig إلى السحابة، إلى جانب محتويات الدليل المصدر
- إذا لم تكن الصورة التي تم إنشاؤها مسبقا متوفرة في سجل الحاويات، إنشاء صورة Docker جديدة في السحابة وتخزينها في سجل الحاوية الافتراضي لمساحة العمل.
- يتم تنزيل صورة Docker من سجل الحاوية الخاص بك إلى هدف الحوسبة الخاص بك.
- يتم تثبيت مخزن Blob الافتراضي لمساحة العمل الخاصة بك على هدف الحوسبة الخاص بك ، مما يتيح لك الوصول إلى النماذج المسجلة
- تتم تهيئة خادم الويب الخاص بك عن طريق تشغيل وظيفة البرنامج النصي للإدخال
init() - عندما يتلقى النموذج الذي تم نشره طلبا، تتعامل وظيفتك
run()مع هذا الطلب
الفرق الرئيسي عند استخدام نشر محلي هو أن صورة الحاوية مبنية على جهازك المحلي ، وهذا هو السبب في أنك تحتاج إلى تثبيت Docker لنشر محلي.
يجب أن يساعدك فهم هذه الخطوات عالية المستوى على فهم مكان حدوث الأخطاء.
الحصول على سجلات النشر
الخطوة الأولى في تصحيح الأخطاء هي الحصول على سجلات النشر الخاصة بك. أولا، اتبع الإرشادات هنا للاتصال بمساحة العمل الخاصة بك.
APPLY TO: Azure CLI ml extension
ع1
v2 (معاينة)
للحصول على السجلات من خدمة ويب تم نشرها، قم بما يلي:
az ml service get-logs --verbose --workspace-name <my workspace name> --name <service name>
تصحيح الأخطاء محليا
إذا كنت تواجه مشكلات عند نشر نموذج إلى ACI أو AKS، فقم بنشره كخدمة ويب محلية. يؤدي استخدام خدمة ويب محلية إلى تسهيل استكشاف المشكلات وإصلاحها. لاستكشاف أخطاء النشر محليا وإصلاحها، راجع مقالة استكشاف الأخطاء وإصلاحها المحلية.
Azure Machine learning inference HTTP server
يسمح لك خادم الاستدلال المحلي بتصحيح أخطاء البرنامج النصي للإدخال بسرعة (score.py). في حالة وجود خطأ في البرنامج النصي للنقاط الأساسية ، سيفشل الخادم في تهيئة النموذج أو خدمته. بدلا من ذلك ، سوف يلقي استثناء & الموقع الذي حدثت فيه المشكلات. تعرف على المزيد حول خادم HTTP للاستدلال على التعلم الآلي Azure
قم بتثبيت الحزمة
azureml-inference-server-httpمن خلاصة pypi :python -m pip install azureml-inference-server-httpبدء تشغيل الخادم وتعيينه
score.pyكبرنامج نصي للإدخال:azmlinfsrv --entry_script score.pyإرسال طلب تسجيل النقاط إلى الخادم باستخدام
curl:curl -p 127.0.0.1:5001/score
لا يمكن جدولة الحاوية
عند نشر خدمة إلى هدف حساب Azure Kubernetes Service، سيحاول Azure التعلم الآلي جدولة الخدمة باستخدام الكمية المطلوبة من الموارد. إذا لم تكن هناك عقد متوفرة في نظام المجموعة مع كمية مناسبة من الموارد بعد 5 دقائق، سيفشل النشر. رسالة الفشل هي Couldn't Schedule because the kubernetes cluster didn't have available resources after trying for 00:05:00. يمكنك معالجة هذا الخطأ إما عن طريق إضافة المزيد من العقد أو تغيير SKU للعقد أو تغيير متطلبات الموارد الخاصة بخدمتك.
ستشير رسالة الخطأ عادة إلى المورد الذي تحتاج إلى المزيد منه - على سبيل المثال ، إذا رأيت رسالة خطأ تشير إلى 0/3 nodes are available: 3 Insufficient nvidia.com/gpu أن الخدمة تتطلب وحدات معالجة رسومات وأن هناك ثلاث عقد في المجموعة لا تحتوي على وحدات معالجة رسومات متوفرة. يمكن معالجة ذلك عن طريق إضافة المزيد من العقد إذا كنت تستخدم وحدة SKU لوحدة معالجة الرسومات ، أو التبديل إلى وحدة SKU ممكنة لوحدة معالجة الرسومات إذا لم تكن كذلك أو تغيير بيئتك بحيث لا تتطلب وحدات معالجة الرسومات.
فشل تشغيل الخدمة
بعد إنشاء الصورة بنجاح، يحاول النظام بدء تشغيل حاوية باستخدام تكوين النشر الخاص بك. كجزء من عملية بدء تشغيل الحاوية ، init() يتم استدعاء الوظيفة الموجودة في البرنامج النصي لتسجيل النقاط بواسطة النظام. إذا كانت هناك استثناءات لم يتم اكتشافها في الدالة init() ، فقد ترى خطأ CrashLoopBackOff في رسالة الخطأ.
استخدم المعلومات الموجودة في مقالة فحص سجل Docker .
Container azureml-fe-aci launch fails
عند نشر خدمة إلى هدف حساب مثيل حاوية Azure، يحاول Azure التعلم الآلي إنشاء حاوية واجهة أمامية لها اسم azureml-fe-aci طلب الاستدلال. في حالة azureml-fe-aci حدوث أعطال ، يمكنك رؤية السجلات عن طريق التشغيل az container logs --name MyContainerGroup --resource-group MyResourceGroup --subscription MySubscription --container-name azureml-fe-aci. يمكنك اتباع رسالة الخطأ في السجلات لإجراء الإصلاح.
الفشل azureml-fe-aci الأكثر شيوعا هو أن شهادة أو مفتاح SSL المقدم غير صالح.
فشل الوظيفة: get_model_path()
في كثير من الأحيان ، في الوظيفة init() الموجودة في البرنامج النصي لتسجيل النقاط ، يتم استدعاء الدالة Model.get_model_path () لتحديد موقع ملف نموذج أو مجلد من ملفات النموذج في الحاوية. إذا تعذر العثور على ملف النموذج أو المجلد، تفشل الدالة. أسهل طريقة لتصحيح أخطاء هذا الخطأ هي تشغيل رمز Python أدناه في غلاف الحاوية:
from azureml.core.model import Model
import logging
logging.basicConfig(level=logging.DEBUG)
print(Model.get_model_path(model_name='my-best-model'))
يطبع هذا المثال المسار المحلي (بالنسبة إلى /var/azureml-app) في الحاوية حيث يتوقع البرنامج النصي لتسجيل النقاط العثور على ملف النموذج أو المجلد. ثم يمكنك التحقق مما إذا كان الملف أو المجلد هو بالفعل المكان المتوقع أن يكون.
قد يؤدي تعيين مستوى التسجيل إلى DEBUG إلى تسجيل معلومات إضافية، والتي قد تكون مفيدة في تحديد الفشل.
فشل الوظيفة: تشغيل (input_data)
إذا تم نشر الخدمة بنجاح، ولكنها تعطلت عند نشر البيانات إلى نقطة نهاية تسجيل النقاط، فيمكنك إضافة عبارة اكتشاف الأخطاء في وظيفتك run(input_data) بحيث تقوم بإرجاع رسالة خطأ مفصلة بدلا من ذلك. على سبيل المثال:
def run(input_data):
try:
data = json.loads(input_data)['data']
data = np.array(data)
result = model.predict(data)
return json.dumps({"result": result.tolist()})
except Exception as e:
result = str(e)
# return error message back to the client
return json.dumps({"error": result})
ملاحظة: يجب أن يتم إرجاع رسائل الخطأ من المكالمة run(input_data) لغرض تصحيح الأخطاء فقط. لأسباب أمنية، يجب عدم إرجاع رسائل الخطأ بهذه الطريقة في بيئة إنتاج.
رمز حالة HTTP 502
يشير رمز الحالة 502 إلى أن الخدمة قد ألقيت استثناء أو تعطلت في run() طريقة ملف score.py. استخدم المعلومات الواردة في هذه المقالة لتصحيح أخطاء الملف.
رمز حالة HTTP 503
تدعم عمليات نشر Azure Kubernetes Service القياس التلقائي، مما يسمح بإضافة النسخ المتماثلة لدعم الحمل الإضافي. تم تصميم autoscaler للتعامل مع التغيرات التدريجية في الحمل. إذا تلقيت طفرات كبيرة في الطلبات في الثانية الواحدة، فقد يتلقى العملاء رمز حالة HTTP 503. على الرغم من أن autoscaler يتفاعل بسرعة ، إلا أن AKS يستغرق قدرا كبيرا من الوقت لإنشاء حاويات إضافية.
وتستند قرارات الرفع والهبوط إلى استخدام النسخ المتماثلة الحالية للحاويات. عدد النسخ المتماثلة المشغولة (معالجة طلب) مقسوما على إجمالي عدد النسخ المتماثلة الحالية هو الاستخدام الحالي. إذا تجاوز هذا الرقم ، إنشاء المزيد من النسخ المتماثلة autoscale_target_utilization. إذا كان أقل ، تقليل النسخ المتماثلة. قرارات إضافة النسخ المتماثلة حريصة وسريعة (حوالي 1 ثانية). قرارات إزالة النسخ المتماثلة متحفظة (حوالي 1 دقيقة). بشكل افتراضي ، يتم تعيين استخدام هدف القياس التلقائي إلى 70٪ ، مما يعني أن الخدمة يمكنها التعامل مع الارتفاعات في الطلبات في الثانية (RPS) التي تصل إلى 30٪.
هناك أمران يمكن أن يساعدا في منع رموز الحالة 503:
تلميح
يمكن استخدام هذين النهجين بشكل فردي أو مجتمع.
تغيير مستوى الاستخدام الذي يقوم عنده القياس التلقائي بإنشاء نسخ متماثلة جديدة. يمكنك ضبط هدف الاستخدام عن طريق تعيين
autoscale_target_utilizationالقيمة إلى قيمة أقل.هام
لا يؤدي هذا التغيير إلى إنشاء نسخ متماثلة بشكل أسرع. بدلا من ذلك ، يتم إنشاؤها عند عتبة استخدام أقل. بدلا من الانتظار حتى يتم استخدام الخدمة بنسبة 70٪ ، يؤدي تغيير القيمة إلى 30٪ إلى إنشاء نسخ متماثلة عند حدوث استخدام 30٪.
إذا كانت خدمة الويب تستخدم بالفعل النسخ المتماثلة القصوى الحالية ولا تزال ترى رموز حالة 503، فقم بزيادة
autoscale_max_replicasالقيمة لزيادة الحد الأقصى لعدد النسخ المتماثلة.تغيير الحد الأدنى لعدد النسخ المتماثلة. توفر زيادة الحد الأدنى من النسخ المتماثلة تجمعا أكبر للتعامل مع الارتفاعات الواردة.
لزيادة الحد الأدنى لعدد النسخ المتماثلة، قم بتعيينه
autoscale_min_replicasإلى قيمة أعلى. يمكنك حساب النسخ المتماثلة المطلوبة باستخدام التعليمة البرمجية التالية، واستبدال القيم بقيم خاصة بمشروعك:from math import ceil # target requests per second targetRps = 20 # time to process the request (in seconds) reqTime = 10 # Maximum requests per container maxReqPerContainer = 1 # target_utilization. 70% in this example targetUtilization = .7 concurrentRequests = targetRps * reqTime / targetUtilization # Number of container replicas replicas = ceil(concurrentRequests / maxReqPerContainer)ملاحظة
إذا تلقيت طفرات طلب أكبر من الحد الأدنى الجديد للنسخ المتماثلة التي يمكن التعامل معها، فقد تتلقى 503s مرة أخرى. على سبيل المثال، مع زيادة عدد الزيارات إلى خدمتك، قد تحتاج إلى زيادة الحد الأدنى من النسخ المتماثلة.
لمزيد من المعلومات حول الإعداد autoscale_target_utilization، ومن autoscale_min_replicas أجل ، autoscale_max_replicasراجع مرجع الوحدة النمطية AksWebservice.
رمز حالة HTTP 504
يشير رمز الحالة 504 إلى انتهاء مهلة الطلب. المهلة الافتراضية هي 1 دقيقة.
يمكنك زيادة المهلة أو محاولة تسريع الخدمة عن طريق تعديل score.py لإزالة المكالمات غير الضرورية. إذا لم تقم هذه الإجراءات بتصحيح المشكلة، فاستخدم المعلومات الواردة في هذه المقالة لتصحيح أخطاء الملف score.py. قد تكون التعليمة البرمجية في حالة عدم استجابة أو حلقة لا نهائية.
رسائل خطأ أخرى
اتخذ هذه الإجراءات للأخطاء التالية:
| خطأ | الدقة |
|---|---|
| 409 خطأ تعارض | عندما تكون العملية قيد التقدم بالفعل، فإن أي عملية جديدة على نفس خدمة الويب هذه ستستجيب بخطأ تعارض 409. على سبيل المثال، إذا كانت عملية إنشاء خدمة ويب أو تحديثها قيد التقدم وإذا قمت بتشغيل عملية حذف جديدة، فسيحدث خطأ. |
| فشل بناء الصورة عند نشر خدمة الويب | إضافة "pynacl==1.2.1" كتبعية نقطة إلى ملف Conda لتكوين الصورة |
['DaskOnBatch:context_managers.DaskOnBatch', 'setup.py']' died with <Signals.SIGKILL: 9> |
قم بتغيير SKU للأجهزة الظاهرية المستخدمة في النشر إلى وحدة تحتوي على ذاكرة أكبر. |
| فشل FPGA | لن تتمكن من نشر النماذج على FPGAs حتى تطلب وتتم الموافقة على حصة FPGA. لطلب الوصول، املأ نموذج طلب الحصص: https://aka.ms/aml-real-time-ai |
تصحيح الأخطاء المتقدم
قد تحتاج إلى تصحيح أخطاء تعليمات Python البرمجية المضمنة في نشر النموذج بشكل تفاعلي. على سبيل المثال، إذا فشل البرنامج النصي للإدخال ولا يمكن تحديد السبب عن طريق تسجيل إضافي. باستخدام Visual Studio Code وتصحيح الأخطاء، يمكنك إرفاقه بالتعليمة البرمجية التي تعمل داخل حاوية Docker.
لمزيد من المعلومات، تفضل بزيارة دليل تصحيح الأخطاء التفاعلي في VS Code.
منتدى مستخدم نشر النموذج
الخطوات التالية
تعرف على المزيد حول النشر: