Delen via


Problemen met Azure Machine Learning-extensie oplossen

In dit artikel leert u hoe u veelvoorkomende problemen kunt oplossen die kunnen optreden met de implementatie van azure Machine Learning-extensies in uw Kubernetes met AKS of Arc.

Hoe wordt de Azure Machine Learning-extensie geïnstalleerd?

De Azure Machine Learning-extensie wordt uitgebracht als helm-grafiek en geïnstalleerd door Helm V3. Alle onderdelen van de Azure Machine Learning-extensie worden geïnstalleerd in azureml de naamruimte. U kunt de volgende opdrachten gebruiken om de extensiestatus te controleren.

# 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'

Implementatiefout in Azure Machine Learning-extensie oplossen

Fout: kan een naam die nog in gebruik is niet opnieuw gebruiken

Deze fout betekent dat de extensienaam die u hebt opgegeven al bestaat. Als de naam wordt gebruikt door de Azure Machine Learning-extensie, moet u ongeveer een uur wachten en het opnieuw proberen. Als de naam wordt gebruikt door andere Helm-grafieken, moet u een andere naam gebruiken. Voer deze opdracht uit helm list -Aa om alle Helm-grafieken in uw cluster weer te geven.

Fout: eerdere bewerking van de Helm-grafiek wordt nog uitgevoerd

U moet ongeveer een uur wachten en het opnieuw proberen nadat de onbekende bewerking is voltooid.

Fout: kan geen nieuwe inhoud maken in naamruimte azureml omdat deze wordt beëindigd

Deze fout treedt op wanneer een verwijderingsbewerking niet is voltooid en een andere installatiebewerking wordt geactiveerd. U kunt de opdracht az k8s-extension show uitvoeren om de inrichtingsstatus van de extensie te controleren en ervoor te zorgen dat de extensie is verwijderd voordat u andere acties uitvoert.

Fout: downloaden mislukt, kan het grafiekpad niet vinden

Deze fout treedt op wanneer u een verkeerde extensieversie opgeeft. U moet ervoor zorgen dat de opgegeven versie bestaat. Als u de nieuwste versie wilt gebruiken, hoeft u niet op te geven --version .

Fout: kan niet worden geïmporteerd in de huidige release: ongeldige eigendomsmetagegevens

Deze fout betekent dat er een conflict is tussen bestaande clusterresources en de Azure Machine Learning-extensie. Een volledig foutbericht kan er ongeveer als de volgende tekst uitzien:

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"

Gebruik de volgende stappen om het probleem te verhelpen.

  • Controleer wie eigenaar is van de problematische resources en of de resource kan worden verwijderd of gewijzigd.

  • Als de resource alleen wordt gebruikt door de Azure Machine Learning-extensie en kan worden verwijderd, kunt u handmatig labels toevoegen om het probleem te verhelpen. Als u het vorige foutbericht als voorbeeld neemt, kunt u opdrachten als volgt uitvoeren:

    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>"
    

    Door de labels en aantekeningen in te stellen voor de resource, betekent dit dat Helm de resource beheert die eigendom is van de Azure Machine Learning-extensie.

  • Wanneer de resource ook wordt gebruikt door andere onderdelen in uw cluster en niet kan worden gewijzigd. Raadpleeg de Azure Machine Learning-extensie implementeren om te zien of er een configuratie-instelling is om de conflictresource uit te schakelen.

HealthCheck van extensie

Wanneer de installatie is mislukt en geen van de bovenstaande foutberichten heeft bereikt, kunt u de ingebouwde statuscontroletaak gebruiken om een uitgebreide controle uit te voeren op de extensie. De Azure Machine Learning-extensie bevat een HealthCheck taak om de gereedheid van uw cluster vooraf te controleren wanneer u de extensie probeert te installeren, bij te werken of te verwijderen. De HealthCheck-taak voert een rapport uit, dat wordt opgeslagen in een configuratiemap met de naamruimte arcml-healthcheck azureml . De foutcodes en mogelijke oplossingen voor het rapport worden vermeld in foutcode van HealthCheck.

Voer deze opdracht uit om het HealthCheck-rapport op te halen.

kubectl describe configmap -n azureml arcml-healthcheck

De statuscontrole wordt geactiveerd wanneer u de extensie installeert, bijwerkt of verwijdert. Het statuscontrolerapport is gestructureerd met verschillende onderdelenpre-install, pre-rollbackpre-upgrade en pre-delete.

  • Als de extensie is geïnstalleerd, moet u kijken naar pre-install en pre-delete.
  • Als de extensie is bijgewerkt, moet u kijken naar pre-upgrade en pre-rollback.
  • Als de extensie is verwijderd, moet u kijken naar pre-delete.

Wanneer u ondersteuning aanvraagt, raden we u aan de volgende opdracht uit te voeren en het healthcheck.logs-bestand naar ons te verzenden, omdat dit ons kan helpen het probleem beter te vinden.

kubectl logs healthcheck -n azureml

Foutcode van HealthCheck

In deze tabel ziet u hoe u de foutcodes kunt oplossen die worden geretourneerd door het HealthCheck-rapport.

Foutcode Foutbericht Beschrijving
E40001 LOAD_BALANCER_NOT_SUPPORT Load balancer wordt niet ondersteund in uw cluster. U moet de load balancer in uw cluster configureren of instellen inferenceRouterServiceType nodePort op of clusterIP.
E40002 INSUFFICIENT_NODE U hebt ten minste drie knooppunten in uw cluster ingeschakeld inferenceRouterHA . Schakel de ha uit als u minder dan drie knooppunten hebt.
E40003 INTERNAL_LOAD_BALANCER_NOT_SUPPORT Momenteel ondersteunen alleen AKS de interne load balancer en ondersteunen we alleen het azure type. Stel deze optie niet in internalLoadBalancerProvider als u geen AKS-cluster hebt.
E40007 INVALID_SSL_SETTING De SSL-sleutel of het SSL-certificaat is niet geldig. De CNAME moet compatibel zijn met het certificaat.
E45002 PROMETHEUS_CONFLICT De geïnstalleerde Prometheus-operator is een conflict met uw bestaande Prometheus-operator. Zie prometheus-operator voor meer informatie
E45003 BAD_NETWORK_CONNECTIVITY U moet voldoen aan de netwerkvereisten.
E45004 AZUREML_FE_ROLE_CONFLICT De Azure Machine Learning-extensie wordt niet ondersteund in de verouderde AKS. Als u de Azure Machine Learning-extensie wilt installeren, moet u de verouderde azureml-fe-onderdelen verwijderen.
E45005 AZUREML_FE_DEPLOYMENT_CONFLICT De Azure Machine Learning-extensie wordt niet ondersteund in de verouderde AKS. Als u de Azure Machine Learning-extensie wilt installeren, moet u de opdracht onder dit formulier uitvoeren om de verouderde azureml-fe-onderdelen te verwijderen. Hier vindt u meer informatie.

Opdrachten voor het verwijderen van de verouderde azureml-fe-onderdelen in het AKS-cluster:

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

Integratie van Open Source-onderdelen

De Azure Machine Learning-extensie maakt gebruik van enkele opensource-onderdelen, waaronder Prometheus Operator, Volcano Scheduler en DCGM-exporteur. Als er al een aantal kubernetes-clusters is geïnstalleerd, kunt u de volgende secties lezen om uw bestaande onderdelen te integreren met de Azure Machine Learning-extensie.

Prometheus-operator

Prometheus-operator is een opensource-framework om het bewakingssysteem voor metrische gegevens in kubernetes te bouwen. De Azure Machine Learning-extensie maakt ook gebruik van de Prometheus-operator om het resourcegebruik van taken te bewaken.

Als op het cluster de Prometheus-operator is geïnstalleerd door een andere service, kunt u opgeven installPromOp=false dat de Prometheus-operator in de Azure Machine Learning-extensie wordt uitgeschakeld om een conflict tussen twee Prometheus-operators te voorkomen. In dit geval beheert de bestaande prometheus-operator alle Prometheus-exemplaren. Om ervoor te zorgen dat Prometheus goed werkt, moeten de volgende zaken worden opgelet wanneer u de prometheus-operator uitschakelt in de Azure Machine Learning-extensie.

  1. Controleer of prometheus in azureml-naamruimte wordt beheerd door de Prometheus-operator. In sommige scenario's is de prometheus-operator zo ingesteld dat alleen bepaalde specifieke naamruimten worden bewaakt. Als dit het geval is, controleert u of de azureml-naamruimte zich in de acceptatielijst bevindt. Zie de opdrachtvlagmen voor meer informatie.
  2. Controleer of kubelet-service is ingeschakeld in de prometheus-operator. Kubelet-service bevat alle eindpunten van kubelet. Zie de opdrachtvlagmen voor meer informatie. En moet er ook voor zorgen dat kubelet-service een labelk8s-app=kubelet heeft.
  3. ServiceMonitor maken voor kubelet-service. Voer de volgende opdracht uit door variabelen te vervangen:
    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
    

DCGM-exporteur

Dcgm-exporteur is het officiële hulpprogramma dat door NVIDIA wordt aanbevolen voor het verzamelen van GPU-metrische gegevens. We hebben deze geïntegreerd in de Azure Machine Learning-extensie. Maar standaard is dcgm-exporteur niet ingeschakeld en worden er geen GPU-metrische gegevens verzameld. U kunt een vlag opgeven installDcgmExporter om deze in te true schakelen. Omdat het het officiële hulpprogramma van NVIDIA is, hebt u het mogelijk al geïnstalleerd in uw GPU-cluster. Zo ja, dan kunt u de stappen instellen installDcgmExporter false en volgen om uw dcgm-exporteur te integreren in de Azure Machine Learning-extensie. Een ander ding om op te merken is dat dcgm-exporteur de gebruiker in staat stelt om te configureren welke metrische gegevens beschikbaar moeten worden gesteld. Controleer voor de Azure Machine Learning-extensie of DCGM_FI_DEV_GPU_UTILDCGM_FI_DEV_FB_FREE DCGM_FI_DEV_FB_USED er metrische gegevens beschikbaar zijn.

  1. Zorg ervoor dat u de Aureml-extensie en dcgm-exporteur hebt geïnstalleerd. Dcgm-exporteur kan worden geïnstalleerd door dcgm-exporteur helm-grafiek of Gpu-operator helm-grafiek

  2. Controleer of er een service is voor dcgm-exporteur. Als deze niet bestaat of als u niet weet hoe u dit kunt controleren, voert u de volgende opdracht uit om er een te maken.

    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. Controleer of de service in de vorige stap juist is ingesteld

    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. Stel ServiceMonitor in om de dcgm-exportservice beschikbaar te maken voor de Azure Machine Learning-extensie. Voer de volgende opdracht uit en dit duurt enkele minuten.

    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

Als uw cluster de vulkaansuite al heeft geïnstalleerd, kunt u instellen installVolcano=false, zodat de extensie de vulkaanplanner niet installeert. Vulkanenplanner en vulkanencontroller zijn vereist voor het indienen en plannen van trainingstaken.

De vulkan scheduler-configuratie die wordt gebruikt door de Azure Machine Learning-extensie is:

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

U moet dezelfde configuratie-instellingen gebruiken en u moet webhook uitschakelen job/validate in de vulkaantoegang als uw vulkaanversie lager is dan 1.6, zodat Azure Machine Learning-trainingsworkloads goed kunnen presteren.

Volcano scheduler-integratie die automatische schaalaanpassing van clusters ondersteunt

Zoals besproken in deze thread , werkt de invoegtoepassing gang niet goed met de automatische schaalaanpassing van clusters en ook met de automatische schaalaanpassing van knooppunten in AKS.

Als u de vulkaan gebruikt die bij de Azure Machine Learning-extensie wordt geleverd via de instellinginstallVolcano=true, heeft de extensie standaard een scheduler-configuratie, waarmee de gang-invoegtoepassing wordt geconfigureerd om een impasse bij de taak te voorkomen. Daarom wordt de automatische schaalaanpassing van clusters in AKS-cluster niet ondersteund met de vulkaan die door extensie is geïnstalleerd.

In dit geval kunt u, als u liever de automatische schaalaanpassing van het AKS-cluster gebruikt, deze volcanoScheduler.schedulerConfigMap parameter configureren via het bijwerken van de extensie en een aangepaste configuratie opgeven van geen gang vulkaanplanner, bijvoorbeeld:

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

Als u deze configuratie in uw AKS-cluster wilt gebruiken, moet u de volgende stappen uitvoeren:

  1. Maak een configuratiemapbestand met de bovenstaande configuratie in de azureml naamruimte. Deze naamruimte wordt doorgaans gemaakt wanneer u de Azure Machine Learning-extensie installeert.
  2. Stel volcanoScheduler.schedulerConfigMap=<configmap name> in de extensieconfiguratie in om deze configuratiemap toe te passen. En u moet de resourcevalidatie overslaan bij het installeren van de extensie door deze te amloperator.skipResourceValidation=trueconfigureren. Bijvoorbeeld:
    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>
    

Notitie

Omdat de invoegtoepassing van de bende wordt verwijderd, is er mogelijk dat de impasse optreedt wanneer de vulkaan de taak plant.

  • Om deze situatie te voorkomen, kunt u hetzelfde exemplaartype in de taken gebruiken.

Het gebruik van een andere scheduler-configuratie dan de standaardconfiguratie van de Azure Machine Learning-extensie wordt mogelijk niet volledig ondersteund. Ga zorgvuldig te werk.

Houd er rekening mee dat u webhook in de vulkaantoegang moet uitschakelen job/validate als uw vulkaanversie lager is dan 1.6.

Nginx-controller voor inkomend verkeer

De installatie van de Azure Machine Learning-extensie wordt standaard geleverd met een nginx-controllerklasse k8s.io/ingress-nginx voor inkomend verkeer. Als u al een nginx-controller voor inkomend verkeer in uw cluster hebt, moet u een andere controllerklasse gebruiken om installatiefouten te voorkomen.

U hebt twee opties:

  • Wijzig de bestaande controllerklasse in iets anders dan k8s.io/ingress-nginx.
  • Maak of werk onze Azure Machine Learning-extensie bij met een aangepaste controllerklasse die verschilt van die van u door de volgende voorbeelden te volgen.

Als u bijvoorbeeld de extensie wilt maken met een aangepaste controllerklasse:

az ml extension create --config nginxIngress.controller="k8s.io/amlarc-ingress-nginx"

De extensie bijwerken met een aangepaste controllerklasse:

az ml extension update --config nginxIngress.controller="k8s.io/amlarc-ingress-nginx"

Nginx-ingangscontroller geïnstalleerd met de Azure Machine Learning-extensie loopt vast vanwege OOM-fouten (out-of-memory)

Symptoom

De nginx-ingangscontroller die is geïnstalleerd met de Azure Machine Learning-extensie loopt vast vanwege OOM-fouten (out-of-memory), zelfs als er geen workload is. In de controllerlogboeken worden geen nuttige informatie weergegeven om het probleem vast te stellen.

Mogelijke oorzaak

Dit probleem kan optreden als de nginx-ingangscontroller wordt uitgevoerd op een knooppunt met veel CPU's. Standaard veroorzaakt de nginx-ingangscontroller werkprocessen op basis van het aantal CPU's, dat meer resources kan verbruiken en OOM-fouten op knooppunten met meer CPU's kan veroorzaken. Dit is een bekend probleem dat is gerapporteerd op GitHub

Oplossing

Om dit probleem op te lossen, kunt u:

  • Pas het aantal werkprocessen aan door de extensie met de parameter nginxIngress.controllerConfig.worker-processes=8te installeren.
  • Verhoog de geheugenlimiet met behulp van de parameter nginxIngress.resources.controller.limits.memory=<new limit>.

Zorg ervoor dat u deze twee parameters aanpast op basis van uw specifieke knooppuntspecificaties en workloadvereisten om uw workloads effectief te optimaliseren.

Volgende stappen