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 チャートの一覧を表示するには、helm list -Aa
を実行します。
エラー: 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>"
ラベルと注釈をリソースに設定することで、Azure Machine Learning 拡張機能が所有するリソースが Helm によって管理されていることを示します。
リソースがクラスター内の他のコンポーネントでも使用されており、変更できない場合。 競合リソースを無効にする構成設定があるか確認するには、「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-upgrade
、pre-delete
という複数の部分で構成されます。
- 拡張機能のインストールが失敗する場合は、
pre-install
とpre-delete
を調べる必要があります。 - 拡張機能の更新が失敗する場合は、
pre-upgrade
とpre-rollback
を調べる必要があります。 - 拡張機能の削除が失敗する場合は、
pre-delete
を調べる必要があります。
サポートを要求するときは、次のコマンドを実行して healthcheck.logs
ファイルをお送りくださることをお勧めします。そうすることで、問題の特定が容易になることがあります。
kubectl logs healthcheck -n azureml
HealthCheck のエラー コード
次の表では、HealthCheck レポートによって返されるエラー コードのトラブルシューティング方法を示します。
エラー コード | エラー メッセージ | 説明 |
---|---|---|
E40001 | LOAD_BALANCER_NOT_SUPPORT | お使いのクラスターではロード バランサーはサポートされていません。 クラスター内にロード バランサーを構成するか、inferenceRouterServiceType を nodePort または 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 Operator が、既存の Prometheus Operator と競合しています。 詳しくは、「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 Operator、Volcano Scheduler、DCGM Exporter など、いくつかのオープンソース コンポーネントが使われます。 Kubernetes クラスターにそれらの一部が既にインストールされている場合は、以下のセクションを読んで、既存のコンポーネントを Azure Machine Learning 拡張機能と統合できます。
Prometheus 演算子
Prometheus Operator は、kubernetes でメトリック監視システムを構築するのに役立つオープンソース フレームワークです。 Azure Machine Learning 拡張機能でも、Prometheus Operator を使ってジョブのリソース使用状況を監視できます。
Prometheus Operator が他のサービスによってクラスターに既にインストールされている場合は、installPromOp=false
を指定して Azure Machine Learning 拡張機能で Prometheus Operator を無効にすることで、2 つの Prometheus Operator 間の競合を回避できます。
この場合、すべての Prometheus インスタンスは既存の Prometheus Operator によって管理されます。 Prometheus を正しく動作させるには、Azure Machine Learning 拡張機能で Prometheus Operator を無効にするときに、次のことに注意する必要があります。
- azureml 名前空間の Prometheus が Prometheus Operator によって管理されているかどうかを確認します。 シナリオによっては、Prometheus Operator が特定の名前空間のみを監視するように設定されています。 その場合は、azureml 名前空間が許可リストに含まれることを確認します。 詳しくは、コマンド フラグに関する説明をご覧ください。
- Prometheus Operator で kubelet-service が有効になっているかどうかを確認します。 kubelet-service には、kubelet のすべてのエンドポイントが含まれています。 詳しくは、コマンド フラグに関する説明をご覧ください。 また、kubelet-service にラベル
k8s-app=kubelet
があることを確認する必要もあります。 - 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 Exporter
DCGM-Exporter は、GPU メトリックの収集用として NVIDIA によって推奨されている公式ツールです。 これは、Azure Machine Learning 拡張機能に統合されています。 ただし、既定では、DCGM-Exporter は有効にならず、GPU メトリックは収集されません。 installDcgmExporter
フラグを true
に指定して、有効にすることができます。 NVIDIA の公式ツールであるため、GPU クラスターに既にインストールされている可能性があります。 その場合は、installDcgmExporter
を false
に設定し、DCGM-Exporter を Azure Machine Learning 拡張機能に統合する手順に従うことができます。 もう 1 つ注意すべき点は、DCGM-Exporter を使うと、公開するメトリックをユーザーが構成できることです。 Azure Machine Learning 拡張機能の場合は、DCGM_FI_DEV_GPU_UTIL
、DCGM_FI_DEV_FB_FREE
、DCGM_FI_DEV_FB_USED
メトリックが必ず公開されるようにします。
AzureML 拡張機能と DCGM-Exporter が正常にインストールされていることを確認します。 DCGM-Exporter は、DCGM-Exporter Helm チャートまたは GPU Operator Helm チャートでインストールできます
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
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 Scheduler
クラスターに Volcano スイートが既にインストールされている場合は、installVolcano=false
を設定して、拡張機能が Volcano Scheduler をインストールしないようにできます。 Volcano Scheduler と Volcano Controller は、トレーニング ジョブの送信とスケジュール設定に必要です。
Azure Machine Learning 拡張機能で使われる Volcano Scheduler の構成は次のとおりです。
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 のトレーニング ワークロードが適切に実行されるようにするには、この同じ構成設定を使用する必要があります。また、Volcano のバージョンが 1.6 未満の場合は、Volcano admission で job/validate
Webhook を無効にする必要があります。
クラスター オートスケーラーをサポートする Volcano Scheduler の統合
このスレッドで説明したように、Gang プラグイン はクラスター オートスケーラー (CA) では正常に機能せず、AKS のノード オートスケーラーでも同様です。
設定 installVolcano=true
を使用して Azure Machine Learning 拡張機能に付属する Volcano を使用する場合、拡張機能には、ジョブのデッドロックを防ぐために gang プラグインを構成するスケジューラ構成が既定で存在します。 そのため、AKS クラスターのクラスター オートスケーラー (CA) は、拡張機能によってインストールされた Volcano ではサポートされません。
この場合、AKS クラスター オートスケーラーを正常に動作させるには、拡張機能を更新してこの volcanoScheduler.schedulerConfigMap
パラメーターを構成し、カスタム構成である gang 以外の Volcano スケジューラを指定できます。例:
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
名前空間に上記の構成で configmap ファイルを作成します。 この名前空間は通常、Azure Machine Learning 拡張機能をインストールするときに作成されます。- 拡張機能の構成で
volcanoScheduler.schedulerConfigMap=<configmap name>
を設定して、この configmap を適用します。 また、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>
Note
Gang プラグインが削除されるため、Volcano がジョブをスケジュールするときにデッドロックが発生する可能性があります。
- この状況を回避するために、ジョブ全体で同じインスタンスの種類を使用できます。
Azure Machine Learning 拡張機能によって提供される既定値以外のスケジューラ構成の使用は、完全にはサポートされない場合があります。 慎重に進めてください。
Volcano のバージョンが 1.6 未満の場合は、Volcano の受付で job/validate
Webhook を無効にする必要があります。
Ingress Nginx コントローラー
Azure Machine Learning 拡張機能のインストールには、k8s.io/ingress-nginx
として Ingress Nginx コントローラー クラスが既定で付属しています。 クラスターに Ingress Nginx コントローラーが既にある場合は、インストール エラーを回避するために別のコントローラー クラスを使用する必要があります。
2 つのオプションがあります。
- 既存のコントローラー クラスを
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"
Azure Machine Learning 拡張機能と共にインストールされた Nginx イングレス コントローラーがメモリ不足 (OOM) エラーが原因でクラッシュする
症状:
Azure Machine Learning 拡張機能と共にインストールされた Nginx イングレス コントローラーが、ワークロードがない場合でも、メモリ不足 (OOM) エラーが原因でクラッシュします。 コントローラー ログには、問題を診断するのに役立つ情報は表示されません。
考えられる原因
この問題は、nginx イングレス コントローラーが多数の CPU を持つノードで実行されている場合に発生する可能性があります。 既定では、nginx イングレス コントローラーは CPU の数に応じてワーカー プロセスを生成します。これにより、より多くのリソースが消費され、CPU が多いノードで OOM エラーが発生する可能性があります。 これは GitHub で報告された既知の問題です
解像度
この問題を解決するには、次のことができます。
- パラメーター
nginxIngress.controllerConfig.worker-processes=8
を使用して拡張機能をインストールして、ワーカー プロセスの数を調整します。 - パラメーター
nginxIngress.resources.controller.limits.memory=<new limit>
を使用してメモリ制限を増やします。
ワークロードを効果的に最適化するには、特定のノードの仕様とワークロード要件に従って、これら 2 つのパラメーターを調整してください。