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 Learning 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 Learning jest wydawane jako pakiet helm i instalowane przez program Helm W wersji 3. Wszystkie składniki rozszerzenia usługi Azure Machine Learning 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 Learning, 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-rollback
pre-upgrade
i pre-delete
.
- Jeśli rozszerzenie nie powiodło się, należy zapoznać się z
pre-install
elementami ipre-delete
. - Jeśli rozszerzenie nie powiodło się, należy zapoznać
pre-upgrade
się z elementami ipre-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 usługi Azure Machine Learning nie jest obsługiwane w starszej wersji usługi AKS. Aby zainstalować rozszerzenie usługi Azure Machine Learning, należy usunąć starsze składniki azureml-fe. |
E45005 | AZUREML_FE_DEPLOYMENT_CONFLICT | Rozszerzenie usługi Azure Machine Learning nie jest obsługiwane w starszej wersji usługi AKS. Aby zainstalować rozszerzenie usługi Azure Machine Learning, musisz 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 Usługi Azure Machine Learning korzysta z 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 Learning.
Operator Prometheus
Operator Prometheus to platforma typu open source ułatwiająca tworzenie systemu monitorowania metryk w rozwiązaniu kubernetes. Rozszerzenie usługi Azure Machine Learning 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 Learning, 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 Azure Machine Learning należy zwrócić uwagę na następujące kwestie.
- 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ń.
- 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
. - 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 Learning. 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ść installDcgmExporter
false
i wykonać kroki, aby zintegrować eksportera dcgm z rozszerzeniem Usługi Azure Machine Learning. 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 Learning upewnij się, że DCGM_FI_DEV_GPU_UTIL
DCGM_FI_DEV_FB_FREE
metryki i są DCGM_FI_DEV_FB_USED
uwidocznione.
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
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
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
Skonfiguruj narzędzie ServiceMonitor, aby uwidocznić usługę dcgm-eksportera w rozszerzeniu usługi Azure Machine Learning. 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 wulkanów używana przez rozszerzenie usługi Azure Machine Learning 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 obciążenia szkoleniowe usługi Azure Machine Learning 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 usługi Azure Machine Learning za pośrednictwem 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: 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:
- 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 Learning. - Ustaw
volcanoScheduler.schedulerConfigMap=<configmap name>
w konfiguracji rozszerzenia, aby zastosować tę configmap. Należy pominąć walidację zasobów podczas instalowania rozszerzenia, konfigurując elementamloperator.skipResourceValidation=true
. Przykład:az k8s-extension update --name <extension-name> --config volcanoScheduler.schedulerConfigMap=<configmap name> amloperator.skipResourceValidation=true --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name>
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ń.
Korzystanie z konfiguracji harmonogramu innej niż domyślna podana przez rozszerzenie usługi Azure Machine Learning może nie być w pełni obsługiwane. Zachowaj przy tym ostrożność.
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 usługi Azure Machine Learning 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 nasze rozszerzenie usługi Azure Machine Learning 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 Learning ulega awarii z powodu błędów braku pamięci (OOM)
Objaw
Kontroler ruchu przychodzącego nginx zainstalowany z rozszerzeniem usługi Azure Machine Learning 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 skorzystać z następujących opcji:
- 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.