Condividi tramite


Risolvere i problemi relativi all'estensione Azure Machine Learning

Questo articolo illustra come risolvere i problemi comuni che possono verificarsi con la distribuzione dell'estensione Azure Machine Learning nel servizio Azure Kubernetes o in Kubernetes abilitato per Arc.

Come è installata l'estensione di Azure Machine Learning

L'estensione Azure Machine Learning viene rilasciata come chart helm e installata da Helm V3. Tutti i componenti dell'estensione Azure Machine Learning vengono installati nello azureml spazio dei nomi. È possibile usare i comandi seguenti per controllare lo stato dell'estensione.

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

Risolvere l'errore di distribuzione dell'estensione di Azure Machine Learning

Errore: non è possibile riutilizzare un nome ancora in uso

Questo errore indica che il nome dell'estensione specificato esiste già. Se il nome viene usato dall'estensione Azure Machine Learning, è necessario attendere circa un'ora e riprovare. Se il nome viene usato da altri grafici helm, è necessario usare un altro nome. Eseguire helm list -Aa per elencare tutti i grafici Helm nel cluster.

Errore: l'operazione precedente per il grafico helm è ancora in corso

È necessario attendere circa un'ora e riprovare dopo il completamento dell'operazione sconosciuta.

Errore: non è possibile creare nuovo contenuto nello spazio dei nomi azureml perché sta per essere terminato

Questo errore si verifica quando non viene completata un'operazione di disinstallazione e viene attivata un'altra operazione di installazione. È possibile eseguire il comando az k8s-extension show per controllare lo stato di provisioning dell'estensione e assicurarsi che l'estensione sia stata disinstallata prima di eseguire altre azioni.

Errore: il download non è riuscito perché il percorso grafico non è stato trovato

Questo errore si verifica quando si specifica una versione dell'estensione errata. È necessario assicurarsi che la versione specificata esista. Se si vuole usare la versione più recente, non è necessario specificare --version .

Errore: l'importazione nella versione corrente non è riuscita: metadati di proprietà non validi

Questo errore indica che si verifica un conflitto tra le risorse del cluster esistenti e l'estensione Azure Machine Learning. Un messaggio di errore completo potrebbe essere simile al seguente testo:

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"

Per attenuare il problema, seguire questa procedura.

  • Controllare chi usa le risorse problematiche e se la risorsa può essere eliminata o modificata.

  • Se la risorsa viene usata solo dall'estensione Azure Machine Learning e può essere eliminata, è possibile aggiungere manualmente etichette per attenuare il problema. Prendendo come esempio il messaggio di errore precedente, è possibile eseguire i comandi come indicato di seguito:

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

    Quando si impostano le etichette e le annotazioni sulla risorsa, significa che helm sta gestendo la risorsa che è di proprietà dell'estensione Azure Machine Learning.

  • Quando la risorsa viene usata anche da altri componenti nel cluster e non può essere modificata. Vedere Distribuire l'estensione Azure Machine Learning per verificare se è presente un'impostazione di configurazione per disabilitare la risorsa in conflitto.

Controllo integrità dell'estensione

Quando l'installazione non è riuscita e non ha raggiunto uno dei messaggi di errore precedenti, è possibile usare il processo di controllo integrità predefinito per eseguire un controllo completo sull'estensione. L'estensione di Azure Machine Learning contiene un HealthCheck processo per precontrollare l'idoneità del cluster quando si tenta di installare, aggiornare o eliminare l'estensione. Il processo HealthCheck restituisce un report, che viene salvato in una mappa di configurazione denominata arcml-healthcheck nello azureml spazio dei nomi. I codici di errore e le possibili soluzioni per il report sono elencati in Codice errore di HealthCheck.

Eseguire questo comando per ottenere il report HealthCheck,

kubectl describe configmap -n azureml arcml-healthcheck

Il controllo integrità viene attivato ogni volta che si installa, si aggiorna o si elimina l'estensione. Il report di controllo integrità è strutturato con diverse parti pre-install, pre-rollbackpre-upgrade e pre-delete.

  • Se l'estensione è installata non è riuscita, è necessario esaminare pre-install e pre-delete.
  • Se l'estensione viene aggiornata non è riuscita, è necessario esaminare pre-upgrade e pre-rollback.
  • Se l'estensione viene eliminata non è riuscita, è necessario esaminare pre-delete.

Quando si richiede supporto, è consigliabile eseguire il comando seguente e inviare il file healthcheck.logs a Microsoft per facilitare l'individuazione del problema.

kubectl logs healthcheck -n azureml

Codice di errore di HealthCheck

Questa tabella illustra come risolvere i codici di errore restituiti dal report HealthCheck.

Codice di errore Messaggio di errore Descrizione
E40001 LOAD_BALANCER_NOT_SUPPORT Il servizio di bilanciamento del carico non è supportato nel cluster. È necessario configurare il servizio di bilanciamento del carico nel cluster oppure impostare inferenceRouterServiceTypenodePort su o clusterIP.
E40002 INSUFFICIENT_NODE È stato abilitato inferenceRouterHA che richiede almeno tre nodi nel cluster. Disabilitare la disponibilità elevata se sono presenti meno di tre nodi.
E40003 INTERNAL_LOAD_BALANCER_NOT_SUPPORT Attualmente, solo il servizio Azure Kubernetes supporta il servizio di bilanciamento del carico interno e supporta solo il azure tipo. Non impostare internalLoadBalancerProvider se non si dispone di un cluster del servizio Azure Kubernetes.
E40007 INVALID_SSL_edizione Standard TTING La chiave SSL o il certificato non sono validi. Il CNAME deve essere compatibile con il certificato.
E45002 PROMETHEUS_CONFLICT L'operatore Prometheus installato è in conflitto con l'operatore Prometheus esistente. Per altre informazioni, vedere Operatore Prometheus
E45003 BAD_NETWORK_CONNECTIVITY È necessario soddisfare i requisiti di rete.
E45004 AZUREML_FE_ROLE_CONFLICT L'estensione Azure Machine Learning non è supportata nel servizio Azure Kubernetes legacy. Per installare l'estensione Azure Machine Learning, è necessario eliminare i componenti azureml-fe legacy.
E45005 AZUREML_FE_DEPLOYMENT_CONFLICT L'estensione Azure Machine Learning non è supportata nel servizio Azure Kubernetes legacy. Per installare l'estensione Azure Machine Learning, è necessario eseguire il comando seguente per eliminare i componenti azureml-fe legacy. Per altri dettagli, vedere qui.

Comandi per eliminare i componenti azureml-fe legacy nel cluster del servizio Azure Kubernetes:

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

Integrazione dei componenti open source

L'estensione Azure Machine Learning usa alcuni componenti open source, tra cui Prometheus Operator, Volcano Scheduler e l'utilità di esportazione DCGM. Se il cluster Kubernetes include già alcune di esse installate, è possibile leggere le sezioni seguenti per integrare i componenti esistenti con l'estensione Azure Machine Learning.

Operatore Prometheus

L'operatore Prometheus è un framework open source che consente di creare un sistema di monitoraggio delle metriche in kubernetes. L'estensione Azure Machine Learning usa anche l'operatore Prometheus per monitorare l'utilizzo delle risorse dei processi.

Se nel cluster è installato l'operatore Prometheus da un altro servizio, è possibile specificare installPromOp=false di disabilitare l'operatore Prometheus nell'estensione Di Azure Machine Learning per evitare un conflitto tra due operatori Prometheus. In questo caso, l'operatore prometheus esistente gestisce tutte le istanze di Prometheus. Per assicurarsi che Prometheus funzioni correttamente, è necessario prestare attenzione alle operazioni seguenti quando si disabilita l'operatore prometheus nell'estensione Azure Machine Learning.

  1. Controllare se prometheus nello spazio dei nomi azureml è gestito dall'operatore Prometheus. In alcuni scenari, l'operatore prometheus è impostato per monitorare solo alcuni spazi dei nomi specifici. In tal caso, assicurarsi che lo spazio dei nomi azureml sia incluso nell'elenco consenti. Per altre informazioni, vedere Flag di comando.
  2. Controllare se kubelet-service è abilitato nell'operatore prometheus. Kubelet-service contiene tutti gli endpoint di kubelet. Per altre informazioni, vedere Flag di comando. Inoltre, è necessario assicurarsi che kubelet-service abbia un'etichettak8s-app=kubelet.
  3. Creare ServiceMonitor per kubelet-service. Eseguire il comando seguente con variabili sostituite:
    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
    

Utilità di esportazione DCGM

Dcgm-exporter è lo strumento ufficiale consigliato da NVIDIA per la raccolta di metriche GPU. È stata integrata nell'estensione Azure Machine Learning. Tuttavia, per impostazione predefinita, dcgm-exporter non è abilitato e non vengono raccolte metriche GPU. È possibile specificare il installDcgmExporter flag per true abilitarlo. Poiché è lo strumento ufficiale di NVIDIA, potrebbe essere già installato nel cluster GPU. In questo caso, è possibile impostare installDcgmExporterfalse su e seguire la procedura per integrare dcgm-exporter nell'estensione Azure Machine Learning. Un'altra cosa da notare è che dcgm-exporter consente all'utente di configurare le metriche da esporre. Per l'estensione Azure Machine Learning, assicurarsi che DCGM_FI_DEV_GPU_UTILDCGM_FI_DEV_FB_FREE le metriche e DCGM_FI_DEV_FB_USED siano esposte.

  1. Assicurarsi di avere installato correttamente l'estensione Aureml e dcgm-exporter. Dcgm-exporter può essere installato dal grafico helm dcgm-exporter o dal grafico helm dell'operatore Gpu

  2. Controllare se è presente un servizio per dcgm-exporter. Se non esiste o non si sa come verificare, eseguire il comando seguente per crearne uno.

    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. Controllare se il servizio nel passaggio precedente è impostato correttamente

    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. Configurare ServiceMonitor per esporre il servizio dcgm-exporter all'estensione Azure Machine Learning. Eseguire il comando seguente e l'applicazione richiede alcuni minuti.

    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
    

Utilità di pianificazione dei vulcani

Se il cluster ha già installato la suite di vulcani, è possibile impostare installVolcano=false, in modo che l'estensione non installi l'utilità di pianificazione del vulcano. L'utilità di pianificazione del vulcano e il controller di vulcano sono necessari per l'invio e la pianificazione dei processi di training.

La configurazione dell'utilità di pianificazione dei vulcani usata dall'estensione Azure Machine Learning è:

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

È necessario usare queste stesse impostazioni di configurazione ed è necessario disabilitare job/validate il webhook nell'ammissione di vulcano se la versione del vulcano è inferiore alla 1.6, in modo che i carichi di lavoro di training di Azure Machine Learning possano funzionare correttamente.

Integrazione dell'utilità di pianificazione dei vulcani che supporta il ridimensionamento automatico del cluster

Come illustrato in questo thread , il plug-in gang non funziona correttamente con il componente di scalabilità automatica del cluster (CA) e anche il ridimensionamento automatico dei nodi nel servizio Azure Kubernetes.

Se si usa il vulcano fornito con l'estensione di Azure Machine Learning tramite l'impostazione installVolcano=true, l'estensione ha una configurazione dell'utilità di pianificazione per impostazione predefinita, che configura il plug-in gang per evitare il deadlock del processo. Di conseguenza, il cluster autoscaler(CA) nel cluster del servizio Azure Kubernetes non sarà supportato con il vulcano installato dall'estensione.

In questo caso, se si preferisce che il componente di scalabilità automatica del cluster del servizio Azure Kubernetes funzioni normalmente, è possibile configurare questo volcanoScheduler.schedulerConfigMap parametro tramite l'estensione di aggiornamento e specificare una configurazione personalizzata di nessun programmatore di vulcano gang , ad esempio:

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

Per usare questa configurazione nel cluster del servizio Azure Kubernetes, è necessario seguire questa procedura:

  1. Creare un file configmap con la configurazione precedente nello spazio dei azureml nomi . Questo spazio dei nomi verrà in genere creato quando si installa l'estensione Azure Machine Learning.
  2. Impostare volcanoScheduler.schedulerConfigMap=<configmap name> nella configurazione dell'estensione per applicare questo configmap. È inoltre necessario ignorare la convalida delle risorse durante l'installazione dell'estensione configurando amloperator.skipResourceValidation=true. Ad esempio:
    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
    

Nota

Poiché il plug-in gang viene rimosso, c'è il potenziale che il deadlock si verifica quando il vulcano pianifica il processo.

  • Per evitare questa situazione, è possibile usare lo stesso tipo di istanza nei processi.

Si noti che è necessario disabilitare job/validate il webhook nell'ammissione di vulcano se la versione del vulcano è inferiore a 1,6.

Controller Nginx in ingresso

L'installazione dell'estensione Azure Machine Learning include una classe controller nginx in ingresso come k8s.io/ingress-nginx per impostazione predefinita. Se nel cluster è già presente un controller nginx in ingresso, è necessario usare una classe controller diversa per evitare errori di installazione.

è possibile procedere in due modi:

  • Modificare la classe controller esistente impostando un valore diverso da k8s.io/ingress-nginx.
  • Creare o aggiornare l'estensione Azure Machine Learning con una classe controller personalizzata diversa da quella dell'utente seguendo gli esempi seguenti.

Ad esempio, per creare l'estensione con una classe controller personalizzata:

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

Per aggiornare l'estensione con una classe controller personalizzata:

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

Il controller di ingresso Nginx installato con l'estensione Azure Machine Learning si arresta in modo anomalo a causa di errori di memoria insufficiente

Sintomo

Il controller di ingresso nginx installato con l'estensione Azure Machine Learning si arresta in modo anomalo a causa di errori di memoria insufficiente (OOM) anche quando non è presente alcun carico di lavoro. I log del controller non mostrano informazioni utili per diagnosticare il problema.

Possibile causa

Questo problema può verificarsi se il controller di ingresso nginx viene eseguito in un nodo con molte CPU. Per impostazione predefinita, il controller di ingresso nginx genera processi di lavoro in base al numero di CPU, che possono utilizzare più risorse e causare errori OOM nei nodi con più CPU. Si tratta di un problema noto segnalato in GitHub

Risoluzione

Per risolvere questo problema, puoi:

  • Modificare il numero di processi di lavoro installando l'estensione con il parametro nginxIngress.controllerConfig.worker-processes=8.
  • Aumentare il limite di memoria usando il parametro nginxIngress.resources.controller.limits.memory=<new limit>.

Assicurarsi di modificare questi due parametri in base alle specifiche del nodo e ai requisiti del carico di lavoro per ottimizzare efficacemente i carichi di lavoro.

Passaggi successivi