Aracılığıyla paylaş


Azure Machine Learning uzantısı sorunlarını giderme

Bu makalede AKS veya Arc özellikli Kubernetes'inizde Azure Machine Learning uzantısı dağıtımında karşılaşabileceğiniz yaygın sorunları gidermeyi öğreneceksiniz.

Azure Machine Learning uzantısı nasıl yüklenir?

Azure Machine Learning uzantısı helm grafiği olarak yayınlanır ve Helm V3 tarafından yüklenir. Azure Machine Learning uzantısının tüm bileşenleri ad alanına azureml yüklenir. Uzantı durumunu denetlemek için aşağıdaki komutları kullanabilirsiniz.

# 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 uzantısı dağıtım hatasını giderme

Hata: Hala kullanımda olan bir ad yeniden kullanılamıyor

Bu hata, belirttiğiniz uzantı adının zaten var olduğu anlamına gelir. Ad Azure Machine Learning uzantısı tarafından kullanılıyorsa, yaklaşık bir saat beklemeniz ve yeniden denemeniz gerekir. Ad diğer helm chart’ları tarafından kullanılıyorsa başka bir ad kullanmanız gerekir. Komutunu çalıştırarak helm list -Aa kümenizdeki tüm helm grafiklerini listeleyin.

Hata: Helm grafiği için önceki işlem devam ediyor

Bilinmeyen işlem tamamlandıktan sonra yaklaşık bir saat beklemeniz ve yeniden denemeniz gerekir.

Hata: sonlandırıldığı için azureml ad alanında yeni içerik oluşturulamıyor

Kaldırma işlemi tamamlanmadığında ve başka bir yükleme işlemi tetiklendiğinde bu hata oluşur. az k8s-extension show komutunu çalıştırarak uzantının sağlama durumunu denetleyebilirsiniz ve diğer eylemleri gerçekleştirmeden önce uzantının kaldırıldığından emin olabilirsiniz.

Hata: Grafik yolu bulunamadı ve indirilemedi

Bu hata, yanlış bir uzantı sürümü belirttiğinizde oluşur. Belirtilen sürümün mevcut olduğundan emin olmanız gerekir. En son sürümü kullanmak istiyorsanız, belirtmeniz --version gerekmez.

Hata: geçerli sürüme aktarılamıyor: geçersiz sahiplik meta verileri

Bu hata, mevcut küme kaynaklarıyla Azure Machine Learning uzantısı arasında çakışma olduğu anlamına gelir. Tam hata iletisi aşağıdaki metin gibi olabilir:

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"

Sorunu azaltmak için aşağıdaki adımları kullanın.

  • Sorunlu kaynaklara kimin sahip olduğunu ve kaynağın silinip silinemediğini veya değiştirilip değiştirilmediğini denetleyin.

  • Kaynak yalnızca Azure Machine Learning uzantısı tarafından kullanılıyorsa ve silinebiliyorsa, sorunu azaltmak için etiketleri el ile ekleyebilirsiniz. Önceki hata iletisini örnek olarak alarak komutları aşağıdaki gibi çalıştırabilirsiniz:

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

    Kaynağa etiketleri ve ek açıklamaları ayarlaması, helm'in Azure Machine Learning uzantısına ait kaynağı yönettiği anlamına gelir.

  • Kaynak, kümenizdeki diğer bileşenler tarafından da kullanıldığında ve değiştirilemediğinde. Çakışma kaynağını devre dışı bırakmak için bir yapılandırma ayarı olup olmadığını görmek için Azure Machine Learning uzantısını dağıtma konusuna bakın.

Uzantı için HealthCheck

Yükleme başarısız olduğunda ve yukarıdaki hata iletilerinden herhangi birine isabet etmediğinde, uzantı üzerinde kapsamlı bir denetim yapmak için yerleşik sistem durumu denetimi işini kullanabilirsiniz. Azure machine learning uzantısı, uzantıyı yüklemeye, güncelleştirmeye veya silmeye çalıştığınızda küme hazırlığınızı önceden denetleyebileceğiniz bir HealthCheck iş içerir. HealthCheck işi, ad alanında adlı arcml-healthcheck bir yapılandırma haritasına azureml kaydedilen bir rapor oluşturur. Rapor için hata kodları ve olası çözümler HealthCheck Hata Kodu'nda listelenir.

HealthCheck raporunu almak için bu komutu çalıştırın,

kubectl describe configmap -n azureml arcml-healthcheck

Uzantıyı her yüklediğinizde, güncelleştirdiğinizde veya sildiğinizde sistem durumu denetimi tetiklenir. Sistem durumu denetimi raporu, çeşitli bölümleri pre-install, pre-rollbackpre-upgrade ve pre-deleteile yapılandırılmıştır.

  • Uzantı yüklenemediyse ve pre-deleteiçine pre-install bakmalısınız.
  • Uzantı güncelleştirilmezse ve pre-rollbackiçine pre-upgrade bakmanız gerekir.
  • Uzantı silinemediyse, içine pre-deletebakmanız gerekir.

Destek istediğinizde, aşağıdaki komutu çalıştırmanızı ve sorunu daha iyi bulmamızı kolaylaştırabileceği için healthcheck.logs dosyasını bize göndermenizi öneririz.

kubectl logs healthcheck -n azureml

HealthCheck Hata Kodu

Bu tabloda, HealthCheck raporu tarafından döndürülen hata kodlarıyla ilgili sorunları giderme adımları gösterilmektedir.

Hata Kodu Hata İletisi Açıklama
E40001 LOAD_BALANCER_NOT_SUPPORT Yük dengeleyici kümenizde desteklenmez. Kümenizdeki yük dengeleyiciyi yapılandırmanız veya veya clusterIPolarak ayarlamayı inferenceRouterServiceType nodePort göz önünde bulundurmanız gerekir.
E40002 INSUFFICIENT_NODE Kümenizde en az üç düğüm gerektiren bir etkinleştirdiniz inferenceRouterHA . Üçten az düğüm varsa HA'yi devre dışı bırakın.
E40003 INTERNAL_LOAD_BALANCER_NOT_SUPPORT Şu anda yalnızca AKS iç yük dengeleyiciyi destekler ve biz yalnızca türünü destekleriz azure . AKS kümeniz yoksa ayarlamayın internalLoadBalancerProvider .
E40007 INVALID_SSL_SETTING SSL anahtarı veya sertifikası geçerli değil. CNAME sertifikayla uyumlu olmalıdır.
E45002 PROMETHEUS_CONFLICT Yüklü Prometheus İşleci mevcut Prometheus operatörünüzle çakışıyor. Daha fazla bilgi için bkz. Prometheus işleci
E45003 BAD_NETWORK_CONNECTIVITY Ağ gereksinimlerini karşılamanız gerekir.
E45004 AZUREML_FE_ROLE_CONFLICT Azure Machine Learning uzantısı eski AKS'de desteklenmez. Azure Machine Learning uzantısını yüklemek için eski azureml-fe bileşenlerini silmeniz gerekir.
E45005 AZUREML_FE_DEPLOYMENT_CONFLICT Azure Machine Learning uzantısı eski AKS'de desteklenmez. Azure Machine Learning uzantısını yüklemek için bu formun altındaki komutu çalıştırarak eski azureml-fe bileşenlerini silmeniz gerekir. Burada daha fazla ayrıntı bulabilirsiniz.

AKS kümesindeki eski azureml-fe bileşenlerini silme komutları:

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

Açık kaynak bileşenlerinin entegrasyonu

Azure Machine Learning uzantısı Prometheus Operatörü, Volkan Zamanlayıcı ve DCGM ihracatçısı gibi bazı açık kaynak bileşenlerini kullanır. Kubernetes kümesinde bunlardan bazıları zaten yüklüyse, mevcut bileşenlerinizi Azure Machine Learning uzantısıyla tümleştirmek için aşağıdaki bölümleri okuyabilirsiniz.

Prometheus işleci

Prometheus işleci, kubernetes'te ölçüm izleme sistemi oluşturmaya yardımcı olan bir açık kaynak çerçevesidir. Azure Machine Learning uzantısı, işlerin kaynak kullanımını izlemeye yardımcı olmak için Prometheus işlecini de kullanır.

Kümede başka bir hizmet tarafından yüklenmiş Prometheus işleci varsa, iki Prometheus işleci arasında çakışma yaşanmasını önlemek için Azure Machine Learning uzantısında Prometheus işlecini devre dışı bırakabilirsiniz installPromOp=false . Bu durumda, mevcut prometheus işleci tüm Prometheus örneklerini yönetir. Prometheus'un düzgün çalıştığından emin olmak için Azure Machine Learning uzantısında prometheus işlecini devre dışı bırakırken aşağıdakilere dikkat edilmesi gerekir.

  1. azureml ad alanında prometheus'un Prometheus işleci tarafından yönetilip yönetilmediğini denetleyin. Bazı senaryolarda prometheus işleci yalnızca belirli ad alanlarını izleyecek şekilde ayarlanır. Öyleyse, azureml ad alanının izin verilenler listesinde olduğundan emin olun. Daha fazla bilgi için bkz . komut bayrakları.
  2. prometheus işlecinde kubelet-service'in etkinleştirilip etkinleştirilmediğini denetleyin. Kubelet-service, kubelet'in tüm uç noktalarını içerir. Daha fazla bilgi için bkz . komut bayrakları. Ayrıca kubelet-service'in bir etiketik8s-app=kubelet olduğundan da emin olmanız gerekir.
  3. kubelet-service için ServiceMonitor oluşturun. Değiştirilen değişkenlerle aşağıdaki komutu çalıştırın:
    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 ihracatçısı

Dcgm-exporter , GPU ölçümlerini toplamak için NVIDIA tarafından önerilen resmi araçtır. Bunu Azure Machine Learning uzantısıyla tümleştirdik. Ancak varsayılan olarak dcgm-exporter etkin değildir ve GPU ölçümleri toplanmaz. Etkinleştirmek için true bayrağını belirtebilirsinizinstallDcgmExporter. NVIDIA'nın resmi aracı olduğundan, GPU kümenizde zaten yüklü olabilir. Bu durumda, dcgm-exporter'ınızı Azure Machine Learning uzantısıyla tümleştirmek için öğesini ayarlayabilir installDcgmExporter false ve adımları izleyebilirsiniz. Dikkate alınması gereken bir diğer nokta da dcgm-exporter'ın kullanıcının hangi ölçümleri kullanıma sunması için yapılandırma yapmasına izin verdiğidir. Azure Machine Learning uzantısı için ve DCGM_FI_DEV_FB_FREE DCGM_FI_DEV_FB_USED ölçümlerinin kullanıma sunulduğuna emin olunDCGM_FI_DEV_GPU_UTIL.

  1. Aureml uzantısının ve dcgm-exporter uygulamasının başarıyla yüklendiğinden emin olun. Dcgm-exporter, Dcgm-exporter helm chart veya Gpu-operator helm chart tarafından yüklenebilir

  2. dcgm-exporter için bir hizmet olup olmadığını denetleyin. Yoksa veya nasıl denetlendiğini bilmiyorsanız, aşağıdaki komutu çalıştırarak bir komut oluşturun.

    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. Önceki adımda hizmetin doğru ayarlandığını denetleyin

    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. Azure Machine Learning uzantısında dcgm-exporter hizmetini kullanıma açmak için ServiceMonitor'ı ayarlayın. Aşağıdaki komutu çalıştırın ve birkaç dakika içinde geçerli olur.

    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
    

Volkan Zamanlayıcı

Kümenizde yanardağ paketi zaten yüklüyse , uzantısının volkan zamanlayıcısını yüklememesi için ayarlayabilirsiniz installVolcano=false. Volkan zamanlayıcı ve volkan kontrolörü, eğitim işi gönderimi ve zamanlama için gereklidir.

Azure Machine Learning uzantısı tarafından kullanılan volkan zamanlayıcı yapılandırması şöyledir:

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

Azure Machine Learning eğitim iş yüklerinin düzgün bir şekilde çalışabilmesi için bu yapılandırma ayarlarını kullanmanız ve yanardağ sürümünüz 1.6'dan düşükse yanardağ erişiminde web kancasını devre dışı bırakmanız job/validate gerekir.

Küme otomatik ölçeklendiricisini destekleyen volkan zamanlayıcı tümleştirmesi

Bu yazışmada açıklandığı gibi, çete eklentisi küme otomatik ölçeklendiricisi (CA) ve AKS'deki düğüm otomatik ölçeklendiricisi ile iyi çalışmıyor.

Ayarı installVolcano=truearacılığıyla Azure Machine Learning uzantısıyla birlikte gelen volkanı kullanırsanız, uzantının varsayılan olarak çete eklentisini iş kilitlenmesini önlemek için yapılandıran bir zamanlayıcı yapılandırması vardır. Bu nedenle AKS kümesindeki küme otomatik ölçeklendiricisi (CA), uzantı tarafından yüklenen yanardağ ile desteklenmeyecektir.

Bu durumda AKS kümesi otomatik ölçeklendiricisinin normal şekilde çalışabileceğini tercih ederseniz, uzantıyı güncelleştirerek bu volcanoScheduler.schedulerConfigMap parametreyi yapılandırabilir ve buna hiçbir çete volkan zamanlayıcısının özel bir yapılandırmasını belirtebilirsiniz, örneğin:

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 kümenizde bu yapılandırmayı kullanmak için aşağıdaki adımları izlemeniz gerekir:

  1. Ad alanında yukarıdaki yapılandırmayla bir yapılandırma azureml haritası dosyası oluşturun. Bu ad alanı genellikle Azure Machine Learning uzantısını yüklediğinizde oluşturulur.
  2. Bu yapılandırma haritasını uygulamak için uzantı yapılandırmasında ayarlayın volcanoScheduler.schedulerConfigMap=<configmap name> . Uzantıyı yapılandırarak amloperator.skipResourceValidation=trueyüklerken kaynak doğrulamasını atlamanız gerekir. Örneğin:
    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
    

Not

Çete eklentisi kaldırıldığından, volkan işi zamanladığında kilitlenme olasılığı vardır.

  • Bu durumu önlemek için işlerde aynı örnek türünü kullanabilirsiniz.

Yanardağ sürümünüz 1.6'dan düşükse yanardağ girişinde web kancasını devre dışı bırakmanız job/validate gerektiğini unutmayın.

Giriş Nginx denetleyicisi

Azure Machine Learning uzantısı yüklemesi varsayılan olarak k8s.io/ingress-nginx bir giriş nginx denetleyici sınıfıyla birlikte gelir. Kümenizde zaten bir giriş nginx denetleyicisi varsa, yükleme hatasını önlemek için farklı bir denetleyici sınıfı kullanmanız gerekir.

İki seçeneğiniz vardır:

  • Mevcut denetleyici sınıfınızı dışında k8s.io/ingress-nginxbir şeyle değiştirin.
  • Aşağıdaki örnekleri izleyerek Azure Machine Learning uzantımızı sizinkilerden farklı bir özel denetleyici sınıfıyla oluşturun veya güncelleştirin.

Örneğin, uzantıyı özel denetleyici sınıfıyla oluşturmak için:

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

Uzantıyı özel denetleyici sınıfıyla güncelleştirmek için:

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

Azure Machine Learning uzantısıyla yüklenen Nginx giriş denetleyicisi, yetersiz bellek (OOM) hataları nedeniyle kilitleniyor

Belirti

Azure Machine Learning uzantısıyla yüklenen nginx giriş denetleyicisi, iş yükü olmadığında bile bellek yetersiz (OOM) hataları nedeniyle kilitleniyor. Denetleyici günlükleri, sorunu tanılamak için herhangi bir yararlı bilgi göstermez.

Olası Neden

Nginx giriş denetleyicisi birçok CPU'ya sahip bir düğümde çalışıyorsa bu sorun oluşabilir. Varsayılan olarak, nginx giriş denetleyicisi çalışan işlemlerini CPU sayısına göre oluşturur ve bu da daha fazla kaynak tüketebilir ve daha fazla CPU'ya sahip düğümlerde OOM hatalarına neden olabilir. Bu, GitHub'da bildirilen bilinen bir sorundur

Çözünürlük

Bu sorunu gidermek için şunları yapabilirsiniz:

  • uzantısını parametresiyle nginxIngress.controllerConfig.worker-processes=8yükleyerek çalışan işlemlerinin sayısını ayarlayın.
  • parametresini nginxIngress.resources.controller.limits.memory=<new limit>kullanarak bellek sınırını artırın.

İş yüklerinizi etkili bir şekilde iyileştirmek için bu iki parametreyi belirli düğüm belirtimlerinize ve iş yükü gereksinimlerinize göre ayarladığınızdan emin olun.

Sonraki adımlar