Устранение неполадок с расширением Машинного обучения 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-rollback
pre-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 необходимо обратить внимание на следующие действия.
- Проверьте, управляется ли prometheus в пространстве имен Azureml оператором Prometheus. В некоторых сценариях оператор prometheus настроен только для отслеживания определенных пространств имен. В этом случае убедитесь, что пространство имен Azureml находится в списке разрешений. Дополнительные сведения см. в разделе флагов команд.
- Проверьте, включен ли kubelet-service в операторе prometheus. Kubelet-service содержит все конечные точки kubelet. Дополнительные сведения см. в разделе флагов команд. Кроме того, необходимо убедиться, что kubelet-service имеет метку
k8s-app=kubelet
. - Создайте 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_UTIL
DCGM_FI_DEV_FB_FREE
предоставляются метрики и DCGM_FI_DEV_FB_USED
метрики.
Убедитесь, что вы успешно установили расширение Aureml и dcgm-exporter. Dcgm-exporter можно установить с помощью диаграммы dcgm-exporter helm или диаграммы helm оператора Gpu
Проверьте, есть ли служба для 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
Проверьте правильность установки службы на предыдущем шаге
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
Настройте 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: drf
- name: predicates
- name: proportion
- name: nodeorder
- name: binpack
Чтобы использовать эту конфигурацию в кластере AKS, выполните следующие действия:
- Создайте файл конфигурации с приведенной
azureml
выше конфигурацией в пространстве имен. Это пространство имен обычно создается при установке расширения Машинное обучение Azure. - Задайте
volcanoScheduler.schedulerConfigMap=<configmap name>
в конфигурации расширения, чтобы применить эту карту конфигурации. При установке расширения необходимо пропустить проверку ресурсов, настроивamloperator.skipResourceValidation=true
его. Пример: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>
Примечание.
Так как подключаемый модуль банды удален, существует вероятность того, что взаимоблокировка происходит, когда вулкан планирует задание.
- Чтобы избежать этой ситуации, можно использовать один и тот же тип экземпляра в заданиях.
Использование конфигурации планировщика, отличной от используемой по умолчанию расширением Машинное обучение Azure, может быть не полностью поддерживается. Выполняйте дальнейшие действия с осторожностью.
Обратите внимание, что необходимо отключить 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>
.
Настройте эти два параметра в соответствии с конкретными спецификациями узлов и требованиями к рабочей нагрузке для эффективной оптимизации рабочих нагрузок.