Share via


Solución de problemas de la extensión de Azure Machine Learning

En este artículo, aprenderá a solucionar problemas comunes que puede encontrar con la implementación de la extensión de Azure Machine Learning en Kubernetes habilitado para AKS o Arc.

¿Cómo está instalada la extensión de Azure Machine Learning?

La extensión de Azure Machine Learning se publica como un gráfico de Helm y lo instala Helm V3. Todos los componentes de la extensión de Azure Machine Learning se instalan en el espacio de nombres azureml. Puede usar los comandos siguientes para comprobar el estado de la extensión.

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

Solución de problemas de implementación de la extensión de Azure Machine Learning

Error: No se puede volver a usar un nombre que todavía está en uso

Este error significa que el nombre de extensión que especificó ya existe. Si la extensión Azure Machine Learning usa el nombre, debe esperar aproximadamente una hora e intentarlo de nuevo. Si otros gráficos de Helm usan el nombre, debe elegir otro nombre. Ejecute helm list -Aa para enumerar todos los gráficos de Helm del clúster.

Error: la operación anterior para el gráfico de Helm todavía está en curso

Debe esperar aproximadamente una hora e intentarlo de nuevo después de que se complete la operación desconocida.

Error: No se puede crear nuevo contenido en el espacio de nombres AzureML porque se está finalizando

Este error sucede cuando una operación de desinstalación no finaliza y se desencadena otra operación de instalación. Puede ejecutar el comando az k8s-extension show para comprobar el estado de aprovisionamiento de la extensión y asegurarse de que la extensión se ha desinstalado antes de realizar otras acciones.

Error: error de descarga la ruta de acceso del gráfico no se ha encontrado

Este error sucede cuando se especifica una versión de extensión incorrecta. Debe asegurarse de que la versión especificada existe. Si desea usar la versión más reciente, no es necesario especificar --version.

Error: No se puede importar en la versión actual: metadatos de propiedad no válidos

Este error significa que hay un conflicto entre los recursos de clúster existentes y la extensión de Azure Machine Learning. Un mensaje de error completo podría ser similar al texto siguiente:

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"

Siga estos pasos para mitigar el problema.

  • Compruebe quién posee los recursos problemáticos y si el recurso se puede eliminar o modificar.

  • Si solo la extensión de Azure Machine Learning usa el recurso y se puede eliminar, puede agregar manualmente etiquetas para mitigar el problema. Tomando el mensaje de error anterior como ejemplo, puede ejecutar comandos como se indica a continuación,

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

    Al establecer las etiquetas y anotaciones en el recurso, significa que el recurso se administra mediante Helm y es propiedad de la extensión de Azure Machine Learning.

  • Cuando otros componentes del clúster también usan el recurso y no se pueden modificar. Consulte implementación de la extensión de Azure Machine Learning para ver si hay una configuración para deshabilitar el recurso de conflicto.

HealthCheck de extensión

Si se produce un error en la instalación y no se ejecuta ninguno de los mensajes de error anteriores, puede usar el trabajo de comprobación de estado integrado para realizar una comprobación completa de la extensión. La extensión de aprendizaje automático de Azure contiene un trabajo HealthCheck para comprobar previamente la preparación del clúster al intentar instalar, actualizar o eliminar la extensión. El trabajo HealthCheck genera un informe, que se guarda en un mapa de configuración denominado arcml-healthcheck en el espacio de nombres azureml. Los códigos de error y las posibles soluciones para el informe se enumeran en Código de error de HealthCheck.

Ejecute este comando para obtener el informe de HealthCheck,

kubectl describe configmap -n azureml arcml-healthcheck

La comprobación de estado se desencadena cada vez que instale, actualice o elimine la extensión. El informe de comprobación de estado se estructura con varias partes pre-install, pre-rollback, pre-upgrade y pre-delete.

  • Si la instalación de la extensión no se ha realizado con éxito, debe examinar pre-install y pre-delete.
  • Si la actualización de la extensión no se ha realizado con éxito, debe examinar pre-upgrade y pre-rollback.
  • Si la eliminación de la extensión no se ha realizado con éxito, debe examinar pre-delete.

Cuando solicite soporte técnico, le recomendamos que ejecute el siguiente comando y nos envíe el archivo healthcheck.logs, ya que puede facilitarnos la localización del problema.

kubectl logs healthcheck -n azureml

Código de error de HealthCheck

En esta tabla se muestra cómo solucionar los códigos de error devueltos por el informe de HealthCheck.

Código de error Mensaje de error Descripción
E40001 LOAD_BALANCER_NOT_SUPPORT El clúster no admite el equilibrar la carga. Debe configurar el equilibrador de carga en el clúster o considerar la posibilidad de establecer inferenceRouterServiceType en nodePort o clusterIP.
E40002 INSUFFICIENT_NODE Ha habilitado inferenceRouterHA, que requiere al menos tres nodos en el clúster. Deshabilite la alta disponibilidad si tiene menos de tres nodos.
E40003 INTERNAL_LOAD_BALANCER_NOT_SUPPORT Actualmente, solo AKS admite el equilibrador de carga interno y solo se admite el tipo azure. No establezca internalLoadBalancerProvider si no tiene un clúster de AKS.
E40007 INVALID_SSL_SETTING La clave SSL o el certificado no son válidos. El CNAME debe ser compatible con el certificado.
E45002 PROMETHEUS_CONFLICT El operador Prometheus instalado está en conflicto con el operador Prometheus existente. Para obtener más información, consulte Operador Prometheus
E45003 BAD_NETWORK_CONNECTIVITY Debe cumplir los requisitos de red.
E45004 AZUREML_FE_ROLE_CONFLICT La extensión de Azure Machine Learning no se admite en AKS heredado. Para instalar la extensión de Azure Machine Learning, debe eliminar los componentes de azureml-fe heredados.
E45005 AZUREML_FE_DEPLOYMENT_CONFLICT La extensión de Azure Machine Learning no se admite en AKS heredado. Para instalar la extensión de Azure Machine Learning, debe ejecutar el comando situado debajo de este formulario para eliminar los componentes heredados de azureml-fe. Puede consultar más detalles aquí.

Comandos para eliminar los componentes heredados de azureml-fe del clúster de AKS:

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

Integración de componentes de código abierto

La extensión de Azure Machine Learning usa algunos componentes de código abierto, incluidos el operador Prometheus, Volcano Scheduler y el exportador DCGM. Si el clúster de Kubernetes ya tiene instalados algunos de ellos, puede leer las secciones siguientes para integrar los componentes existentes con la extensión de Azure Machine Learning.

Prometheus Operator

El operador Prometheus es un marco de código abierto para ayudar a crear un sistema de supervisión de métricas en Kubernetes. La extensión de Azure Machine Learning también usa el operador Prometheus para ayudar a supervisar el uso de recursos de los trabajos.

Si otro servicio ha instalado el operador Prometheus en el clúster, puede especificar installPromOp=false para que deshabilite el operador Prometheus en la extensión de Azure Machine Learning y así evitar un conflicto entre dos operadores de Prometheus. En este caso, el operador Prometheus existente administra todas las instancias de Prometheus. Para asegurarse de que Prometheus funciona correctamente, es necesario prestar atención a lo siguiente al deshabilitar el operador en la extensión Azure Machine Learning.

  1. Compruebe si Prometheus en el espacio de nombres AzureML está administrado por el operador Prometheus. En algunos escenarios, el operador Prometheus se establece para supervisar solo algunos espacios de nombres específicos. Si es así, asegúrese de que el espacio de nombres AzureML está en la lista de permitidos. Para más información, consulte las marcas de comando.
  2. Compruebe si kubelet-service está habilitado en el operador Prometheus. Kubelet-service contiene todos los puntos de conexión de kubelet. Para más información, consulte las marcas de comando. Además, debe asegurarse de que kubelet-service tiene una etiqueta k8s-app=kubelet.
  3. Cree ServiceMonitor para kubelet-service. Ejecute el siguiente comando con variables reemplazadas:
    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
    

Exportador DCGM

Dcgm-exporter es la herramienta oficial recomendada por NVIDIA para recopilar métricas de GPU. Lo hemos integrado en la extensión de Azure Machine Learning. Pero, de forma predeterminada, dcgm-exporter no está habilitado y no se recopilan métricas de GPU. Puede especificar la marca installDcgmExporter en true para habilitarla. Como es la herramienta oficial de NVIDIA, es posible que ya esté instalado en el clúster de GPU. Si es así, puede establecer installDcgmExporter en false y seguir los pasos para integrar dcgm-exporter en la extensión Azure Machine Learning. Otra cosa que hay que tener en cuenta es que dcgm-exporter permite al usuario configurar qué métricas exponer. Para la extensión Azure Machine Learning, asegúrese de que las métricas DCGM_FI_DEV_GPU_UTIL, DCGM_FI_DEV_FB_FREE y DCGM_FI_DEV_FB_USED estén expuestas.

  1. Asegúrese de que tiene la extensión AzureML y dcgm-exporter instaladas correctamente. Dcgm-exporter se puede instalar mediante un gráfico de helm de Dcgm-exporter o un gráfico de helm del operador GPU

  2. Compruebe si hay un servicio para dcgm-exporter. Si no existe o no sabe cómo comprobarlo, ejecute el comando siguiente para crear 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. Compruebe si el servicio del paso anterior está configurado correctamente

    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. Configure ServiceMonitor para exponer el servicio dcgm-exporter a la extensión Azure Machine Learning. Ejecute el siguiente comando y tendrá efecto en unos minutos.

    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

Si el clúster ya tiene instalado el conjunto de Volcano, puede establecer installVolcano=false, por lo que la extensión no instalará el programador de Volcano. El programador y el controlador de Volcano son necesarios para el envío y la programación del trabajo de entrenamiento.

La configuración del programador de Volcano que usa la extensión de Azure Machine Learning es la siguiente:

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

Debe usar esta misma configuración que y tiene que deshabilitar el webhook job/validate en la admisión de Volcano (si la versión de Volcano es anterior a la 1.6) para que las cargas de trabajo de entrenamiento de Azure Machine Learning puedan funcionar correctamente.

Integración del programador de Volcano que admite el escalador automático de clústeres

Como se explica en esta conversación, el complemento gang no funciona bien con el escalador automático de clústeres ni con el escalador automático de nodos de AKS.

Si usa Volcano, que viene incluido con la extensión de Azure Machine Learning mediante configuración de installVolcano=true, la extensión tiene de forma predeterminada una configuración del programador que configura el complemento gang para evitar el interbloqueo del trabajo. Por lo tanto, el escalador automático de clústeres del clúster de AKS no será compatible con la herramienta Volcano instalada por extensión.

En este caso, si prefiere que el escalador automático de clústeres de AKS funcione normalmente, puede configurar este parámetro volcanoScheduler.schedulerConfigMap mediante la actualización de la extensión y la especificación de una configuración personalizada de ningún programador gang de Volcano, por ejemplo:

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

Para usar esta configuración en el clúster de AKS, debe seguir los siguientes pasos:

  1. Cree un archivo configmap con la configuración anterior en el espacio de nombres azureml. Este espacio de nombres se creará normalmente al instalar la extensión de Azure Machine Learning.
  2. Establezca volcanoScheduler.schedulerConfigMap=<configmap name> en la configuración de extensión para aplicar este archivo configmap. Y debe omitir la validación de recursos al instalar la extensión mediante la configuración de amloperator.skipResourceValidation=true. Por ejemplo:
    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:

Dado que se eliminará el complemento gang, existe la posibilidad de que se produzca un interbloqueo cuando Volcano programe el trabajo.

  • Para evitar esta situación, puede usar el mismo tipo de instancia en los trabajos.

Tenga en cuenta que debe deshabilitar el webhook job/validate en la admisión de Volcano si la versión de este es anterior a 1.6.

Controlador Nginx de entrada

La instalación de la extensión de Azure Machine Learning incluye una clase de controlador nginx de entrada como k8s.io/ingress-nginx de forma predeterminada. Si ya tiene un controlador nginx de entrada en el clúster, debe usar una clase de controlador diferente para evitar errores de instalación.

Tiene dos opciones:

  • Cambie la clase de controlador existente a algo distinto de k8s.io/ingress-nginx.
  • Cree o actualice nuestra extensión de Azure Machine Learning con una clase de controlador personalizada diferente de la suya siguiendo los ejemplos siguientes.

Por ejemplo, para crear la extensión con una clase de controlador personalizada:

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

Para actualizar la extensión con una clase de controlador personalizada:

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

El controlador de entrada nginx instalado con la extensión de Azure Machine Learning se bloquea debido a errores de memoria insuficiente (OOM)

Síntoma

El controlador de entrada nginx instalado con la extensión de Azure Machine Learning se bloquea debido a errores de memoria insuficiente (OOM), incluso cuando no hay ninguna carga de trabajo. Los registros del controlador no muestran ninguna información útil para diagnosticar el problema.

Causa posible

Este problema puede producirse si el controlador de entrada nginx se ejecuta en un nodo con muchas CPU. De forma predeterminada, el controlador de entrada nginx genera procesos de trabajo según el número de CPU, lo que puede consumir más recursos y provocar errores de OOM en nodos con más CPU. Este es un problema conocido notificado en GitHub.

Resolución

Para solucionar este problema, puede:

  • Ajuste el número de procesos de trabajo mediante la instalación de la extensión con el parámetro nginxIngress.controllerConfig.worker-processes=8.
  • Aumente el límite de memoria mediante el parámetro nginxIngress.resources.controller.limits.memory=<new limit>.

Asegúrese de ajustar estos dos parámetros según las especificaciones propias del nodo y los requisitos de carga de trabajo para optimizar las cargas de trabajo de forma eficaz.

Pasos siguientes