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-rollback
pre-upgrade
en pre-delete
.
- Als de extensie is geïnstalleerd, moet u kijken naar
pre-install
enpre-delete
. - Als de extensie is bijgewerkt, moet u kijken naar
pre-upgrade
enpre-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.
- 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.
- 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 label
k8s-app=kubelet
heeft. - 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_UTIL
DCGM_FI_DEV_FB_FREE
DCGM_FI_DEV_FB_USED
er metrische gegevens beschikbaar zijn.
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
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
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
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:
- Maak een configuratiemapbestand met de bovenstaande configuratie in de
azureml
naamruimte. Deze naamruimte wordt doorgaans gemaakt wanneer u de Azure Machine Learning-extensie installeert. - 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 teamloperator.skipResourceValidation=true
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 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=8
te 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.