Поделиться через


Устранение неполадок с расширением Машинного обучения Azure

Из этой статьи вы узнаете, как устранять распространенные проблемы, с которыми вы можете столкнуться с развертыванием расширения Машинное обучение Azure в AKS или Kubernetes с поддержкой Arc.

Как установить расширение Машинного обучения Azure

Машинное обучение Azure расширение выпускается в виде диаграммы helm и устанавливается Helm V3. Все компоненты расширения Машинное обучение Azure устанавливаются в azureml пространстве имен. Для проверка состояния расширения можно использовать следующие команды.

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

Устранение ошибки развертывания расширения Машинного обучения Azure

Ошибка: невозможно повторно использовать имя, которое все еще используется

Эта ошибка означает, что указанное вами расширение уже существует. Если это имя используется расширением машинного обучения Azure, вам нужно подождать около часа и повторить попытку. Если имя используется другими диаграммами Helm, необходимо использовать другое имя. Выполните список helm list -Aa всех диаграмм helm в кластере.

Ошибка: предыдущая операция для диаграммы Helm еще выполняется

Вам нужно подождать около часа и повторить попытку после завершения неизвестной операции.

Ошибка: не удается создать новое содержимое в пространстве имен azureml, так как работа этого пространства имен завершается

Эта ошибка возникает, когда операция удаления не завершена и запускается другая операция установки. Вы можете запустить команду az k8s-extension show , чтобы проверить статус подготовки расширения и убедиться, что расширение было удалено, прежде чем предпринимать другие действия.

Ошибка: не удалось выполнить скачивание, так как путь к диаграмме не найден

Эта ошибка возникает, когда вы указываете неправильную версию расширения. Необходимо убедиться, что указанная версия существует. Если вы хотите использовать последнюю версию, вам не нужно указывать --version .

Ошибка: не удается импортировать данные в текущий выпуск: недопустимые метаданные владения

Эта ошибка означает, что существует конфликт между существующими ресурсами кластера и расширением машинного обучения Azure. Полное сообщение об ошибке может выглядеть следующим образом:

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"

Чтобы устранить проблему, выполните следующие действия.

  • Проверьте, кому принадлежат проблемные ресурсы и можно ли удалить или изменить ресурс.

  • Если ресурс используется только расширением машинного обучения Azure и может быть удален, вы можете вручную добавить метки, чтобы устранить проблему. Взяв в качестве примера предыдущее сообщение об ошибке, вы можете запускать команды следующим образом,

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

    Установка меток и аннотаций для ресурса означает, что helm управляет ресурсом, который принадлежит расширению машинного обучения Azure.

  • Когда ресурс также используется другими компонентами в вашем кластере и не может быть изменен. Ознакомьтесь с развертыванием расширения Машинное обучение Azure, чтобы узнать, есть ли параметр конфигурации для отключения ресурса конфликта.

Проверка работоспособности расширения

Когда установка завершилась сбоем и не попала ни в одно из указанных выше сообщений об ошибках, можно использовать встроенное задание работоспособности проверка для создания комплексной проверка в расширении. Расширение машинного обучения Azure содержит HealthCheck задание для предварительного проверка готовности кластера при попытке установить, обновить или удалить расширение. Задание HealthCheck выводит отчет, сохраненный в файле конфигурации с именем arcml-healthcheck в azureml пространстве имен. Коды ошибок и возможные решения отчета перечислены в коде ошибки HealthCheck.

Выполните следующую команду, чтобы получить отчет HealthCheck,

kubectl describe configmap -n azureml arcml-healthcheck

Проверка работоспособности активируется при установке, обновлении или удалении расширения. Отчет о работоспособности проверка структурирован с несколькими частями pre-installи pre-rollbackpre-upgrade pre-delete.

  • Если расширение установлено сбоем, необходимо просмотреть pre-install и pre-delete.
  • Если расширение обновлено сбоем, следует изучить pre-upgrade и pre-rollback.
  • Если расширение удалено сбоем, необходимо просмотреть pre-deleteего.

При запросе поддержки рекомендуется выполнить следующую команду и отправить нам файл healthcheck.logs, так как это облегчит нам поиск проблемы.

kubectl logs healthcheck -n azureml

Код ошибки HealthCheck

В этой таблице показано, как устранить коды ошибок, возвращаемые отчетом HealthCheck.

Код ошибки Сообщение об ошибке Description
E40001 LOAD_BALANCER_NOT_SUPPORT Подсистема балансировки нагрузки не поддерживается в кластере. Необходимо настроить подсистему балансировки нагрузки в кластере или рассмотреть ее nodePort clusterIP.inferenceRouterServiceType
E40002 INSUFFICIENT_NODE Вы включили inferenceRouterHA , для которых требуется по крайней мере три узла в кластере. Отключите высокий уровень доступности, если у вас меньше трех узлов.
E40003 INTERNAL_LOAD_BALANCER_NOT_SUPPORT В настоящее время только AKS поддерживает внутреннюю подсистему балансировки нагрузки, и мы поддерживаем azure только тип. Не устанавливайте, internalLoadBalancerProvider если у вас нет кластера AKS.
E40007 INVALID_SSL_SETTING Недопустимый SSL-ключ или сертификат. CNAME должен быть совместим с сертификатом.
E45002 PROMETHEUS_CONFLICT Установленный оператор Prometheus конфликтует с существующим оператором Prometheus. Дополнительные сведения см. в разделе "Оператор Prometheus"
E45003 BAD_NETWORK_CONNECTIVITY Необходимо соответствовать требованиям к сети.
E45004 AZUREML_FE_ROLE_CONFLICT Машинное обучение Azure расширение не поддерживается в устаревшей версии AKS. Чтобы установить расширение Машинное обучение Azure, необходимо удалить устаревшие компоненты azureml-fe.
E45005 AZUREML_FE_DEPLOYMENT_CONFLICT Машинное обучение Azure расширение не поддерживается в устаревшей версии AKS. Чтобы установить расширение Машинное обучение Azure, необходимо выполнить следующую команду, чтобы удалить устаревшие компоненты azureml-fe, дополнительные сведения см. здесь.

Команды для удаления устаревших компонентов azureml-fe в кластере 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

Интеграция компонентов с открытым кодом

Машинное обучение Azure расширение использует некоторые компоненты открытый код, включая оператор Prometheus, планировщик вулканов и экспортер DCGM. Если кластер Kubernetes уже установлен, вы можете прочитать следующие разделы, чтобы интегрировать существующие компоненты с расширением Машинное обучение Azure.

Оператор Prometheus

Оператор Prometheus — это платформа открытый код для создания системы мониторинга метрик в Kubernetes. Машинное обучение Azure расширение также использует оператор Prometheus для мониторинга использования ресурсов заданий.

Если кластер имеет оператор Prometheus, установленный другой службой, можно указатьinstallPromOp=false, чтобы отключить оператор Prometheus в расширении Машинное обучение Azure, чтобы избежать конфликта между двумя операторами Prometheus. В этом случае существующий оператор prometheus управляет всеми экземплярами Prometheus. Чтобы убедиться, что Prometheus работает правильно, при отключении оператора prometheus в расширении Машинное обучение Azure необходимо обратить внимание на следующие действия.

  1. Проверьте, управляется ли prometheus в пространстве имен Azureml оператором Prometheus. В некоторых сценариях оператор prometheus настроен только для отслеживания определенных пространств имен. В этом случае убедитесь, что пространство имен Azureml находится в списке разрешений. Дополнительные сведения см. в разделе флагов команд.
  2. Проверьте, включен ли kubelet-service в операторе prometheus. Kubelet-service содержит все конечные точки kubelet. Дополнительные сведения см. в разделе флагов команд. Кроме того, необходимо убедиться, что kubelet-service имеет меткуk8s-app=kubelet.
  3. Создайте ServiceMonitor для kubelet-service. Выполните следующую команду с переменными, замененными:
    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

Dcgm-exporter — это официальное средство, рекомендуемое NVIDIA для сбора метрик GPU. Мы интегрировали его в расширение Машинное обучение Azure. Но, по умолчанию, dcgm-exporter не включен, и метрики GPU не собираются. Вы можете указать installDcgmExporter флаг, чтобы true включить его. Так как это официальное средство NVIDIA, возможно, вы уже установили его в кластере GPU. Если это так, вы можете настроить installDcgmExporter false и выполнить шаги по интеграции вашего dcgm-экспортера в расширение Машинное обучение Azure. Кроме того, следует отметить, что dcgm-exporter позволяет пользователю настраивать метрики для предоставления. Для расширения Машинное обучение Azure убедитесь, что DCGM_FI_DEV_GPU_UTILDCGM_FI_DEV_FB_FREE предоставляются метрики и DCGM_FI_DEV_FB_USED метрики.

  1. Убедитесь, что вы успешно установили расширение Aureml и dcgm-exporter. Dcgm-exporter можно установить с помощью диаграммы dcgm-exporter helm или диаграммы helm оператора Gpu

  2. Проверьте, есть ли служба для dcgm-exporter. Если он не существует или вы не знаете, как проверка, выполните следующую команду, чтобы создать ее.

    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. Проверьте правильность установки службы на предыдущем шаге

    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. Настройте ServiceMonitor для предоставления службы dcgm-exporter для Машинное обучение Azure расширения. Выполните следующую команду, и она вступает в силу через несколько минут.

    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
    

Планировщик вулканов

Если в кластере уже установлен набор вулканов, можно установить installVolcano=false, поэтому расширение не установит планировщик вулканов. Планировщик вулканов и контроллер вулканов требуются для отправки и планирования заданий обучения.

Конфигурация планировщика вулканов, используемая расширением Машинное обучение Azure:

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

Вам нужно использовать эти же параметры конфигурации, и вам нужно отключить job/validate веб-перехватчик в приеме вулкана, если версия вулкана ниже 1,6, чтобы Машинное обучение Azure учебные рабочие нагрузки могут выполняться правильно.

Интеграция планировщика вулканов, поддерживающая автомасштабирование кластера

Как описано в этом потоке , подключаемый модуль банды не работает хорошо с автомасштабированием кластера (ЦС), а также автомасштабированием узлов в AKS.

Если вы используете вулкан, который поставляется с расширением Машинное обучение Azure с помощью параметраinstallVolcano=true, расширение имеет конфигурацию планировщика по умолчанию, которая настраивает подключаемый модуль банды для предотвращения взаимоблокировки заданий. Поэтому автомасштабирование кластера в кластере AKS не поддерживается с вулканом, установленным расширением.

В этом случае, если вы предпочитаете автомасштабирование кластера AKS, можно настроить этот volcanoScheduler.schedulerConfigMap параметр с помощью обновления расширения и указать настраиваемую конфигурацию без планировщика вулканов банды, например:

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

Чтобы использовать эту конфигурацию в кластере AKS, выполните следующие действия:

  1. Создайте файл конфигурации с приведенной azureml выше конфигурацией в пространстве имен. Это пространство имен обычно создается при установке расширения Машинное обучение Azure.
  2. Задайте volcanoScheduler.schedulerConfigMap=<configmap name> в конфигурации расширения, чтобы применить эту карту конфигурации. При установке расширения необходимо пропустить проверку ресурсов, настроив amloperator.skipResourceValidation=trueего. Пример:
    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
    

Примечание.

Так как подключаемый модуль банды удален, существует вероятность того, что взаимоблокировка происходит, когда вулкан планирует задание.

  • Чтобы избежать этой ситуации, можно использовать один и тот же тип экземпляра в заданиях.

Обратите внимание, что необходимо отключить job/validate веб-перехватчик в приеме вулкана, если версия вулкана ниже 1,6.

Контроллер Ingress Nginx

Установка расширения Машинное обучение Azure поставляется с классом контроллера ingress nginx, как k8s.io/ingress-nginx по умолчанию. Если у вас уже есть контроллер ingress nginx в кластере, необходимо использовать другой класс контроллера, чтобы избежать сбоя установки.

В этом случае у вас есть два варианта.

  • Измените существующий класс контроллера на что-то другое.k8s.io/ingress-nginx
  • Создайте или обновите расширение Машинное обучение Azure с помощью пользовательского класса контроллера, который отличается от вашего, выполнив следующие примеры.

Например, чтобы создать расширение с пользовательским классом контроллера:

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

Чтобы обновить расширение с помощью пользовательского класса контроллера, выполните следующие действия.

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

Контроллер входящего трафика Nginx, установленный с расширением Машинное обучение Azure завершается сбоем из-за ошибок без памяти (OOM)

Симптом

Контроллер входящего трафика nginx, установленный с расширением Машинное обучение Azure, завершается сбоем из-за ошибок вне памяти (OOM), даже если рабочая нагрузка отсутствует. Журналы контроллера не отображают полезные сведения для диагностики проблемы.

Возможная причина

Эта проблема может возникнуть, если контроллер ingress nginx работает на узле с большим количеством ЦП. По умолчанию контроллер ingress nginx создает рабочие процессы в соответствии с количеством ЦП, что может потреблять больше ресурсов и вызывать ошибки OOM на узлах с большим количеством ЦП. Это известная проблема , сообщаемая на GitHub

Решение

Чтобы решить эту проблему, вы можете:

  • Настройте количество рабочих процессов, установив расширение с параметром nginxIngress.controllerConfig.worker-processes=8.
  • Увеличьте ограничение памяти с помощью параметра nginxIngress.resources.controller.limits.memory=<new limit>.

Настройте эти два параметра в соответствии с конкретными спецификациями узлов и требованиями к рабочей нагрузке для эффективной оптимизации рабочих нагрузок.

Следующие шаги