استكشاف أخطاء ملحق Azure التعلم الآلي وإصلاحها
في هذه المقالة، ستتعرف على كيفية استكشاف المشكلات الشائعة التي قد تواجهها مع نشر ملحق Azure التعلم الآلي في AKS أو Kubernetes الممكن بواسطة Arc.
كيف يتم تثبيت ملحق Azure التعلم الآلي
يتم إصدار ملحق Azure التعلم الآلي كمخطط helm وتثبيته بواسطة Helm V3. يتم تثبيت جميع مكونات ملحق Azure التعلم الآلي في azureml
مساحة الاسم. يمكنك استخدام الأوامر التالية للتحقق من حالة الملحق.
# get the extension status
az k8s-extension show --name <extension-name>
# check status of all pods of Azure Machine Learning extension
kubectl get pod -n azureml
# get events of the extension
kubectl get events -n azureml --sort-by='.lastTimestamp'
استكشاف أخطاء نشر ملحق Azure التعلم الآلي وإصلاحها
خطأ: لا يمكن إعادة استخدام اسم لا يزال قيد الاستخدام
يعني هذا الخطأ أن اسم الملحق الذي حددته موجود بالفعل. إذا تم استخدام الاسم بواسطة ملحق Azure التعلم الآلي، فستحتاج إلى الانتظار لمدة ساعة تقريبا والمحاولة مرة أخرى. إذا تم استخدام الاسم بواسطة مخططات helm أخرى، فستحتاج إلى استخدام اسم آخر. قم بتشغيل helm list -Aa
لسرد جميع مخططات helm في نظام المجموعة.
خطأ: لا تزال العملية السابقة لمخطط helm قيد التقدم
تحتاج إلى الانتظار لمدة ساعة تقريبا والمحاولة مرة أخرى بعد اكتمال العملية غير المعروفة.
خطأ: غير قادر على إنشاء محتوى جديد في مساحة الاسم azureml لأنه يتم إنهاؤه
يحدث هذا الخطأ عند عدم انتهاء عملية إلغاء التثبيت وتشغيل عملية تثبيت أخرى. يمكنك تشغيل az k8s-extension show
الأمر للتحقق من حالة توفير الملحق والتأكد من إلغاء تثبيت الملحق قبل اتخاذ إجراءات أخرى.
خطأ: فشل في تنزيل مسار المخطط غير موجود
يحدث هذا الخطأ عند تحديد إصدار ملحق خاطئ. تحتاج إلى التأكد من وجود الإصدار المحدد. إذا كنت تريد استخدام أحدث إصدار، فلن تحتاج إلى تحديد --version
.
خطأ: لا يمكن استيراده إلى الإصدار الحالي: بيانات تعريف الملكية غير صالحة
يعني هذا الخطأ وجود تعارض بين موارد نظام المجموعة الموجودة وملحق Azure التعلم الآلي. قد تكون رسالة الخطأ الكاملة مثل النص التالي:
CustomResourceDefinition "jobs.batch.volcano.sh" in namespace "" exists and cannot be imported into the current release: invalid ownership metadata; label validation error: missing key "app.kubernetes.io/managed-by": must be set to "Helm"; annotation validation error: missing key "meta.helm.sh/release-name": must be set to "amlarc-extension"; annotation validation error: missing key "meta.helm.sh/release-namespace": must be set to "azureml"
استخدم الخطوات التالية للتخفيف من المشكلة.
تحقق من مالك الموارد المسببة للمشاكل وما إذا كان يمكن حذف المورد أو تعديله.
إذا تم استخدام المورد بواسطة ملحق Azure التعلم الآلي فقط ويمكن حذفه، يمكنك إضافة تسميات يدويا للتخفيف من المشكلة. مع أخذ رسالة الخطأ السابقة كمثال، يمكنك تشغيل الأوامر كما يلي،
kubectl label crd jobs.batch.volcano.sh "app.kubernetes.io/managed-by=Helm" kubectl annotate crd jobs.batch.volcano.sh "meta.helm.sh/release-namespace=azureml" "meta.helm.sh/release-name=<extension-name>"
من خلال تعيين التسميات والتعليقات التوضيحية إلى المورد، فهذا يعني أن helm يدير المورد المملوك لملحق Azure التعلم الآلي.
عند استخدام المورد أيضا من قبل مكونات أخرى في نظام المجموعة ولا يمكن تعديله. راجع نشر ملحق Azure التعلم الآلي لمعرفة ما إذا كان هناك إعداد تكوين لتعطيل مورد التعارض.
التحقق من صحة الملحق
عندما فشل التثبيت ولم يصل إلى أي من رسائل الخطأ المذكورة أعلاه، يمكنك استخدام مهمة التحقق من الصحة المضمنة لإجراء فحص شامل على الملحق. يحتوي ملحق التعلم الآلي من HealthCheck
Azure على مهمة للتحقق مسبقا من جاهزية نظام المجموعة عند محاولة تثبيت الملحق أو تحديثه أو حذفه. تقوم مهمة HealthCheck إخراج تقرير، والذي يتم حفظه في configmap يسمى arcml-healthcheck
في azureml
مساحة الاسم. يتم سرد رموز الخطأ والحلول المحتملة للتقرير في رمز الخطأ الخاص ب HealthCheck.
قم بتشغيل هذا الأمر للحصول على تقرير HealthCheck،
kubectl describe configmap -n azureml arcml-healthcheck
يتم تشغيل فحص السلامة كلما قمت بتثبيت الملحق أو تحديثه أو حذفه. يتم تنظيم تقرير التحقق من الصحة مع عدة أجزاء pre-install
و pre-rollback
pre-upgrade
و.pre-delete
- إذا فشل تثبيت الملحق، يجب أن تنظر في
pre-install
وpre-delete
. - إذا فشل تحديث الملحق، يجب أن تنظر في
pre-upgrade
وpre-rollback
. - إذا فشل حذف الملحق، يجب أن تنظر في
pre-delete
.
عند طلب الدعم، نوصي بتشغيل الأمر التالي وإرسالhealthcheck.logs
الملف إلينا، حيث يمكن أن يسهل لنا تحديد موقع المشكلة بشكل أفضل.
kubectl logs healthcheck -n azureml
رمز الخطأ ل HealthCheck
يوضح هذا الجدول كيفية استكشاف أخطاء رموز الخطأ التي تم إرجاعها بواسطة تقرير HealthCheck وإصلاحها.
رمز الخطأ | رسالة الخطأ | الوصف |
---|---|---|
E40001 | LOAD_BALANCER_NOT_SUPPORT | موازن التحميل غير مدعوم في مجموعتك. تحتاج إلى تكوين موازن التحميل في نظام المجموعة الخاص بك أو مراعاة الإعداد inferenceRouterServiceType إلى nodePort أو clusterIP . |
E40002 | INSUFFICIENT_NODE | لقد قمت بتمكين inferenceRouterHA يتطلب ثلاث عقد على الأقل في نظام المجموعة الخاص بك. تعطيل قابلية الوصول العالية إذا كان لديك أقل من ثلاث عقد. |
E40003 | INTERNAL_LOAD_BALANCER_NOT_SUPPORT | حاليا، تدعم AKS فقط موازن التحميل الداخلي، ونحن ندعم azure النوع فقط. لا تقم بتعيين internalLoadBalancerProvider إذا لم يكن لديك نظام مجموعة AKS. |
E40007 | INVALID_SSL_SETTING | مفتاح SSL أو الشهادة غير صالحة. يجب أن يكون CNAME متوافقا مع الشهادة. |
E45002 | PROMETHEUS_CONFLICT | يتعارض عامل تشغيل Prometheus المثبت مع عامل تشغيل Prometheus الحالي. لمزيد من المعلومات، راجع عامل تشغيل Prometheus |
E45003 | BAD_NETWORK_CONNECTIVITY | تحتاج إلى تلبية متطلبات الشبكة. |
E45004 | AZUREML_FE_ROLE_CONFLICT | ملحق Azure التعلم الآلي غير مدعوم في AKS القديم. لتثبيت ملحق Azure التعلم الآلي، تحتاج إلى حذف مكونات azureml-fe القديمة. |
E45005 | AZUREML_FE_DEPLOYMENT_CONFLICT | ملحق Azure التعلم الآلي غير مدعوم في AKS القديم. لتثبيت ملحق Azure التعلم الآلي، تحتاج إلى تشغيل الأمر أسفل هذا النموذج لحذف مكونات azureml-fe القديمة، والمزيد من التفاصيل التي يمكنك الرجوع إليها هنا. |
أوامر لحذف مكونات azureml-fe القديمة في نظام مجموعة AKS:
kubectl delete sa azureml-fe
kubectl delete clusterrole azureml-fe-role
kubectl delete clusterrolebinding azureml-fe-binding
kubectl delete svc azureml-fe
kubectl delete svc azureml-fe-int-http
kubectl delete deploy azureml-fe
kubectl delete secret azuremlfessl
kubectl delete cm azuremlfeconfig
تكامل مكونات المصدر المفتوح
يستخدم ملحق Azure التعلم الآلي بعض المكونات مصدر مفتوح، بما في ذلك مشغل Prometheus وجدولة البركان ومصدر DCGM. إذا كان نظام مجموعة Kubernetes مثبتا بالفعل بعضها، يمكنك قراءة الأقسام التالية لدمج المكونات الموجودة مع ملحق Azure التعلم الآلي.
عامل تشغيل Prometheus
عامل تشغيل Prometheus هو إطار عمل مصدر مفتوح للمساعدة في بناء نظام مراقبة القياس في kubernetes. يستخدم ملحق Azure التعلم الآلي أيضا عامل تشغيل Prometheus للمساعدة في مراقبة استخدام الموارد للوظائف.
إذا كان نظام المجموعة يحتوي على عامل تشغيل Prometheus مثبت بواسطة خدمة أخرى، يمكنك تحديد installPromOp=false
لتعطيل عامل تشغيل Prometheus في ملحق Azure التعلم الآلي لتجنب حدوث تعارض بين اثنين من مشغلي Prometheus.
في هذه الحالة، يقوم عامل التشغيل prometheus الحالي بإدارة جميع مثيلات Prometheus. للتأكد من أن Prometheus يعمل بشكل صحيح، يجب الاهتمام بالأشياء التالية عند تعطيل عامل تشغيل prometheus في ملحق Azure التعلم الآلي.
- تحقق مما إذا كان prometheus في مساحة اسم azureml مدارا بواسطة عامل تشغيل Prometheus. في بعض السيناريوهات، يتم تعيين عامل تشغيل prometheus لمراقبة بعض مساحات الأسماء المحددة فقط. إذا كان الأمر كذلك، فتأكد من أن مساحة اسم azureml موجودة في قائمة السماح. لمزيد من المعلومات، راجع علامات الأوامر.
- تحقق مما إذا تم تمكين خدمة kubelet في عامل تشغيل prometheus. تحتوي خدمة Kubelet على جميع نقاط النهاية ل kubelet. لمزيد من المعلومات، راجع علامات الأوامر. وتحتاج أيضا إلى التأكد من أن خدمة kubelet تحتوي على تسمية
k8s-app=kubelet
. - إنشاء ServiceMonitor ل kubelet-service. قم بتشغيل الأمر التالي مع استبدال المتغيرات:
cat << EOF | kubectl apply -f - apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: prom-kubelet namespace: azureml labels: release: "<extension-name>" # Please replace to your Azure Machine Learning extension name spec: endpoints: - port: https-metrics scheme: https path: /metrics/cadvisor honorLabels: true tlsConfig: caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecureSkipVerify: true bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token relabelings: - sourceLabels: - __metrics_path__ targetLabel: metrics_path jobLabel: k8s-app namespaceSelector: matchNames: - "<namespace-of-your-kubelet-service>" # Please change this to the same namespace of your kubelet-service selector: matchLabels: k8s-app: kubelet # Please make sure your kubelet-service has a label named k8s-app and it's value is kubelet EOF
مصدر DCGM
Dcgm-exporter هي الأداة الرسمية الموصى بها من قبل NVIDIA لجمع مقاييس GPU. لقد دمجناه في ملحق Azure التعلم الآلي. ولكن، بشكل افتراضي، لا يتم تمكين مصدر dcgm، ولا يتم جمع مقاييس GPU. يمكنك تحديد installDcgmExporter
علامة لتمكينها true
. نظرا لأنها أداة NVIDIA الرسمية، فقد تكون مثبتة بالفعل في مجموعة GPU الخاصة بك. إذا كان الأمر كذلك، يمكنك تعيين installDcgmExporter
إلى false
واتباع الخطوات لدمج dcgm-exporter في ملحق Azure التعلم الآلي. شيء آخر يجب ملاحظته هو أن dcgm-exporter يسمح للمستخدم بتهيئة المقاييس التي يجب كشفها. بالنسبة لملحق Azure التعلم الآلي، تأكد من DCGM_FI_DEV_GPU_UTIL
عرض المقاييس DCGM_FI_DEV_FB_FREE
وDCGM_FI_DEV_FB_USED
.
تأكد من تثبيت ملحق Aureml ومصدر dcgm بنجاح. يمكن تثبيت Dcgm-exporter بواسطة مخطط helm لمصدر Dcgm أو مخطط helm لمشغل Gpu
تحقق مما إذا كانت هناك خدمة لمصدر dcgm. إذا لم يكن موجودا أو كنت لا تعرف كيفية التحقق، فقم بتشغيل الأمر التالي لإنشاء واحد.
cat << EOF | kubectl apply -f - apiVersion: v1 kind: Service metadata: name: dcgm-exporter-service namespace: "<namespace-of-your-dcgm-exporter>" # Please change this to the same namespace of your dcgm-exporter labels: app.kubernetes.io/name: dcgm-exporter app.kubernetes.io/instance: "<extension-name>" # Please replace to your Azure Machine Learning extension name app.kubernetes.io/component: "dcgm-exporter" annotations: prometheus.io/scrape: 'true' spec: type: "ClusterIP" ports: - name: "metrics" port: 9400 # Please replace to the correct port of your dcgm-exporter. It's 9400 by default targetPort: 9400 # Please replace to the correct port of your dcgm-exporter. It's 9400 by default protocol: TCP selector: app.kubernetes.io/name: dcgm-exporter # Those two labels are used to select dcgm-exporter pods. You can change them according to the actual label on the service app.kubernetes.io/instance: "<dcgm-exporter-helm-chart-name>" # Please replace to the helm chart name of dcgm-exporter EOF
التحقق مما إذا تم تعيين الخدمة في الخطوة السابقة بشكل صحيح
kubectl -n <namespace-of-your-dcgm-exporter> port-forward service/dcgm-exporter-service 9400:9400 # run this command in a separate terminal. You will get a lot of dcgm metrics with this command. curl http://127.0.0.1:9400/metrics
إعداد ServiceMonitor لعرض خدمة مصدر dcgm إلى ملحق Azure التعلم الآلي. قم بتشغيل الأمر التالي ويدخل حيز التنفيذ في بضع دقائق.
cat << EOF | kubectl apply -f - apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: dcgm-exporter-monitor namespace: azureml labels: app.kubernetes.io/name: dcgm-exporter release: "<extension-name>" # Please replace to your Azure Machine Learning extension name app.kubernetes.io/component: "dcgm-exporter" spec: selector: matchLabels: app.kubernetes.io/name: dcgm-exporter app.kubernetes.io/instance: "<extension-name>" # Please replace to your Azure Machine Learning extension name app.kubernetes.io/component: "dcgm-exporter" namespaceSelector: matchNames: - "<namespace-of-your-dcgm-exporter>" # Please change this to the same namespace of your dcgm-exporter endpoints: - port: "metrics" path: "/metrics" EOF
جدولة بركان
إذا كان مجموعتك تحتوي بالفعل على مجموعة بركان مثبتة، يمكنك تعيين installVolcano=false
، لذلك لن يقوم الملحق بتثبيت جدولة البركان. برنامج جدولة البركان ووحدة التحكم في البركان مطلوبان لتدريب تقديم الوظيفة وجدولتها.
تكوين جدولة البركان المستخدم من قبل ملحق Azure التعلم الآلي هو:
volcano-scheduler.conf: |
actions: "enqueue, allocate, backfill"
tiers:
- plugins:
- name: task-topology
- name: priority
- name: gang
- name: conformance
- plugins:
- name: overcommit
- name: drf
- name: predicates
- name: proportion
- name: nodeorder
- name: binpack
تحتاج إلى استخدام نفس إعدادات التكوين هذه، وتحتاج إلى تعطيل job/validate
خطاف الويب في قبول البركان إذا كان إصدار بركانك أقل من 1.6، بحيث يمكن أن تؤدي أحمال عمل التدريب التعلم الآلي Azure بشكل صحيح.
تكامل جدولة البركان الذي يدعم التحجيم التلقائي للمجموعة
كما تمت مناقشته في هذا الموضوع ، فإن المكون الإضافي للعصابة لا يعمل بشكل جيد مع مقياس المجموعة التلقائي (CA) وأيضا مقياس العقدة التلقائي في AKS.
إذا كنت تستخدم البركان الذي يأتي مع ملحق Azure التعلم الآلي عبر الإعداد installVolcano=true
، فإن الملحق يحتوي على تكوين مجدول بشكل افتراضي، والذي يقوم بتكوين المكون الإضافي للعصابة لمنع توقف الوظيفة التام. لذلك، لن يتم دعم مقياس المجموعة التلقائي (CA) في مجموعة AKS مع البركان المثبت بواسطة الملحق.
في هذه الحالة، إذا كنت تفضل أن يعمل التحجيم التلقائي لنظام مجموعة AKS بشكل طبيعي، يمكنك تكوين هذه volcanoScheduler.schedulerConfigMap
المعلمة من خلال تحديث الملحق، وتحديد تكوين مخصص من أي مجدول بركان عصابة إليه، على سبيل المثال:
volcano-scheduler.conf: |
actions: "enqueue, allocate, backfill"
tiers:
- plugins:
- name: sla
arguments:
sla-waiting-time: 1m
- plugins:
- name: conformance
- plugins:
- name: overcommit
- name: drf
- name: predicates
- name: proportion
- name: nodeorder
- name: binpack
لاستخدام هذا التكوين في نظام مجموعة AKS، تحتاج إلى اتباع الخطوات التالية:
- إنشاء ملف configmap مع التكوين أعلاه في
azureml
مساحة الاسم. سيتم إنشاء مساحة الاسم هذه بشكل عام عند تثبيت ملحق Azure التعلم الآلي. - تعيين
volcanoScheduler.schedulerConfigMap=<configmap name>
في تكوين الملحق لتطبيق خريطة التكوين هذه. وتحتاج إلى تخطي التحقق من صحة المورد عند تثبيت الملحق عن طريق تكوينamloperator.skipResourceValidation=true
. على سبيل المثال:az k8s-extension update --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config volcanoScheduler.schedulerConfigMap=<configmap name> amloperator.skipResourceValidation=true --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name> --scope cluster
إشعار
نظرا لإزالة المكون الإضافي للعصابة، هناك احتمال أن يحدث التوقف التام عندما يقوم البركان بجدولة المهمة.
- لتجنب هذا الموقف، يمكنك استخدام نفس نوع المثيل عبر الوظائف.
لاحظ أنك بحاجة إلى تعطيل job/validate
خطاف الويب في قبول البركان إذا كان إصدار بركانك أقل من 1.6.
وحدة تحكم Ingress Nginx
يأتي تثبيت ملحق Azure التعلم الآلي مع فئة وحدة تحكم nginx دخول كما هو k8s.io/ingress-nginx
افتراضيا. إذا كان لديك بالفعل وحدة تحكم nginx دخول في نظام المجموعة الخاص بك، تحتاج إلى استخدام فئة وحدة تحكم مختلفة لتجنب فشل التثبيت.
لديك خياران:
- قم بتغيير فئة وحدة التحكم الموجودة إلى شيء آخر غير
k8s.io/ingress-nginx
. - قم بإنشاء أو تحديث ملحق Azure التعلم الآلي الخاص بنا باستخدام فئة وحدة تحكم مخصصة تختلف عن فئة وحدة التحكم الخاصة بك باتباع الأمثلة التالية.
على سبيل المثال، لإنشاء الملحق مع فئة وحدة تحكم مخصصة:
az ml extension create --config nginxIngress.controller="k8s.io/amlarc-ingress-nginx"
لتحديث الملحق بفئة وحدة تحكم مخصصة:
az ml extension update --config nginxIngress.controller="k8s.io/amlarc-ingress-nginx"
وحدة تحكم دخول Nginx المثبتة مع تعطل ملحق Azure التعلم الآلي بسبب أخطاء نفاد الذاكرة (OOM)
العَرَضْ
تتعطل وحدة تحكم دخول nginx المثبتة مع ملحق Azure التعلم الآلي بسبب أخطاء نفاد الذاكرة (OOM) حتى في حالة عدم وجود حمل عمل. لا تعرض سجلات وحدة التحكم أي معلومات مفيدة لتشخيص المشكلة.
السبب المحتمل
قد تحدث هذه المشكلة إذا كانت وحدة تحكم دخول nginx تعمل على عقدة مع العديد من وحدات المعالجة المركزية. بشكل افتراضي، تفرخ وحدة تحكم دخول nginx عمليات العامل وفقا لعدد وحدات المعالجة المركزية، والتي قد تستهلك المزيد من الموارد وتتسبب في أخطاء OOM على العقد مع المزيد من وحدات المعالجة المركزية. هذه مشكلة معروفة تم الإبلاغ عنها على GitHub
القرار
لحل هذه المشكلة، يمكنك:
- اضبط عدد عمليات العامل عن طريق تثبيت الملحق مع المعلمة
nginxIngress.controllerConfig.worker-processes=8
. - قم بزيادة حد الذاكرة باستخدام المعلمة
nginxIngress.resources.controller.limits.memory=<new limit>
.
تأكد من ضبط هاتين المعلمتين وفقا لمواصفات العقدة المحددة ومتطلبات حمل العمل لتحسين أحمال العمل الخاصة بك بشكل فعال.
الخطوات التالية
الملاحظات
https://aka.ms/ContentUserFeedback.
قريبًا: خلال عام 2024، سنتخلص تدريجيًا من GitHub Issues بوصفها آلية إرسال ملاحظات للمحتوى ونستبدلها بنظام ملاحظات جديد. لمزيد من المعلومات، راجعإرسال الملاحظات وعرضها المتعلقة بـ