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-installpre-rollbackpre-upgradepre-delete という複数の部分で構成されます。

  • 拡張機能のインストールが失敗する場合は、pre-installpre-delete を調べる必要があります。
  • 拡張機能の更新が失敗する場合は、pre-upgradepre-rollback を調べる必要があります。
  • 拡張機能の削除が失敗する場合は、pre-delete を調べる必要があります。

サポートを要求するときは、次のコマンドを実行して healthcheck.logs ファイルをお送りくださることをお勧めします。そうすることで、問題の特定が容易になることがあります。

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 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 を無効にするときに、次のことに注意する必要があります。

  1. azureml 名前空間の Prometheus が Prometheus Operator によって管理されているかどうかを確認します。 シナリオによっては、Prometheus Operator が特定の名前空間のみを監視するように設定されています。 その場合は、azureml 名前空間が許可リストに含まれることを確認します。 詳しくは、コマンド フラグに関する説明をご覧ください。
  2. Prometheus Operator で 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 Exporter

DCGM-Exporter は、GPU メトリックの収集用として NVIDIA によって推奨されている公式ツールです。 これは、Azure Machine Learning 拡張機能に統合されています。 ただし、既定では、DCGM-Exporter は有効にならず、GPU メトリックは収集されません。 installDcgmExporter フラグを true に指定して、有効にすることができます。 NVIDIA の公式ツールであるため、GPU クラスターに既にインストールされている可能性があります。 その場合は、installDcgmExporterfalse に設定し、DCGM-Exporter を Azure Machine Learning 拡張機能に統合する手順に従うことができます。 もう 1 つ注意すべき点は、DCGM-Exporter を使うと、公開するメトリックをユーザーが構成できることです。 Azure Machine Learning 拡張機能の場合は、DCGM_FI_DEV_GPU_UTILDCGM_FI_DEV_FB_FREEDCGM_FI_DEV_FB_USED メトリックが必ず公開されるようにします。

  1. AzureML 拡張機能と DCGM-Exporter が正常にインストールされていることを確認します。 DCGM-Exporter は、DCGM-Exporter Helm チャートまたは GPU Operator Helm チャートでインストールできます

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

Note

Gang プラグインが削除されるため、Volcano がジョブをスケジュールするときにデッドロックが発生する可能性があります。

  • この状況を回避するために、ジョブ全体で同じインスタンスの種類を使用できます。

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 つのパラメーターを調整してください。

次のステップ