Bagikan melalui


Memecahkan masalah ekstensi Azure Machine Learning

Dalam artikel ini, Anda mempelajari cara memecahkan masalah umum yang mungkin Anda temui dengan penyebaran ekstensi Azure Pembelajaran Mesin di Kubernetes dengan dukungan AKS atau Arc.

Bagaimana ekstensi Azure Machine Learning diinstal

Ekstensi Azure Pembelajaran Mesin dirilis sebagai bagan helm dan diinstal oleh Helm V3. Semua komponen ekstensi Azure Pembelajaran Mesin diinstal di azureml namespace layanan. Anda dapat menggunakan perintah berikut untuk memeriksa status ekstensi.

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

Memecahkan masalah kesalahan penyebaran ekstensi Azure Machine Learning

Kesalahan: tidak dapat menggunakan kembali nama yang masih digunakan

Kesalahan ini berarti nama ekstensi yang Anda berikan sudah ada. Jika nama digunakan oleh ekstensi Azure Machine Learning, Anda harus menunggu sekitar satu jam, baru kemudian mencoba lagi. Jika nama digunakan oleh bagan helm lainnya, Anda perlu menggunakan nama lain. Jalankan untuk mencantumkan helm list -Aa semua bagan helm di kluster Anda.

Kesalahan: operasi sebelumnya untuk bagan helm masih berlangsung

Anda harus menunggu sekitar satu jam, baru kemudian mencoba lagi setelah operasi yang tidak diketahui selesai.

Kesalahan: tidak dapat membuat konten baru di namespace layanan azureml karena sedang dihentikan

Kesalahan ini terjadi ketika operasi penghapusan instalasi tidak selesai dan operasi penginstalan lain dipicu. Anda dapat menjalankan perintah az k8s-extension show untuk memeriksa status provisi ekstensi dan memastikan ekstensi telah dihapus sebelum mengambil tindakan lain.

Kesalahan: gagal mengunduh jalur Bagan tidak ditemukan

Kesalahan ini terjadi ketika Anda memasukkan versi ekstensi yang salah. Anda harus memastikan versi yang dimasukkan ada. Jika Anda ingin menggunakan versi terbaru, Anda tidak perlu menentukan --version .

Kesalahan: tidak dapat diimpor ke rilis saat ini: metadata kepemilikan tidak valid

Kesalahan ini berarti ada konflik antara sumber daya kluster yang ada dan ekstensi Azure Machine Learning. Pesan kesalahan yang lengkap bisa berupa teks seperti berikut:

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"

Gunakan langkah-langkah berikut untuk mengurangi masalah.

  • Periksa siapa yang memiliki sumber daya yang bermasalah dan apakah sumber daya tersebut dapat dihapus atau dimodifikasi.

  • Jika sumber daya hanya digunakan oleh ekstensi Azure Machine Learning dan dapat dihapus, Anda dapat menambahkan label secara manual untuk mengurangi masalah. Mengambil contoh dari pesan kesalahan sebelumnya, Anda dapat menjalankan perintah sebagai berikut,

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

    Dengan mengatur label dan anotasi ke sumber daya, itu berarti helm mengelola sumber daya yang dimiliki oleh ekstensi Azure Machine Learning.

  • Ketika sumber daya juga digunakan oleh komponen lain di kluster Anda dan tidak dapat dimodifikasi. Lihat menyebarkan ekstensi Azure Pembelajaran Mesin untuk melihat apakah ada pengaturan konfigurasi untuk menonaktifkan sumber daya konflik.

Pemeriksaan HealthCheck

Ketika penginstalan gagal dan tidak mencapai salah satu pesan kesalahan di atas, Anda dapat menggunakan pekerjaan pemeriksaan kesehatan bawaan untuk melakukan pemeriksaan komprehensif pada ekstensi. Ekstensi pembelajaran mesin Azure berisi HealthCheck pekerjaan untuk mendahului kesiapan kluster Saat Anda mencoba menginstal, memperbarui, atau menghapus ekstensi. Pekerjaan HealthCheck menghasilkan laporan, yang disimpan dalam peta konfigurasi bernama arcml-healthcheck di azureml namespace layanan. Kode kesalahan dan kemungkinan solusi untuk laporan tercantum dalam Kode Kesalahan HealthCheck.

Jalankan perintah ini untuk mendapatkan laporan HealthCheck,

kubectl describe configmap -n azureml arcml-healthcheck

Pemeriksaan kondisi dipicu setiap kali Anda menginstal, memperbarui, atau menghapus ekstensi. Laporan pemeriksaan kesehatan disusun pre-installdengan beberapa bagian , , pre-rollbackpre-upgrade dan pre-delete.

  • Jika ekstensi gagal diinstal, Anda harus melihat ke dalam pre-install dan pre-delete.
  • Jika ekstensi diperbarui gagal, Anda harus melihat ke dalam pre-upgrade dan pre-rollback.
  • Jika ekstensi gagal dihapus, Anda harus melihat ke dalam pre-delete.

Saat Anda meminta dukungan, kami sarankan Anda menjalankan perintah berikut dan mengirim file healthcheck.logs kepada kami, karena dapat membantu kami untuk menemukan masalah dengan lebih baik.

kubectl logs healthcheck -n azureml

Kode Kesalahan HealthCheck

Tabel ini memperlihatkan cara untuk memecahkan masalah kode kesalahan yang dihasilkan oleh laporan HealthCheck.

Kode Kesalahan Pesan kesalahan Deskripsi
E40001 LOAD_BALANCER_NOT_SUPPORT Load balancer tidak didukung di kluster Anda. Anda perlu mengonfigurasi load balancer di kluster Anda atau mempertimbangkan pengaturan inferenceRouterServiceType ke nodePort atau clusterIP.
E40002 INSUFFICIENT_NODE Anda telah mengaktifkan inferenceRouterHA yang memerlukan setidaknya tiga simpul di kluster Anda. Nonaktifkan KETERSEDIAAN TINGGI jika Anda memiliki kurang dari tiga simpul.
E40003 INTERNAL_LOAD_BALANCER_NOT_SUPPORT Saat ini, hanya AKS yang mendukung load balancer internal, dan kami hanya mendukung jenisnya azure . Jangan atur internalLoadBalancerProvider jika Anda tidak memiliki kluster AKS.
E40007 INVALID_SSL_SETTING Kunci atau sertifikat SSL tidak valid. CNAME harus kompatibel dengan sertifikat.
E45002 PROMETHEUS_CONFLICT Operator Prometheus yang diinstal bertentangan dengan Operator Prometheus Anda yang ada. Untuk informasi selengkapnya, lihat Operator Prometheus
E45003 BAD_NETWORK_CONNECTIVITY Anda perlu memenuhi persyaratan jaringan.
E45004 AZUREML_FE_ROLE_CONFLICT Ekstensi Azure Pembelajaran Mesin tidak didukung di AKS warisan. Untuk menginstal ekstensi Azure Pembelajaran Mesin, Anda perlu menghapus komponen azureml-fe warisan.
E45005 AZUREML_FE_DEPLOYMENT_CONFLICT Ekstensi Azure Pembelajaran Mesin tidak didukung di AKS warisan. Untuk menginstal ekstensi Azure Pembelajaran Mesin, Anda perlu menjalankan perintah di bawah formulir ini untuk menghapus komponen azureml-fe warisan, detail selengkapnya yang dapat Anda lihat di sini.

Perintah untuk menghapus komponen azureml-fe warisan di kluster 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

Integrasi komponen sumber terbuka

Ekstensi Azure Pembelajaran Mesin menggunakan beberapa komponen sumber terbuka, termasuk Operator Prometheus, Volcano Scheduler, dan pengekspor DCGM. Jika kluster Kubernetes sudah menginstal beberapa di antaranya, Anda dapat membaca bagian berikut untuk mengintegrasikan komponen yang ada dengan ekstensi Azure Pembelajaran Mesin.

Operator Prometheus

Operator Prometheus adalah kerangka kerja sumber terbuka untuk membantu membangun sistem pemantauan metrik di kubernetes. Ekstensi Azure Pembelajaran Mesin juga menggunakan operator Prometheus untuk membantu memantau pemanfaatan sumber daya pekerjaan.

Jika kluster memiliki operator Prometheus yang diinstal oleh layanan lain, Anda dapat menentukan installPromOp=false untuk menonaktifkan operator Prometheus di ekstensi Azure Pembelajaran Mesin untuk menghindari konflik antara dua operator Prometheus. Dalam hal ini, operator prometheus yang ada mengelola semua instans Prometheus. Untuk memastikan Prometheus berfungsi dengan baik, hal-hal berikut perlu diperhatikan saat Anda menonaktifkan operator prometheus di ekstensi Azure Pembelajaran Mesin.

  1. Periksa apakah prometheus di namespace azureml dikelola oleh operator Prometheus. Dalam beberapa skenario, operator prometheus diatur untuk hanya memantau beberapa namespace tertentu. Jika demikian, pastikan namespace azureml berada dalam daftar yang diizinkan. Untuk informasi selengkapnya, lihat bendera perintah.
  2. Periksa apakah layanan kubelet diaktifkan di operator prometheus. Kubelet-service berisi semua titik akhir kubelet. Untuk informasi selengkapnya, lihat bendera perintah. Dan juga perlu memastikan bahwa kubelet-service memiliki labelk8s-app=kubelet.
  3. Buat ServiceMonitor untuk kubelet-service. Jalankan perintah berikut dengan variabel yang diganti:
    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
    

Pengekspor DCGM

Dcgm-exporter adalah alat resmi yang direkomendasikan oleh NVIDIA untuk mengumpulkan metrik GPU. Kami telah mengintegrasikannya ke ekstensi Azure Pembelajaran Mesin. Tetapi, secara default, dcgm-exporter tidak diaktifkan, dan tidak ada metrik GPU yang dikumpulkan. Anda dapat menentukan installDcgmExporter bendera untuk true mengaktifkannya. Karena ini adalah alat resmi NVIDIA, Anda mungkin sudah memasangnya di kluster GPU Anda. Jika demikian, Anda dapat mengatur installDcgmExporter ke false dan mengikuti langkah-langkah untuk mengintegrasikan dcgm-exporter Anda ke ekstensi Azure Pembelajaran Mesin. Hal lain yang perlu diperhatikan adalah bahwa dcgm-exporter memungkinkan pengguna untuk mengonfigurasi metrik mana yang akan diekspos. Untuk ekstensi Azure Pembelajaran Mesin, pastikan DCGM_FI_DEV_GPU_UTIL, DCGM_FI_DEV_FB_FREE dan DCGM_FI_DEV_FB_USED metrik terekspos.

  1. Pastikan Anda berhasil menginstal ekstensi Aureml dan dcgm-exporter. Dcgm-exporter dapat diinstal oleh bagan helm Dcgm-exporter atau bagan helm Gpu-operator

  2. Periksa apakah ada layanan untuk dcgm-exporter. Jika tidak ada atau Anda tidak tahu cara memeriksanya, jalankan perintah berikut untuk membuatnya.

    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. Periksa apakah layanan di langkah sebelumnya diatur dengan benar

    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. Siapkan ServiceMonitor untuk mengekspos layanan dcgm-exporter ke ekstensi Azure Pembelajaran Mesin. Jalankan perintah berikut dan berlaku dalam beberapa menit.

    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
    

Penjadwal Gunung Berapi

Jika kluster Anda sudah menginstal rangkaian gunung berapi, Anda dapat mengatur installVolcano=false, sehingga ekstensi tidak akan menginstal penjadwal gunung berapi. Penjadwal gunung berapi dan pengontrol gunung berapi diperlukan untuk melatih pengajuan dan penjadwalan pekerjaan.

Konfigurasi penjadwal gunung berapi yang digunakan oleh ekstensi Azure Pembelajaran Mesin adalah:

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

Anda perlu menggunakan pengaturan konfigurasi yang sama ini, dan Anda perlu menonaktifkan job/validate webhook di penerimaan gunung berapi jika versi gunung berapi Anda lebih rendah dari 1,6, sehingga beban kerja pelatihan Azure Pembelajaran Mesin dapat berkinerja dengan baik.

Integrasi penjadwal gunung berapi yang mendukung autoscaler kluster

Seperti yang dibahas dalam utas ini , plugin gang tidak berfungsi dengan baik dengan autoscaler kluster (CA) dan juga autoscaler node di AKS.

Jika Anda menggunakan gunung berapi yang dilengkapi dengan ekstensi Azure Pembelajaran Mesin melalui pengaturan installVolcano=true, ekstensi memiliki konfigurasi penjadwal secara default, yang mengonfigurasi plugin geng untuk mencegah kebuntuan pekerjaan. Oleh karena itu, autoscaler kluster (CA) di kluster AKS tidak akan didukung dengan gunung berapi yang diinstal oleh ekstensi.

Untuk kasus ini, jika Anda lebih suka autoscaler kluster AKS dapat bekerja secara normal, Anda dapat mengonfigurasi parameter ini volcanoScheduler.schedulerConfigMap melalui ekstensi pembaruan, dan menentukan konfigurasi kustom penjadwal gunung berapi tidak geng untuk itu, misalnya:

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

Untuk menggunakan konfigurasi ini di kluster AKS, Anda harus mengikuti langkah-langkah berikut:

  1. Buat file configmap dengan konfigurasi di atas di azureml namespace. Namespace ini umumnya akan dibuat saat Anda menginstal ekstensi Azure Pembelajaran Mesin.
  2. Atur volcanoScheduler.schedulerConfigMap=<configmap name> dalam konfigurasi ekstensi untuk menerapkan configmap ini. Dan Anda perlu melewati validasi sumber daya saat menginstal ekstensi dengan mengonfigurasi amloperator.skipResourceValidation=true. Misalnya:
    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>
    

Catatan

Karena plugin geng dihapus, ada potensi kebuntuan terjadi ketika gunung berapi menjadwalkan pekerjaan.

  • Untuk menghindari situasi ini, Anda dapat menggunakan jenis instans yang sama di seluruh pekerjaan.

Menggunakan konfigurasi penjadwal selain default yang disediakan oleh ekstensi Azure Pembelajaran Mesin mungkin tidak didukung sepenuhnya. Lanjutkan dengan hati-hati.

Perhatikan bahwa Anda perlu menonaktifkan job/validate webhook di penerimaan gunung berapi jika versi gunung berapi Anda lebih rendah dari 1,6.

Pengontrol Ingress Nginx

Penginstalan ekstensi Azure Pembelajaran Mesin dilengkapi dengan kelas pengontrol ingress nginx seperti k8s.io/ingress-nginx secara default. Jika Anda sudah memiliki pengontrol ingress nginx di kluster Anda, Anda perlu menggunakan kelas pengontrol yang berbeda untuk menghindari kegagalan penginstalan.

Anda memiliki dua pilihan:

  • Ubah kelas pengontrol yang ada menjadi sesuatu selain k8s.io/ingress-nginx.
  • Buat atau perbarui ekstensi Azure Pembelajaran Mesin kami dengan kelas pengontrol kustom yang berbeda dari milik Anda dengan mengikuti contoh berikut.

Misalnya, untuk membuat ekstensi dengan kelas pengontrol kustom:

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

Untuk memperbarui ekstensi dengan kelas pengontrol kustom:

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

Pengontrol ingress Nginx yang diinstal dengan ekstensi Azure Pembelajaran Mesin mengalami crash karena kesalahan kehabisan memori (OOM)

Gejala

Pengontrol ingress nginx yang diinstal dengan ekstensi Azure Pembelajaran Mesin mengalami crash karena kesalahan di luar memori (OOM) bahkan ketika tidak ada beban kerja. Log pengontrol tidak menampilkan informasi yang berguna untuk mendiagnosis masalah.

Kemungkinan Penyebabnya

Masalah ini dapat terjadi jika pengontrol ingress nginx berjalan pada node dengan banyak CPU. Secara default, pengontrol ingress nginx menelurkan proses pekerja sesuai dengan jumlah CPU, yang dapat mengonsumsi lebih banyak sumber daya dan menyebabkan kesalahan OOM pada simpul dengan lebih banyak CPU. Ini adalah masalah yang diketahui yang dilaporkan di GitHub

Resolusi

Untuk mengatasi masalah ini, Anda dapat:

  • Sesuaikan jumlah proses pekerja dengan menginstal ekstensi dengan parameter nginxIngress.controllerConfig.worker-processes=8.
  • Tingkatkan batas memori dengan menggunakan parameter nginxIngress.resources.controller.limits.memory=<new limit>.

Pastikan untuk menyesuaikan kedua parameter ini sesuai dengan spesifikasi node dan persyaratan beban kerja spesifik Anda untuk mengoptimalkan beban kerja Anda secara efektif.

Langkah berikutnya