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

  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 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_UTILDCGM_FI_DEV_FB_FREE jsou DCGM_FI_DEV_FB_USED zpřístupněné metriky.

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

  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 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ě:

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

Další kroky