Ř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 Learning ve službě AKS nebo Kubernetes s podporou Arc.
Jak se instaluje rozšíření Azure Machine Learning
Rozšíření Azure Machine Learning se vydává jako chart Helm a nainstaluje ho Helm V3. Všechny komponenty rozšíření Azure Machine Learning se instalují do 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 Learning najdete v tématu o 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 Learning se ve starší verzi AKS nepodporuje. Pokud chcete nainstalovat rozšíření Azure Machine Learning, musíte odstranit starší komponenty azureml-fe. |
E45005 | AZUREML_FE_DEPLOYMENT_CONFLICT | Rozšíření Azure Machine Learning se ve starší verzi AKS nepodporuje. Pokud chcete nainstalovat rozšíření Azure Machine Learning, 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 Learning používá některé opensourcové komponenty, včetně prometheus Operator, Volcano Scheduler a vývozce DCGM. Pokud už cluster Kubernetes některé z nich má nainstalovaný, můžete si přečíst následující části pro integraci existujících komponent s rozšířením Azure Machine Learning.
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 Learning také využívá operátor Prometheus k monitorování využití prostředků úloh.
Pokud má cluster operátor Prometheus nainstalovaný jinou službou, můžete určit installPromOp=false
zakázání operátoru Prometheus v rozšíření Azure Machine Learning, aby nedocházelo ke 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 při zakázání operátoru prometheus v rozšíření Azure Machine Learning věnovat pozornost následujícím věcem.
- 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 Learning. 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 kroků pro integraci vašeho dcgm-exportéru do rozšíření Azure Machine Learning. 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 Learning se ujistěte, že DCGM_FI_DEV_GPU_UTIL
DCGM_FI_DEV_FB_FREE
jsou DCGM_FI_DEV_FB_USED
zpřístupněné metriky.
Ujistěte se, že máte úspěšně nainstalované rozšíření Aureml a dcgm-exportér. Dcgm-exportér lze nainstalovat pomocí chartu helmu 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 Learning. 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, kterou používá rozšíření Azure Machine Learning, 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
Musíte 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 úlohy trénování služby Azure Machine Learning mohly 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 Learning 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í úloh. 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: 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 Learning. - 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> --config volcanoScheduler.schedulerConfigMap=<configmap name> amloperator.skipResourceValidation=true --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name>
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.
Použití jiné konfigurace plánovače, než je výchozí nastavení poskytované rozšířením Azure Machine Learning, nemusí být plně podporováno. Postupujte opatrně.
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 Learning 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 naše rozšíření Azure Machine Learning pomocí vlastní třídy 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 služby Azure Machine Learning dochází k chybám 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 Learning se chybově ukončí 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.