Řešení potíží s rozšířením služby Azure Machine Learning
V tomto článku se dozvíte, jak řešit běžné problémy, se kterými se můžete setkat s nasazením rozšíření Azure Machine Učení ve službě AKS nebo Kubernetes s podporou arc.
Jak se instaluje rozšíření Azure Machine Learning
Rozšíření Azure Machine Učení se vydává jako chart Helm a nainstaluje ho Helm V3. Všechny komponenty rozšíření Azure Machine Učení jsou nainstalované v azureml
oboru názvů. Stav rozšíření můžete zkontrolovat pomocí následujících příkazů.
# 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'
Řešení problémů s chybou nasazení rozšíření Azure Machine Learning
Chyba: Nejde znovu použít název, který se stále používá
Tato chyba znamená, že zadaný název rozšíření již existuje. Pokud rozšíření Azure Machine Learning používá název, musíte počkat asi hodinu a zkusit to znovu. Pokud název používají jiné charty Helm, musíte použít jiný název. Spuštěním zobrazíte helm list -Aa
seznam všech grafů helmu v clusteru.
Chyba: Stále probíhá dřívější operace pro diagram Helmu
Musíte počkat asi hodinu a zkusit to znovu po dokončení neznámé operace.
Chyba: V oboru názvů azureml nejde vytvořit nový obsah, protože se právě ukončuje
K této chybě dochází v případě, že se nedokončí operace odinstalace a aktivuje se jiná operace instalace. Před provedením dalších akcí můžete spuštěním az k8s-extension show
příkazu zkontrolovat stav zřizování rozšíření a ujistit se, že se rozšíření odinstalovalo.
Chyba: Stahování selhalo, protože se nenašla cesta k diagramu
K této chybě dochází, když zadáte nesprávnou verzi rozšíření. Musíte se ujistit, že zadaná verze existuje. Pokud chcete použít nejnovější verzi, nemusíte zadávat --version
.
Chyba: Není možné provést import do aktuální verze: Neplatná metadata vlastnictví
Tato chyba znamená, že došlo ke konfliktu mezi existujícími prostředky clusteru a rozšířením Azure Machine Learning. Úplná chybová zpráva může vypadat jako v následujícím textu:
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"
Pokud chcete tento problém zmírnit, postupujte následovně.
Zkontrolujte, kdo je vlastníkem problematických prostředků a jestli je možné ho odstranit nebo upravit.
Pokud prostředek používá jenom rozšíření Azure Machine Learning a je možné ho odstranit, můžete tento problém zmírnit ručním přidáním popisků. Když jako příklad vezmeme předchozí chybovou zprávu, můžete spouštět příkazy následujícím způsobem,
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>"
Nastavením popisků a poznámek na prostředek to znamená, že prostředek vlastněný rozšířením Azure Machine Learning spravuje Helm.
Pokud prostředek používají také jiné komponenty v clusteru a není možné ho upravit. Informace o nasazení rozšíření Azure Machine Učení zjistíte, jestli neexistuje nastavení konfigurace, které zakáže konfliktní prostředek.
Kontrola stavu rozšíření
Pokud se instalace nezdařila a nedorazila žádná z výše uvedených chybových zpráv, můžete pomocí integrované úlohy kontroly stavu provést komplexní kontrolu rozšíření. Rozšíření Azure Machine Learning obsahuje úlohu pro předběžnou HealthCheck
kontrolu připravenosti clusteru při pokusu o instalaci, aktualizaci nebo odstranění rozšíření. Úloha HealthCheck vypíše sestavu, která je uložena v konfigurační mapě pojmenované arcml-healthcheck
v azureml
oboru názvů. Kódy chyb a možná řešení pro sestavu jsou uvedeny v kódu chyby HealthCheck.
Spuštěním tohoto příkazu získejte sestavu HealthCheck.
kubectl describe configmap -n azureml arcml-healthcheck
Kontrola stavu se aktivuje při každé instalaci, aktualizaci nebo odstranění rozšíření. Zpráva o kontrole stavu je strukturovaná s několika částmi pre-install
, pre-rollback
pre-upgrade
a pre-delete
.
- Pokud je rozšíření nainstalováno, měli byste se podívat
pre-install
apre-delete
. - Pokud se rozšíření neaktualizuje, měli byste se podívat a
pre-upgrade
pre-rollback
. - Pokud se rozšíření odstranilo, měli byste se podívat na
pre-delete
.
Když požádáte o podporu, doporučujeme spustit následující příkaz a odeslat nám soubor healthcheck.logs
, protože nám to může usnadnit vyhledávání a určení problému.
kubectl logs healthcheck -n azureml
Kód chyby HealthCheck
Tato tabulka ukazuje, jak řešit potíže s kódy chyb vrácenými sestavou HealthCheck.
Kód chyby | Chybová zpráva | Popis |
---|---|---|
E40001 | LOAD_BALANCER_NOT_SUPPORT | Nástroj pro vyrovnávání zatížení není ve vašem clusteru podporovaný. Musíte nakonfigurovat nástroj pro vyrovnávání zatížení ve vašem clusteru nebo zvážit nastavení inferenceRouterServiceType na nodePort nebo clusterIP . |
E40002 | INSUFFICIENT_NODE | Povolili jste povolení inferenceRouterHA , které vyžaduje alespoň tři uzly v clusteru. Pokud máte méně než tři uzly, zakažte vysokou dostupnost. |
E40003 | INTERNAL_LOAD_BALANCER_NOT_SUPPORT | V současné době podporuje interní nástroj pro vyrovnávání zatížení pouze AKS a tento typ podporujeme azure . Nenastavujte internalLoadBalancerProvider , pokud nemáte cluster AKS. |
E40007 | INVALID_SSL_SETTING | Klíč SSL nebo certifikát nejsou platné. CNAME by měl být kompatibilní s certifikátem. |
E45002 | PROMETHEUS_CONFLICT | Nainstalovaný operátor Prometheus je v konfliktu s vaším stávajícím operátorem Prometheus. Další informace naleznete v tématu Operátor Prometheus |
E45003 | BAD_NETWORK_CONNECTIVITY | Potřebujete splnit požadavky na síť. |
E45004 | AZUREML_FE_ROLE_CONFLICT | Rozšíření Azure Machine Učení se ve starší verzi AKS nepodporuje. Pokud chcete nainstalovat rozšíření Azure Machine Učení, musíte odstranit starší komponenty azureml-fe. |
E45005 | AZUREML_FE_DEPLOYMENT_CONFLICT | Rozšíření Azure Machine Učení se ve starší verzi AKS nepodporuje. Pokud chcete nainstalovat rozšíření Azure Machine Učení, musíte spustit příkaz pod tímto formulářem, abyste odstranili starší komponenty azureml-fe. Další podrobnosti najdete tady. |
Příkazy pro odstranění starších komponent azureml-fe v clusteru 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
Integrace opensourcových komponent
Rozšíření Azure Machine Učení používá některé opensourcové komponenty, včetně prometheus Operator, Volcano Scheduler a DCGM exportér. Pokud už cluster Kubernetes některé z nich má nainstalovaný, můžete si přečíst následující části pro integraci stávajících komponent s rozšířením Azure Machine Učení.
Operátor Prometheus
Operátor Prometheus je opensourcová architektura, která pomáhá vytvářet systém monitorování metrik v kubernetes. Rozšíření Azure Machine Učení také využívá operátor Prometheus, který pomáhá monitorovat využití prostředků úloh.
Pokud má cluster operátor Prometheus nainstalovaný jinou službou, můžete určitinstallPromOp=false
, jestli chcete v rozšíření Azure Machine Učení zakázat operátor Prometheus, abyste zabránili konfliktu mezi dvěma operátory Prometheus.
V tomto případě stávající operátor prometheus spravuje všechny instance Prometheus. Abyste měli jistotu, že Prometheus funguje správně, je potřeba věnovat pozornost tomu, když v rozšíření Azure Machine Učení zakážete operátora prometheus.
- Zkontrolujte, jestli je prometheus v oboru názvů azureml spravovaný operátorem Prometheus. V některých scénářích je operátor prometheus nastavený tak, aby monitorovat pouze některé konkrétní obory názvů. Pokud ano, ujistěte se, že je obor názvů azureml v seznamu povolených. Další informace najdete v příznakech příkazů.
- Zkontrolujte, jestli je v operátoru prometheus povolená služba kubelet-service. Kubelet-service obsahuje všechny koncové body kubeletu. Další informace najdete v příznakech příkazů. A také se musí ujistit, že kubelet-service má popisek
k8s-app=kubelet
. - Vytvořte ServiceMonitor pro kubelet-service. Spusťte následující příkaz s nahrazenými proměnnými:
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
Vývozce DCGM
Dcgm-exportér je oficiální nástroj doporučený společností NVIDIA pro shromažďování metrik GPU. Integrovali jsme ho do rozšíření Azure Machine Učení. Ve výchozím nastavení ale není povolený exportér dcgm a neshromažďuje se žádné metriky GPU. Můžete zadat installDcgmExporter
příznak, který chcete true
povolit. Protože se jedná o oficiální nástroj NVIDIA, možná už ho máte nainstalovaný v clusteru GPU. Pokud ano, můžete nastavit installDcgmExporter
false
a postupovat podle pokynů pro integraci exportéru dcgm do rozšíření Azure Machine Učení. Další věcí, kterou je třeba poznamenat, je, že nástroj dcgm-exportér umožňuje uživateli konfiguraci, které metriky mají být vystaveny. V případě rozšíření Azure Machine Učení se ujistěte, že DCGM_FI_DEV_GPU_UTIL
DCGM_FI_DEV_FB_FREE
jsou zpřístupněné metriky.DCGM_FI_DEV_FB_USED
Ujistěte se, že máte úspěšně nainstalované rozšíření Aureml a dcgm-exportér. Dcgm-exportér lze nainstalovat pomocí chartuhelmu pro dcgm nebo chart helmu operátora Gpu
Zkontrolujte, jestli není služba pro dcgm-exportér. Pokud neexistuje nebo nevíte, jak to zkontrolovat, vytvořte ho spuštěním následujícího příkazu.
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
Zkontrolujte, jestli je služba v předchozím kroku správně nastavená.
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
Nastavte ServiceMonitor tak, aby zpřístupnil službu dcgm-exportéru pro rozšíření Azure Machine Učení. Spusťte následující příkaz a trvá to několik 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
Volcano Scheduler
Pokud váš cluster už má nainstalovanou sadu sopek, můžete nastavit installVolcano=false
, takže rozšíření nenainstaluje plánovač sopek. Pro odesílání a plánování trénovacích úloh a plánování se vyžaduje plánovač sopek a kontroler sopek.
Konfigurace plánovače sopek používaná rozšířením Azure Machine Učení je:
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
Potřebujete použít stejné nastavení konfigurace a v případě, že je vaše verze sopek nižší než 1,6, musíte zakázat job/validate
webhook v přístupu k sopek, aby mohly úlohy trénování azure machine Učení správně fungovat.
Integrace plánovače sopek podporující automatické škálování clusteru
Jak je popsáno v tomto vlákně , modul plug-in gangu nefunguje dobře s automatickým škálováním clusteru (CA) a také automatickým škálováním uzlů v AKS.
Pokud používáte sopečné prostředí, které je součástí rozšíření Azure Machine Učení prostřednictvím nastaveníinstallVolcano=true
, má rozšíření ve výchozím nastavení konfiguraci plánovače, který nakonfiguruje modul plug-in gangu, aby se zabránilo zablokování úlohy. Automatické škálování clusteru (CA) v clusteru AKS proto nebude podporováno rozšířením nainstalovaného vulkánu.
Pokud v takovém případě dáváte přednost automatickému škálování clusteru AKS, můžete tento volcanoScheduler.schedulerConfigMap
parametr nakonfigurovat prostřednictvím aktualizace rozšíření a zadat vlastní konfiguraci plánovače gangu sopek, například:
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
Pokud chcete tuto konfiguraci použít v clusteru AKS, musíte postupovat následovně:
- Vytvořte soubor configmap s výše uvedenou konfigurací v
azureml
oboru názvů. Tento obor názvů se obvykle vytvoří při instalaci rozšíření Azure Machine Učení. - Nastavte
volcanoScheduler.schedulerConfigMap=<configmap name>
v konfiguraci rozšíření, aby se tato mapa konfigurace použila. A při instalaci rozšíření je potřeba přeskočit ověření prostředku konfiguracíamloperator.skipResourceValidation=true
. Příklad: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
Poznámka:
Vzhledem k tomu, že se modul plug-in gangu odebere, existuje potenciál, že k zablokování dojde, když sopek naplánuje práci.
- Pokud se chcete této situaci vyhnout, můžete v úlohách použít stejný typ instance.
Všimněte si, že pokud je verze vaší sopečného prostředí nižší než 1,6, musíte webhook v sopečném přístupu zakázatjob/validate
.
Kontroler Nginx příchozího přenosu dat
Instalace rozšíření Azure Machine Učení se dodává s třídou kontroleru nginx příchozího přenosu dat jako k8s.io/ingress-nginx
ve výchozím nastavení. Pokud už máte v clusteru kontroler nginx příchozího přenosu dat, musíte použít jinou třídu kontroleru, abyste se vyhnuli selhání instalace.
K dispozici jsou dvě možnosti:
- Změňte existující třídu kontroleru na něco jiného než
k8s.io/ingress-nginx
. - Pomocí následujících příkladů vytvořte nebo aktualizujte rozšíření Azure Machine Učení vlastní třídou kontroleru, která se liší od vaší.
Pokud chcete například vytvořit rozšíření s vlastní třídou kontroleru:
az ml extension create --config nginxIngress.controller="k8s.io/amlarc-ingress-nginx"
Aktualizace rozšíření vlastní třídou kontroleru:
az ml extension update --config nginxIngress.controller="k8s.io/amlarc-ingress-nginx"
Kontroler příchozího přenosu dat Nginx nainstalovaný s rozšířením Azure Machine Učení se chybově ukončí kvůli chybám nedostatku paměti (OOM).
Příznaky
Kontroler příchozího přenosu dat nginx nainstalovaný s rozšířením Azure Machine Učení dojde k chybovému ukončení kvůli chybám způsobeným nedostatkem paměti (OOM) i v případě, že neexistuje žádná úloha. Protokoly kontroleru nezobrazují žádné užitečné informace k diagnostice problému.
Možná příčina
K tomuto problému může dojít v případě, že kontroler příchozího přenosu dat nginx běží na uzlu s mnoha procesory. Ve výchozím nastavení řadič příchozího přenosu dat nginx vytváří pracovní procesy podle počtu procesorů, které mohou spotřebovávat více prostředků a způsobit chyby OOM na uzlech s více procesory. Jedná se o známý problém nahlášený na GitHubu.
Řešení
Chcete-li tento problém vyřešit, můžete postupovat takto:
- Upravte počet pracovních procesů instalací rozšíření s parametrem
nginxIngress.controllerConfig.worker-processes=8
. - Zvýšení limitu paměti pomocí parametru
nginxIngress.resources.controller.limits.memory=<new limit>
.
Ujistěte se, že tyto dva parametry upravíte podle specifikací konkrétního uzlu a požadavků na úlohy, abyste mohli efektivně optimalizovat úlohy.