Ř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-rollbackpre-upgrade a pre-delete.

  • Pokud je rozšíření nainstalováno, měli byste se podívat pre-install a pre-delete.
  • Pokud se rozšíření neaktualizuje, měli byste se podívat a pre-upgradepre-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.

  1. 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ů.
  2. 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á popisekk8s-app=kubelet.
  3. 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 installDcgmExporterfalse 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_UTILDCGM_FI_DEV_FB_FREE jsou zpřístupněné metriky.DCGM_FI_DEV_FB_USED

  1. 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

  2. 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
    
  3. 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
    
  4. 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ě:

  1. 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í.
  2. 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.

Další kroky