Rozwiązywanie problemów z rozszerzeniem usługi Azure Machine Learning

Z tego artykułu dowiesz się, jak rozwiązywać typowe problemy z wdrażaniem rozszerzenia usługi Azure Machine Edukacja w usłudze AKS lub Kubernetes z obsługą usługi Arc.

Jak instaluje się rozszerzenie usługi Azure Machine Learning

Rozszerzenie usługi Azure Machine Edukacja jest wydawane jako pakiet helm i instalowane przez program Helm V3. Wszystkie składniki rozszerzenia usługi Azure Machine Edukacja są instalowane w azureml przestrzeni nazw. Aby sprawdzić stan rozszerzenia, możesz użyć następujących poleceń.

# 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'

Rozwiązywanie problemów z błędem wdrażania rozszerzenia usługi Azure Machine Learning

Błąd: nie można ponownie użyć nazwy, która jest nadal używana

Ten błąd oznacza, że określona nazwa rozszerzenia już istnieje. Jeśli nazwa jest używana przez rozszerzenie usługi Azure Machine Learning, musisz poczekać około godziny i spróbować ponownie. Jeśli nazwa jest używana przez inne wykresy helm, musisz użyć innej nazwy. Uruchom polecenie , helm list -Aa aby wyświetlić listę wszystkich wykresów helm w klastrze.

Błąd: wcześniejsza operacja pakietu Helm jest nadal w toku

Musisz poczekać około godziny i spróbować ponownie po zakończeniu nieznanej operacji.

Błąd: nie można utworzyć nowej zawartości w przestrzeni nazw azureml, ponieważ jest ona usuwana

Ten błąd występuje, gdy operacja odinstalowywania nie zostanie zakończona i zostanie wyzwolona inna operacja instalacji. Możesz uruchomić polecenie az k8s-extension show, aby sprawdzić stan aprowizacji rozszerzenia i upewnić się, że rozszerzenie zostało odinstalowane przed podjęciem innych akcji.

Błąd: nie można pobrać, nie znaleziono ścieżki pakietu

Ten błąd występuje, gdy określisz nieprawidłową wersję rozszerzenia. Musisz upewnić się, że określona wersja istnieje. Jeśli chcesz użyć najnowszej wersji, nie musisz określać elementu --version .

Błąd: nie można zaimportować do bieżącej wersji: metadane własności są nieprawidłowe

Ten błąd oznacza konflikt między istniejącymi zasobami klastra i rozszerzeniem usługi Azure Machine Learning. Pełny komunikat o błędzie może przypominać następujący tekst:

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"

Aby rozwiązać ten problem, wykonaj następujące czynności.

  • Sprawdź, kto jest właścicielem problematycznych zasobów i czy można usunąć lub zmodyfikować zasób.

  • Jeśli zasób jest używany tylko przez rozszerzenie usługi Azure Machine Learning i można go usunąć, możesz ręcznie dodać etykiety, aby rozwiązać ten problem. Biorąc poprzedni komunikat o błędzie jako przykład, można uruchomić polecenia w następujący sposób,

    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>"
    

    Ustawiając etykiety i adnotacje dla zasobu, oznacza to, że helm zarządza zasobem należącym do rozszerzenia usługi Azure Machine Learning.

  • Gdy zasób jest również używany przez inne składniki w klastrze i nie można go modyfikować. Zapoznaj się z artykułem Wdrażanie rozszerzenia usługi Azure Machine Edukacja, aby sprawdzić, czy istnieje ustawienie konfiguracji wyłączania zasobu powodującego konflikt.

Sprawdzanie kondycji rozszerzenia

Gdy instalacja nie powiodła się i nie napotkała żadnego z powyższych komunikatów o błędach, możesz użyć wbudowanego zadania sprawdzania kondycji, aby przeprowadzić kompleksowe sprawdzenie rozszerzenia. Rozszerzenie usługi Azure Machine Learning zawiera HealthCheck zadanie wstępnego sprawdzania gotowości klastra podczas próby zainstalowania, zaktualizowania lub usunięcia rozszerzenia. Zadanie HealthCheck generuje raport, który jest zapisywany w mapie konfiguracji o nazwie arcml-healthcheck w azureml przestrzeni nazw. Kody błędów i możliwe rozwiązania dla raportu są wymienione w kodzie błędu healthCheck.

Uruchom to polecenie, aby uzyskać raport HealthCheck,

kubectl describe configmap -n azureml arcml-healthcheck

Kontrola kondycji jest wyzwalana za każdym razem, gdy instalujesz, aktualizujesz lub usuwasz rozszerzenie. Raport kontroli kondycji ma strukturę z kilkoma częściami pre-install, pre-rollbackpre-upgrade i pre-delete.

  • Jeśli rozszerzenie nie powiodło się, należy zapoznać się z pre-install elementami i pre-delete.
  • Jeśli rozszerzenie nie powiodło się, należy zapoznać pre-upgrade się z elementami i pre-rollback.
  • Jeśli usunięcie rozszerzenia nie powiodło się, należy zapoznać się z elementem pre-delete.

Gdy poprosisz o pomoc techniczną, zalecamy uruchomienie następującego polecenia i przesłanie nam pliku healthcheck.logs, ponieważ może to ułatwić nam lepsze zlokalizowanie problemu.

kubectl logs healthcheck -n azureml

Kod błędu kontroli kondycji

W tej tabeli przedstawiono, jak rozwiązywać problemy z kodami błędów zwracanymi przez raport HealthCheck.

Kod błędu Komunikat o błędzie opis
E40001 LOAD_BALANCER_NOT_SUPPORT Moduł równoważenia obciążenia nie jest obsługiwany w klastrze. Musisz skonfigurować moduł równoważenia obciążenia w klastrze lub rozważyć ustawienie inferenceRouterServiceType na nodePort lub clusterIP.
E40002 INSUFFICIENT_NODE Włączono inferenceRouterHA obsługę, która wymaga co najmniej trzech węzłów w klastrze. Wyłącz wysoką dostępność, jeśli masz mniej niż trzy węzły.
E40003 INTERNAL_LOAD_BALANCER_NOT_SUPPORT Obecnie tylko usługa AKS obsługuje wewnętrzny moduł równoważenia obciążenia i obsługuje azure tylko typ. Nie ustawiaj internalLoadBalancerProvider , jeśli nie masz klastra usługi AKS.
E40007 INVALID_SSL_SETTING Klucz SSL lub certyfikat nie jest prawidłowy. Nazwa CNAME powinna być zgodna z certyfikatem.
E45002 PROMETHEUS_CONFLICT Zainstalowany operator Prometheus jest w konflikcie z istniejącym operatorem Prometheus. Aby uzyskać więcej informacji, zobacz Operator Prometheus
E45003 BAD_NETWORK_CONNECTIVITY Musisz spełnić wymagania sieciowe.
E45004 AZUREML_FE_ROLE_CONFLICT Rozszerzenie azure Machine Edukacja nie jest obsługiwane w starszej wersji usługi AKS. Aby zainstalować rozszerzenie usługi Azure Machine Edukacja, należy usunąć starsze składniki azureml-fe.
E45005 AZUREML_FE_DEPLOYMENT_CONFLICT Rozszerzenie azure Machine Edukacja nie jest obsługiwane w starszej wersji usługi AKS. Aby zainstalować rozszerzenie usługi Azure Machine Edukacja, należy uruchomić poniższe polecenie, aby usunąć starsze składniki azureml-fe, więcej szczegółów można znaleźć tutaj.

Polecenia umożliwiające usunięcie starszych składników azureml-fe w klastrze usługi 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

Integracja składników typu open source

Rozszerzenie azure Machine Edukacja używa niektórych składników typu open source, w tym Prometheus Operator, Wulkan Scheduler i eksportera DCGM. Jeśli klaster Kubernetes ma już zainstalowane niektóre z nich, możesz przeczytać następujące sekcje, aby zintegrować istniejące składniki z rozszerzeniem usługi Azure Machine Edukacja.

Operator Prometheus

Operator Prometheus to platforma typu open source ułatwiająca tworzenie systemu monitorowania metryk w rozwiązaniu kubernetes. Rozszerzenie azure Machine Edukacja korzysta również z operatora Prometheus, aby ułatwić monitorowanie wykorzystania zasobów zadań.

Jeśli klaster ma operator Prometheus zainstalowany przez inną usługę, możesz określićinstallPromOp=false, aby wyłączyć operator Prometheus w rozszerzeniu Azure Machine Edukacja, aby uniknąć konfliktu między dwoma operatorami Prometheus. W tym przypadku istniejący operator prometheus zarządza wszystkimi wystąpieniami rozwiązania Prometheus. Aby upewnić się, że rozwiązanie Prometheus działa prawidłowo, podczas wyłączania operatora prometheus w rozszerzeniu usługi Azure Machine Edukacja należy zwrócić uwagę na następujące kwestie.

  1. Sprawdź, czy rozwiązanie prometheus w przestrzeni nazw azureml jest zarządzane przez operator Prometheus. W niektórych scenariuszach operator prometheus jest ustawiony tak, aby monitorować tylko niektóre określone przestrzenie nazw. Jeśli tak, upewnij się, że przestrzeń nazw azureml znajduje się na liście dozwolonych. Aby uzyskać więcej informacji, zobacz flagi poleceń.
  2. Sprawdź, czy usługa kubelet-service jest włączona w operatorze prometheus. Usługa Kubelet-service zawiera wszystkie punkty końcowe rozwiązania kubelet. Aby uzyskać więcej informacji, zobacz flagi poleceń. Ponadto należy upewnić się, że usługa kubelet-service ma etykietęk8s-app=kubelet.
  3. Utwórz usługę ServiceMonitor dla usługi kubelet-service. Uruchom następujące polecenie ze zmiennymi zastąpionymi:
    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
    

Eksporter DCGM

Dcgm-eksporter jest oficjalnym narzędziem zalecanym przez firmę NVIDIA do zbierania metryk procesora GPU. Zintegrowaliśmy go z rozszerzeniem usługi Azure Machine Edukacja. Jednak domyślnie eksporter dcgm nie jest włączony i nie są zbierane żadne metryki procesora GPU. Możesz określić installDcgmExporter flagę, aby true ją włączyć. Ponieważ jest to oficjalne narzędzie firmy NVIDIA, być może jest ono już zainstalowane w klastrze procesora GPU. Jeśli tak, możesz ustawić wartość installDcgmExporterfalse i wykonać kroki, aby zintegrować eksportera dcgm z rozszerzeniem azure Machine Edukacja. Inną rzeczą, którą należy zauważyć, jest to, że eksporter dcgm umożliwia użytkownikowi skonfigurowanie metryk do ujawnienia. W przypadku rozszerzenia usługi Azure Machine Edukacja upewnij się, że DCGM_FI_DEV_GPU_UTILDCGM_FI_DEV_FB_FREE są uwidocznione metryki i DCGM_FI_DEV_FB_USED .

  1. Upewnij się, że masz zainstalowane rozszerzenie Aureml i eksporter dcgm. Eksporter Dcgm można zainstalować za pomocą wykresu helm eksportera Dcgm lub wykresu helm operatora gpu

  2. Sprawdź, czy istnieje usługa dla eksportera dcgm. Jeśli nie istnieje lub nie wiesz, jak to sprawdzić, uruchom następujące polecenie, aby je utworzyć.

    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. Sprawdź, czy usługa w poprzednim kroku jest poprawnie ustawiona

    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. Skonfiguruj narzędzie ServiceMonitor, aby uwidocznić usługę dcgm-exporter w rozszerzeniu azure Machine Edukacja. Uruchom następujące polecenie i trwa to kilka minut.

    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
    

Harmonogram wulkanu

Jeśli klaster ma już zainstalowany zestaw wulkanów, możesz ustawić installVolcano=false, więc rozszerzenie nie zainstaluje harmonogramu wulkanu. Harmonogram wulkanu i kontroler wulkanu są wymagane do przesyłania i planowania zadań szkoleniowych.

Konfiguracja harmonogramu wulkanu używana przez rozszerzenie usługi Azure Machine Edukacja to:

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

Musisz użyć tych samych ustawień konfiguracji i musisz wyłączyć job/validate element webhook w przyjęciu wulkanu, jeśli wersja wulkanu jest niższa niż 1.6, aby usługa Azure Machine Edukacja obciążenia szkoleniowe mogły działać prawidłowo.

Integracja harmonogramu wulkanów obsługująca funkcję automatycznego skalowania klastra

Zgodnie z opisem w tym wątku wtyczka gangu nie działa dobrze z funkcją automatycznego skalowania klastra (CA), a także funkcją automatycznego skalowania węzłów w usłudze AKS.

Jeśli używasz wulkanu dostarczanego z rozszerzeniem azure Machine Edukacja za pomocą ustawienia installVolcano=true, rozszerzenie ma domyślnie konfigurację harmonogramu, która konfiguruje wtyczkę gangu, aby zapobiec zakleszczeniom zadań. W związku z tym funkcja automatycznego skalowania klastra (CA) w klastrze usługi AKS nie będzie obsługiwana z wulkanem zainstalowanym przez rozszerzenie.

W takim przypadku, jeśli wolisz narzędzie do automatycznego skalowania klastra AKS może działać normalnie, możesz skonfigurować ten volcanoScheduler.schedulerConfigMap parametr za pomocą rozszerzenia aktualizacji i określić niestandardową konfigurację bez harmonogramu wulkanu gangu do niego, na przykład:

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

Aby użyć tej konfiguracji w klastrze usługi AKS, należy wykonać następujące kroki:

  1. Utwórz plik configmap z powyższą konfiguracją azureml w przestrzeni nazw. Ta przestrzeń nazw będzie zwykle tworzona podczas instalowania rozszerzenia usługi Azure Machine Edukacja.
  2. Ustaw volcanoScheduler.schedulerConfigMap=<configmap name> w konfiguracji rozszerzenia, aby zastosować tę configmap. Należy pominąć walidację zasobów podczas instalowania rozszerzenia, konfigurując element amloperator.skipResourceValidation=true. Przykład:
    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
    

Uwaga

Ponieważ wtyczka gangu zostanie usunięta, istnieje potencjał, że impas ma miejsce, gdy wulkan planuje zadanie.

  • Aby uniknąć tej sytuacji, można użyć tego samego typu wystąpienia w ramach zadań.

Należy pamiętać, że należy wyłączyć job/validate element webhook w wstępu wulkanu, jeśli wersja wulkanu jest niższa niż 1,6.

Kontroler Nginx ruchu przychodzącego

Instalacja rozszerzenia azure Machine Edukacja jest domyślnie dostarczana z klasą k8s.io/ingress-nginx kontrolera nginx ruchu przychodzącego. Jeśli masz już kontroler nginx ruchu przychodzącego w klastrze, musisz użyć innej klasy kontrolera, aby uniknąć awarii instalacji.

Dostępne są dwie opcje:

  • Zmień istniejącą klasę kontrolera na inną niż k8s.io/ingress-nginx.
  • Utwórz lub zaktualizuj rozszerzenie usługi Azure Machine Edukacja przy użyciu niestandardowej klasy kontrolera, która różni się od Twoich, postępując zgodnie z poniższymi przykładami.

Aby na przykład utworzyć rozszerzenie z niestandardową klasą kontrolera:

az ml extension create --config nginxIngress.controller="k8s.io/amlarc-ingress-nginx"

Aby zaktualizować rozszerzenie za pomocą niestandardowej klasy kontrolera:

az ml extension update --config nginxIngress.controller="k8s.io/amlarc-ingress-nginx"

Kontroler ruchu przychodzącego Nginx zainstalowany z rozszerzeniem usługi Azure Machine Edukacja ulega awarii z powodu błędów braku pamięci (OOM)

Objaw

Kontroler ruchu przychodzącego nginx zainstalowany z rozszerzeniem azure Machine Edukacja ulega awarii z powodu błędów braku pamięci (OOM), nawet jeśli nie ma obciążenia. Dzienniki kontrolera nie pokazują żadnych przydatnych informacji w celu zdiagnozowania problemu.

Możliwa przyczyna

Ten problem może wystąpić, jeśli kontroler ruchu przychodzącego nginx działa w węźle z wieloma procesorami CPU. Domyślnie kontroler ruchu przychodzącego nginx duplikuje procesy robocze zgodnie z liczbą procesorów CPU, co może zużywać więcej zasobów i powodować błędy OOM w węzłach z większą liczbą procesorów CPU. Jest to znany problem zgłoszony w usłudze GitHub

Rozwiązanie

Aby rozwiązać ten problem, można:

  • Dostosuj liczbę procesów roboczych, instalując rozszerzenie za pomocą parametru nginxIngress.controllerConfig.worker-processes=8.
  • Zwiększ limit pamięci, używając parametru nginxIngress.resources.controller.limits.memory=<new limit>.

Upewnij się, że te dwa parametry zostały dostosowane zgodnie ze specyfikacjami węzłów i wymaganiami dotyczącymi obciążeń, aby efektywnie zoptymalizować obciążenia.

Następne kroki