استكشاف أخطاء ملحق 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-rollbackpre-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 التعلم الآلي.

  1. تحقق مما إذا كان prometheus في مساحة اسم azureml مدارا بواسطة عامل تشغيل Prometheus. في بعض السيناريوهات، يتم تعيين عامل تشغيل prometheus لمراقبة بعض مساحات الأسماء المحددة فقط. إذا كان الأمر كذلك، فتأكد من أن مساحة اسم azureml موجودة في قائمة السماح. لمزيد من المعلومات، راجع علامات الأوامر.
  2. تحقق مما إذا تم تمكين خدمة kubelet في عامل تشغيل prometheus. تحتوي خدمة Kubelet على جميع نقاط النهاية ل kubelet. لمزيد من المعلومات، راجع علامات الأوامر. وتحتاج أيضا إلى التأكد من أن خدمة kubelet تحتوي على تسميةk8s-app=kubelet.
  3. إنشاء 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.

  1. تأكد من تثبيت ملحق Aureml ومصدر dcgm بنجاح. يمكن تثبيت Dcgm-exporter بواسطة مخطط helm لمصدر Dcgm أو مخطط helm لمشغل Gpu

  2. تحقق مما إذا كانت هناك خدمة لمصدر 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
    
  3. التحقق مما إذا تم تعيين الخدمة في الخطوة السابقة بشكل صحيح

    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
    
  4. إعداد 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، تحتاج إلى اتباع الخطوات التالية:

  1. إنشاء ملف configmap مع التكوين أعلاه في azureml مساحة الاسم. سيتم إنشاء مساحة الاسم هذه بشكل عام عند تثبيت ملحق Azure التعلم الآلي.
  2. تعيين 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>.

تأكد من ضبط هاتين المعلمتين وفقا لمواصفات العقدة المحددة ومتطلبات حمل العمل لتحسين أحمال العمل الخاصة بك بشكل فعال.

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