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 grafico helm e installata da Helm V3. Tutti i componenti dell'estensione Azure Machine Learning vengono installati nello spazio dei nomi azureml
. È 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. Per 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, effettuare la procedura seguente.
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. Fare riferimento a Distribuire l'estensione Azure Machine Learning per verificare se è presente un'impostazione di configurazione per la disabilitazione della risorsa in conflitto.
Controllo integrità dell'estensione
Se l'installazione non riesce e non restituisce uno dei messaggi di errore indicati in precedenza, è possibile eseguire il processo di controllo integrità predefinito per eseguire una verifica completa dell'estensione. L'estensione Azure Machine Learning contiene un processo HealthCheck
per l’esecuzione di un controllo preliminare dell’idoneità del cluster quando si tenta l’installazione, l’aggiornamento o l’eliminazione dell'estensione. Il processo HealthCheck restituisce come output un report che viene salvato in un mapping di configurazione denominato arcml-healthcheck
nello spazio dei nomi azureml
. 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-rollback
, pre-upgrade
e pre-delete
.
- Se l'installazione dell'estensione non è riuscita, esaminare
pre-install
epre-delete
. - Se l'aggiornamento dell'estensione non è riuscito, esaminare
pre-upgrade
epre-rollback
. - Se l'eliminazione dell'estensione non è riuscita, 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 bilanciamento del carico non è supportato nel cluster in uso. È necessario configurare il bilanciamento del carico nel cluster o considerare l’impostazione di inferenceRouterServiceType su nodePort 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 bilanciamento del carico interno ed è supportato solo il tipo azure . Non impostare internalLoadBalancerProvider se non si dispone di un cluster del servizio Azure Kubernetes. |
E40007 | INVALID_SSL_SETTING | La chiave SSL o il certificato non sono validi. 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 usare il comando seguente per eliminare i componenti azureml-fe legacy. Per altri dettagli, vedere qui. |
Comandi per l’eliminazione dei 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 l’operatore Prometheus, Volcano Scheduler e DCGM Exporter. Se il cluster Kubernetes include già alcuni componenti installati, è possibile leggere le sezioni seguenti per integrare i componenti esistenti con l'estensione Azure Machine Learning.
Operatore Prometheus
Operatore Prometheus è un framework open source che facilita la generazione di un sistema di monitoraggio delle metriche in Kubernetes. L'estensione Azure Machine Learning usa l'operatore Prometheus anche per il monitoraggio dell’utilizzo delle risorse dei processi.
Se il cluster include l'operatore Prometheus installato da un altro servizio, è possibile specificare installPromOp=false
per disabilitare l'operatore Prometheus nell'estensione Azure Machine Learning per evitare conflitti tra i due operatori Prometheus.
In questo caso, l'operatore Prometheus esistente gestisce tutte le istanze di Prometheus. Per accertarsi che Prometheus funzioni correttamente, è necessario prestare attenzione alle operazioni seguenti quando si disabilita l'operatore Prometheus nell'estensione Azure Machine Learning.
- 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, accertarsi che lo spazio dei nomi azureml sia incluso nell'elenco elementi consentiti. Per altre informazioni, vedere i flag dei comandi.
- Controllare se kubelet-service è abilitato nell'operatore Prometheus. Kubelet-service contiene tutti gli endpoint di kubelet. Per altre informazioni, vedere i flag dei comandi. Accertarsi, inoltre, che kubelet-service abbia un'etichetta
k8s-app=kubelet
. - Creare ServiceMonitor per kubelet-service. Usare il comando seguente con le 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
DCGM Exporter
Dcgm-exporter è lo strumento ufficiale consigliato da NVIDIA per la raccolta delle metriche GPU. È stato integrato nell'estensione Azure Machine Learning. Tuttavia, per impostazione predefinita, dcgm-exporter non è abilitato e non vengono raccolte metriche GPU. È possibile specificare il flag installDcgmExporter
in true
per abilitarlo. Poiché è lo strumento ufficiale di NVIDIA, potrebbe essere già installato nel cluster GPU. In questo caso, è possibile impostare installDcgmExporter
su false
ed eseguire la procedura per integrare dcgm-exporter nell'estensione Azure Machine Learning. Un altro elemento da tenere presente è che dcgm-exporter consente all'utente di configurare le metriche da esporre. Per l'estensione Azure Machine Learning, accertarsi che le metriche DCGM_FI_DEV_GPU_UTIL
, DCGM_FI_DEV_FB_FREE
e DCGM_FI_DEV_FB_USED
siano esposte.
Accertarsi di avere installato correttamente l'estensione Aureml e dcgm-exporter. Dcgm-exporter può essere installato dal grafico helm dcgm-exporter o dal grafico helm Gpu-operator
Controllare se esiste un servizio per dcgm-exporter. Se non esiste o non si sa come controllare, usare 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
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
Configurare ServiceMonitor per esporre il servizio dcgm-exporter all'estensione Azure Machine Learning. Usare il comando seguente; 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
Volcano Scheduler
Se nel cluster è già installata la suite Volcano, è possibile impostare installVolcano=false
in modo che l'estensione non installi Volcano Scheduler. Volcano Scheduler e Volcano Controller sono necessari per l'invio e la pianificazione dei processi di training.
La configurazione di Volcano Scheduler usata dall'estensione Azure Machine Learning è la seguente:
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 e disabilitare il webhook job/validate
in Volcano Admission se la versione di Volcano è inferiore a 1.6, in modo da poter eseguire correttamente i carichi di lavoro di training di Azure Machine Learning.
Integrazione di Volcano Scheduler con supporto scalabilità automatica del cluster
Come descritto in questo thread, il plug-in gang non funziona correttamente con la scalabilità automatica del cluster (CA) e neppure con la scalabilità automatica dei nodi nel servizio Azure Kubernetes.
Se si usa Volcano fornito con l'estensione Azure Machine Learning tramite l'impostazione installVolcano=true
, l'estensione include per impostazione predefinita una configurazione dell'utilità di pianificazione che configura il plug-in gang per evitare il deadlock dei processi. Di conseguenza, la scalabilità automatica dei cluster (CA) nel cluster del servizio Azure Kubernetes non sarà supportata con Volcano installato dall'estensione.
In questo caso, se si preferisce che la scalabilità automatica del cluster del servizio Azure Kubernetes funzioni normalmente, è possibile configurare questo parametro volcanoScheduler.schedulerConfigMap
tramite l'estensione di aggiornamento e specificare una configurazione personalizzata senza gang di Volcano Scheduler, ad esempio:
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
Per usare questa configurazione nel cluster del servizio Azure Kubernetes, è necessario effettuare la procedura seguente:
- Creare un file configmap con la configurazione suindicata nello spazio dei nomi
azureml
. Questo spazio dei nomi generalmente verrà creato quando si installa l'estensione Azure Machine Learning. - Impostare
volcanoScheduler.schedulerConfigMap=<configmap name>
nella configurazione dell'estensione per applicare questo mapping di configurazione. È necessario, inoltre, ignorare la convalida delle risorse quando l'estensione viene installata configurandoamloperator.skipResourceValidation=true
. Ad esempio: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>
Nota
Poiché il plug-in gang viene rimosso, potrebbe verificarsi il deadlock quando Volcano pianifica il processo.
- Per evitare questa situazione, è possibile usare lo stesso tipo di istanza nei processi.
L'uso di una configurazione dell'utilità di pianificazione diversa dall'impostazione predefinita fornita dall'estensione di Azure Machine Learning potrebbe non essere completamente supportata. Procedere con cautela.
Tenere presente che è necessario disabilitare il webhook job/validate
in Volcano Admission se la versione di Volcano è inferiore a 1.6.
Ingress Nginx Controller
L'installazione dell'estensione Azure Machine Learning include una classe Ingress Nginx Controller k8s.io/ingress-nginx
per impostazione predefinita. Se il cluster già include un’istanza di Ingress Nginx Controller, è 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 dalla propria, attenendosi agli 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"
Nginx Ingress Controller installato con l'estensione Azure Machine Learning si arresta in modo anomalo a causa di errori di memoria insufficiente (OOM)
Sintomo
Nginx Ingress Controller installato con l'estensione Azure Machine Learning si arresta in modo anomalo a causa di errori di memoria insufficiente (OOM) I log del controller non mostrano informazioni utili per diagnosticare il problema.
Causa possibile
Questo problema può verificarsi se Nginx Ingress Controller viene eseguito in un nodo con numerose CPU. Per impostazione predefinita, Nginx Ingress Controller genera processi di lavoro in base al numero di CPU che possono usare più risorse e causare errori di memoria insufficiente (OOM) nei nodi con più CPU. Si tratta di un problema noto segnalato su 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>
.
Accertarsi 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.