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-install
dengan beberapa bagian , , pre-rollback
pre-upgrade
dan pre-delete
.
- Jika ekstensi gagal diinstal, Anda harus melihat ke dalam
pre-install
danpre-delete
. - Jika ekstensi diperbarui gagal, Anda harus melihat ke dalam
pre-upgrade
danpre-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.
- 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.
- 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 label
k8s-app=kubelet
. - 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.
Pastikan Anda berhasil menginstal ekstensi Aureml dan dcgm-exporter. Dcgm-exporter dapat diinstal oleh bagan helm Dcgm-exporter atau bagan helm Gpu-operator
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
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
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:
- Buat file configmap dengan konfigurasi di atas di
azureml
namespace. Namespace ini umumnya akan dibuat saat Anda menginstal ekstensi Azure Pembelajaran Mesin. - Atur
volcanoScheduler.schedulerConfigMap=<configmap name>
dalam konfigurasi ekstensi untuk menerapkan configmap ini. Dan Anda perlu melewati validasi sumber daya saat menginstal ekstensi dengan mengonfigurasiamloperator.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.