다음을 통해 공유


Azure Machine Learning 확장 문제 해결

이 문서에서는 AKS 또는 Arc 지원 Kubernetes에서 Azure Machine Learning 확장 배포로 발생할 수 있는 일반적인 문제를 해결하는 방법을 알아봅니다.

Azure Machine Learning 익스텐션은 어떻게 설치되나요?

Azure Machine Learning 확장은 Helm 차트로 릴리스되고 Helm V3에 의해 설치됩니다. Azure Machine Learning 확장의 모든 구성 요소는 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 Machine Learning 익스텐션 배포 오류 문제 해결

오류: 아직 사용 중인 이름은 재사용할 수 없음

이 오류는 지정한 확장 이름이 이미 있음을 의미합니다. 이름이 Azure Machine Learning 확장에서 사용되는 경우 약 1시간 동안 기다린 후 다시 시도해야 합니다. 다른 Helm 차트에서 이름을 사용하는 경우 다른 이름을 사용해야 합니다. helm list -Aa를 실행하여 클러스터의 모든 helm 차트를 나열합니다.

오류: helm 차트에 대한 이전 작업이 아직 진행 중임

알 수 없는 작업이 완료된 후 약 1시간 동안 기다렸다가 다시 시도해야 합니다.

오류: 종료 중이므로 네임스페이스 azureml에서 새 콘텐츠를 만들 수 없음

이 오류는 제거 작업이 완료되지 않고 다른 설치 작업이 트리거될 때 발생합니다. az k8s-extension show 명령을 실행하여 확장의 프로비전 상태를 확인하고 다른 작업을 수행하기 전에 확장이 제거되었는지 확인할 수 있습니다.

오류: 다운로드 실패, 차트 경로를 찾을 수 없음

이 오류는 잘못된 확장 버전을 지정할 때 발생합니다. 지정된 버전이 있는지 확인해야 합니다. 최신 버전을 사용하려면 --version을 지정할 필요가 없습니다.

오류: 현재 릴리스로 가져올 수 없음: 잘못된 소유권 메타데이터

이 오류는 기존 클러스터 리소스와 Azure Machine Learning 확장 간에 충돌이 있음을 의미합니다. 전체 오류 메시지는 다음 텍스트와 같을 수 있습니다.

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 Machine Learning 확장에서만 사용되고 삭제할 수 있는 경우 수동으로 레이블을 추가하여 문제를 완화할 수 있습니다. 이전 오류 메시지를 예로 들어 다음과 같이 명령을 실행할 수 있습니다.

    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 Machine Learning 확장이 소유한 리소스를 관리하고 있음을 의미합니다.

  • 리소스가 클러스터의 다른 구성 요소에서도 사용되고 수정될 수 없는 경우입니다. 충돌 리소스를 사용하지 않도록 설정하는 구성 설정이 있는지 확인하려면 Azure Machine Learning 확장 배포를 참조하세요.

익스텐션의 HealthCheck

설치에 실패하고 위의 오류 메시지가 표시되지 않은 경우 기본 제공 상태 검사 작업을 사용하여 확장에 대한 포괄적인 검사를 수행할 수 있습니다. Azure Machine Learning 확장에는 확장을 설치, 업데이트 또는 삭제하려고 할 때 클러스터 준비 상태를 미리 확인하는 HealthCheck 작업이 포함되어 있습니다. HealthCheck 작업은 azureml 네임스페이스의 arcml-healthcheck라는 configmap에 저장되는 보고서를 출력합니다. 보고서에 대한 오류 코드 및 가능한 솔루션은 HealthCheck 오류 코드에 나열되어 있습니다.

이 명령을 실행하여 HealthCheck 보고서를 가져옵니다.

kubectl describe configmap -n azureml arcml-healthcheck

확장을 설치, 업데이트 또는 삭제할 때마다 상태 검사가 트리거됩니다. 상태 검사 보고서는 pre-install, pre-rollback, pre-upgradepre-delete의 여러 부분으로 구성됩니다.

  • 확장이 설치되지 않은 경우 pre-installpre-delete를 살펴봐야 합니다.
  • 확장이 업데이트되지 않은 경우 pre-upgradepre-rollback을 살펴봐야 합니다.
  • 확장이 삭제되지 않은 경우 pre-delete를 살펴봐야 합니다.

지원을 요청할 때 문제를 더 잘 찾을 수 있도록 다음 명령을 실행하고 healthcheck.logs 파일을 Microoft에 보내는 것이 좋습니다.

kubectl logs healthcheck -n azureml

HealthCheck의 오류 코드

이 표에서는 HealthCheck 보고서에서 반환된 오류 코드 문제를 해결하는 방법을 보여 줍니다.

오류 코드 오류 메시지 설명
E40001 LOAD_BALANCER_NOT_SUPPORT 부하 분산 장치는 클러스터에서 지원되지 않습니다. 클러스터에서 부하 분산 장치를 구성하거나 inferenceRouterServiceTypenodePort 또는 clusterIP로 설정하는 것이 좋습니다.
E40002 INSUFFICIENT_NODE 클러스터에 3개 이상의 노드가 필요한 inferenceRouterHA를 사용하도록 설정했습니다. 노드가 3개 미만인 경우 HA를 사용하지 않도록 설정합니다.
E40003 INTERNAL_LOAD_BALANCER_NOT_SUPPORT 현재는 AKS만 내부 부하 분산 장치를 지원하며 azure 형식만 지원합니다. AKS 클러스터가 없는 경우 internalLoadBalancerProvider를 설정하지 마세요.
E40007 INVALID_SSL_SETTING SSL 키 또는 인증서가 잘못되었습니다. CNAME은 인증서와 호환되어야 합니다.
E45002 PROMETHEUS_CONFLICT 설치된 Prometheus 연산자가 기존 Prometheus 연산자와 충돌합니다. 자세한 내용은 Prometheus 연산자를 참조하세요.
E45003 BAD_NETWORK_CONNECTIVITY 네트워크 요구 사항을 충족해야 합니다.
E45004 AZUREML_FE_ROLE_CONFLICT Azure Machine Learning 확장은 레거시 AKS에서 지원되지 않습니다. Azure Machine Learning 확장을 설치하려면 레거시 azureml-fe 구성 요소를 삭제해야 합니다.
E45005 AZUREML_FE_DEPLOYMENT_CONFLICT Azure Machine Learning 확장은 레거시 AKS에서 지원되지 않습니다. Azure Machine Learning 확장을 설치하려면 이 양식 아래의 명령을 실행하여 레거시 azureml-fe 구성 요소를 삭제해야 합니다. 자세한 내용은 여기에서 참조할 수 있습니다.

AKS 클러스터에서 레거시 azureml-fe 구성 요소를 삭제하는 명령:

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 Machine Learning 확장은 Prometheus 연산자, 볼케이노(Volcano) 스케줄러 및 DCGM 내보내기를 비롯한 일부 오픈 소스 구성 요소를 사용합니다. Kubernetes 클러스터에 이미 일부 구성 요소가 설치된 경우 다음 섹션을 읽고 기존 구성 요소를 Azure Machine Learning 확장과 통합할 수 있습니다.

Prometheus 연산자

Prometheus 연산자는 kubernetes에서 메트릭 모니터링 시스템을 빌드하는 데 도움이 되는 오픈 소스 프레임워크입니다. 또한 Azure Machine Learning 확장은 Prometheus 연산자를 활용하여 작업의 리소스 사용률을 모니터링합니다.

클러스터에 다른 서비스에서 설치한 Prometheus 연산자가 있는 경우 installPromOp=false를 지정하고 Azure Machine Learning 확장에서 Prometheus 연산자를 사용하지 않도록 설정하여 두 Prometheus 연산자 간의 충돌을 방지할 수 있습니다. 이 경우 기존 prometheus 운영자가 모든 Prometheus 인스턴스를 관리합니다. Prometheus가 제대로 작동하도록 하려면 Azure Machine Learning 확장에서 prometheus 연산자를 사용하지 않도록 설정할 때 다음 사항에 주의해야 합니다.

  1. azureml 네임스페이스의 prometheus가 Prometheus 연산자에 의해 관리되는지 확인합니다. 일부 시나리오에서는 prometheus 연산자가 일부 특정 네임스페이스만 모니터링하도록 설정됩니다. 그렇다면 azureml 네임스페이스가 허용 목록에 있는지 확인합니다. 자세한 내용은 명령 플래그를 참조하세요.
  2. prometheus 연산자에서 kubelet-service가 사용하도록 설정되어 있는지 확인합니다. Kubelet-service에는 kubelet의 모든 엔드포인트가 포함됩니다. 자세한 내용은 명령 플래그를 참조하세요. 또한 kubelet-service에 레이블k8s-app=kubelet이 있는지 확인해야 합니다.
  3. kubelet-service용 ServiceMonitor를 만듭니다. 변수가 대체된 다음 명령을 실행합니다.
    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는 GPU 메트릭을 수집하기 위해 NVIDIA에서 권장하는 공식 도구입니다. 이를 Azure Machine Learning 확장에 통합했습니다. 그러나 기본적으로 dcgm-exporter는 사용하도록 설정되지 않으며 GPU 메트릭은 수집되지 않습니다. installDcgmExporter 플래그를 true로 지정하여 사용하도록 설정할 수 있습니다. NVIDIA의 공식 도구이므로 GPU 클러스터에 이미 설치되어 있을 수 있습니다. 그렇다면 installDcgmExporterfalse로 설정하고 단계에 따라 dcgm-exporter를 Azure Machine Learning 확장에 통합할 수 있습니다. 주목해야 할 또 다른 점은 dcgm-exporter를 통해 사용자가 노출할 메트릭을 구성할 수 있다는 것입니다. Azure Machine Learning 확장의 경우 DCGM_FI_DEV_GPU_UTIL, DCGM_FI_DEV_FB_FREEDCGM_FI_DEV_FB_USED 메트릭이 노출되는지 확인합니다.

  1. Aureml 확장 및 dcgm-exporter가 성공적으로 설치되었는지 확인합니다. Dcgm-exporter helm 차트 또는 Gpu-operator helm 차트를 통해 Dcgm-exporter를 설치할 수 있습니다.

  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. dcgm-exporter 서비스를 Azure Machine Learning 확장에 노출하도록 ServiceMonitor를 설정합니다. 다음 명령을 실행하면 몇 분 안에 적용됩니다.

    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 스케줄러

클러스터에 이미 volcano 제품군이 설치된 경우 installVolcano=false를 설정할 수 있으므로 확장에서 volcano 스케줄러를 설치하지 않습니다. Volcano 스케줄러 및 volcano 컨트롤러는 학습 작업 제출 및 일정에 필요합니다.

Azure Machine Learning 확장에서 사용하는 볼케이노 스케줄러 구성은 다음과 같습니다.

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

동일한 구성 설정을 사용해야 하며, 볼케이노 버전이 1.6보다 낮으면 볼케이노 허용에서 job/validate 웹후크를 사용하지 않도록 설정해야 합니다. 그래야 Azure Machine Learning 학습 워크로드가 제대로 수행됩니다.

클러스터 자동 크기 조정기를 지원하는 볼케이노 스케줄러 통합

스레드에서 설명한 것처럼 갱 플러그 인은 AKS의 CA(클러스터 자동 크기 조정기) 및 노드 자동 크기 조정기에서도 잘 작동하지 않습니다.

installVolcano=true 설정을 통해 Azure Machine Learning 확장과 함께 제공되는 볼케이노를 사용하는 경우 확장에는 기본적으로 작업 교착 상태를 방지하기 위해 플러그 인을 구성하는 스케줄러 구성이 있습니다. 따라서 AKS 클러스터의 CA(클러스터 자동 크기 조정기)는 확장으로 설치된 볼케이노에서 지원되지 않습니다.

이 경우 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 네임스페이스에 위 구성을 사용하여 configmap 파일을 만듭니다. 이 네임스페이스는 일반적으로 Azure Machine Learning 확장을 설치할 때 만들어집니다.
  2. 확장 구성에서 volcanoScheduler.schedulerConfigMap=<configmap name>을 설정하여 이 configmap을 적용합니다. 또한 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
    

참고 항목

갱 플러그 인이 제거되었기 때문에 볼케이노에서 작업을 예약할 때 교착 상태가 발생할 가능성이 있습니다.

  • 이러한 상황을 방지하기 위해 작업 전체에서 동일한 인스턴스 형식을 사용할 수 있습니다.

볼케이노 버전이 1.6보다 낮은 경우 볼케이노 허용에서 job/validate 웹후크를 사용하지 않도록 설정해야 합니다.

수신 Nginx 컨트롤러

Azure Machine Learning 확장 설치에는 기본적으로 수신 nginx 컨트롤러 클래스가 k8s.io/ingress-nginx로 제공됩니다. 클러스터에 수신 nginx 컨트롤러가 이미 있는 경우 설치 실패를 방지하려면 다른 컨트롤러 클래스를 사용해야 합니다.

이때 다음 두 가지 방법을 사용할 수 있습니다.

  • 기존 컨트롤러 클래스를 k8s.io/ingress-nginx가 아닌 다른 것으로 변경합니다.
  • 다음 예에 따라 사용자 지정 컨트롤러 클래스와 다른 사용자 지정 컨트롤러 클래스를 사용하여 Azure Machine Learning 확장을 만들거나 업데이트합니다.

예를 들어, 사용자 지정 컨트롤러 클래스를 사용하여 확장을 만들려면 다음을 수행합니다.

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

사용자 지정 컨트롤러 클래스로 확장을 업데이트하려면 다음을 수행합니다.

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

OOM(메모리 부족) 오류로 인해 Azure Machine Learning 확장과 함께 설치된 Nginx 수신 컨트롤러가 충돌합니다.

증상

워크로드가 없는 경우에도 OOM(메모리 부족) 오류로 인해 Azure Machine Learning 확장과 함께 설치된 nginx 수신 컨트롤러가 충돌합니다. 컨트롤러 로그에는 문제를 진단하는 데 유용한 정보가 표시되지 않습니다.

가능한 원인

이 문제는 nginx 수신 컨트롤러가 CPU가 많은 노드에서 실행되는 경우 발생할 수 있습니다. 기본적으로 nginx 수신 컨트롤러는 CPU 수에 따라 작업자 프로세스를 생성하므로 더 많은 리소스를 소비하고 CPU가 더 많은 노드에서 OOM 오류가 발생할 수 있습니다. 이는 GitHub에 보고된 알려진 문제입니다.

해결 방법

이 문제를 해결하려면 다음을 수행할 수 있습니다.

  • 매개 변수 nginxIngress.controllerConfig.worker-processes=8로 확장을 설치하여 작업자 프로세스 수를 조정합니다.
  • 매개 변수 nginxIngress.resources.controller.limits.memory=<new limit>를 사용하여 메모리 한도를 늘립니다.

워크로드를 효과적으로 최적화하려면 특정 노드 사양 및 워크로드 요구 사항에 따라 이 두 매개 변수를 조정해야 합니다.

다음 단계