Delen via


Problemen met Azure Machine Learning-extensie oplossen

In dit artikel leert u hoe u veelvoorkomende problemen kunt oplossen die kunnen optreden bij de implementatie van Azure Machine Learning-extensies in uw Azure Kubernetes Service (AKS) of Kubernetes met 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'

Problemen met de implementatie van de 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 door andere Helm-charts wordt gebruikt, 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 implementatie van de Azure Machine Learning-extensie om te zien of er een configuratie-instelling is om de conflictresource uit te schakelen.

HealthCheck van de extensie

Wanneer de installatie is mislukt en geen van de eerder genoemde foutmeldingen voorkwam, kunt u de ingebouwde controlefunctie gebruiken voor een grondige controle van 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-healthcheckazureml . 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-rollbacken pre-upgradepre-delete.

  • Als de installatie van de extensie is mislukt, moet u kijken naar pre-install en pre-delete.
  • Als het bijwerken van de extensie is mislukt, moet u kijken naar pre-upgrade en pre-rollback.
  • Als het verwijderen van de extensie is mislukt, 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

Extensie-operator-pod in azure-arc/kube-system-naamruimte crasht vanwege OOMKill

Dit probleem treedt op wanneer de Helm-grafiekgrootte van de extensie groot is en er meerdere Helm-releases in het cluster zijn. Gebruik de volgende opdrachten om de Helm-geschiedenis van de Azure ML-extensie te controleren:

# Check if there is a release of the Azure ML extension Helm chart installed on the cluster
# Note: The default namespace for the extension is usually 'azureml'. If you specified a different namespace during installation, replace 'azureml' with your namespace.
helm list -n azureml

# Get helm history 
# Note: <release-name> should be the name of your azure ml extension and can be retrieved from the output of the previous command
helm history -n <extension-namespace> azureml

Er is een Helm-geschiedenislimiet van 10 revisies, maar deze limiet geldt alleen voor revisies in een niet-tijdelijke status. Als u meerdere revisies in de uitvoer van de Helm-geschiedenis ziet die zich in een status van terugdraaien in behandeling of upgraden in behandeling bevinden, voert u het onderstaande script uit om de Helm-geschiedenis op het cluster op te schonen.

#!/bin/bash

# Set release name and namespace
RELEASE_NAME=$1 # release-name is the name of the azure ml extension helm release 
NAMESPACE=$2 # namespace is the azure ml extension's namespace. Default value is azureml 

# Validate input
if [[ -z "$RELEASE_NAME" || -z "$NAMESPACE" ]]; then
    echo "Usage: $0 <release-name> <namespace>"
    exit 1
fi

echo "Fetching Helm history for release: $RELEASE_NAME in namespace: $NAMESPACE"

# Get stuck revisions (PENDING_ROLLBACK or PENDING_UPGRADE) using grep + awk for accurate parsing
STUCK_REVISIONS=$(helm history "$RELEASE_NAME" -n "$NAMESPACE" | grep 'pending-' | awk '{print $1}')

if [[ -z "$STUCK_REVISIONS" ]]; then
    echo "No stuck Helm revisions found. Nothing to delete."
    exit 0
fi

echo "Found stuck Helm revisions: $STUCK_REVISIONS"

# Loop through each stuck revision and delete the corresponding secret
for REVISION in $STUCK_REVISIONS; do
    SECRET_NAME="sh.helm.release.v1.${RELEASE_NAME}.v${REVISION}"
   
    echo "Deleting Helm history secret: $SECRET_NAME"
   
    kubectl delete secret -n "$NAMESPACE" "$SECRET_NAME" --ignore-not-found
done

echo "Cleanup complete. Verify with 'helm history $RELEASE_NAME -n $NAMESPACE'"

exit 0

Het script uitvoeren:

chmod +x delete_stuck_helm_secrets.sh

./delete_stuck_helm_secrets.sh <release-name> <extension-namespace>

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_ONDERSTEUNT_NIET Load balancer wordt niet ondersteund in uw cluster. Je moet de load balancer in je cluster configureren of overweeg om inferenceRouterServiceType in te stellen op nodePort of clusterIP.
E40002 ONVOLDOENDE KNOOP U hebt inferenceRouterHA ingeschakeld, wat ten minste drie knooppunten in uw cluster vereist. Schakel de HA uit als u minder dan drie knooppunten hebt.
E40003 INTERN_LOAD_BALANCER_NIET_ONDERSTEUND Momenteel ondersteunen alleen AKS de interne load balancer en ondersteunen we alleen het azure type. Stel internalLoadBalancerProvider niet in als u geen AKS-cluster hebt.
E40007 ONGELDIGE_SSL-INSTELLING 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 staat in conflict met uw bestaande Prometheus Operator. Zie prometheus-operator voor meer informatie
E45003 SLECHTE_NETWERKVERBINDING 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. Meer informatie kunt u hier raadplegen.

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. We moeten ook ervoor 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. Deze is 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 de parameter installDcgmExporter opgeven om true in te schakelen. Omdat het het officiële hulpprogramma van NVIDIA is, hebt u het mogelijk al geïnstalleerd in uw GPU-cluster. Als dat het geval is, kunt u installDcgmExporter instellen op false en de stappen 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_FREEDCGM_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 met behulp van de Dcgm-exporter helm chart of de Gpu-operator helm chart

  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
    

Vulkaanplanner

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-instelling gebruiken en de webhook in de vulkaantoelating uitschakelen als uw vulkaanversie lager is dan 1.6, zodat de trainingsworkloads van Azure Machine Learning goed kunnen presteren.

De integratie van de Volcano-scheduler ondersteunt de cluster-autoscaler.

Zoals besproken in deze thread, werkt de gang-plugin niet goed met de cluster-autoscaler (CA) en ook niet met de node-autoscaler in AKS.

Als u de vulkaan gebruikt die bij de Azure Machine Learning extensie wordt geleverd met behulp van de instelling installVolcano=true, heeft de extensie standaard een plannerconfiguratie, waarmee de gang plugin 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, als u verkiest dat de automatische schaalaanpassing van het AKS-cluster normaal functioneert, kunt u deze volcanoScheduler.schedulerConfigMap parameter configureren door de extensie te updaten en een aangepaste configuratie van no gang volcano scheduler op te geven, 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 configmap-bestand met de vorige 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 amloperator.skipResourceValidation=true te configureren. 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 gangplugin wordt verwijderd, bestaat de mogelijkheid dat de impasse optreedt wanneer de vulkaan de taak inroostert.

  • Om deze situatie te voorkomen, kunt u hetzelfde exemplaartype over de taken heen 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.

Je moet de job/validate webhook uitschakelen in de toegang van de vulkaan als je versie lager is dan 1.6.

Ingress Nginx-controller

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, crasht vanwege out-of-memory (OOM) fouten.

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 start de nginx-ingresscontroller werkprocessen op basis van het aantal CPU's, wat meer resources kan verbruiken en OOM-errors kan veroorzaken op nodes met meer CPU's. 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