針對 Azure Machine Learning 延伸模組進行疑難排解

在本文中,您將瞭解如何針對 AKS 或已啟用 Arc 的 Kubernetes 中的 Azure 機器學習 擴充功能部署所遇到的常見問題進行疑難解答。

如何安裝 Azure Machine Learning 延伸項目

Azure 機器學習 擴充功能會以 Helm 圖表的形式發行,並由 Helm V3 安裝。 Azure 機器學習 擴充功能的所有元件都會安裝在 命名空間中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 延伸模組使用,您需要等候大約一小時的時間,然後再試一次。 如果該名稱由其他 Helm 圖表使用,您需要使用另一個名稱。 執行 helm list -Aa 以列出叢集中的所有 Helm 圖表。

錯誤:Helm 圖表先前的作業仍在進行中

您需要等候大約一小時的時間,並在未知的作業完成之後再試一次。

錯誤:無法在命名空間 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>"
    

    藉由為資源設定標籤和註釋,這表示 Helm 正在管理資源,並由 Azure Machine Learning 延伸模組所擁有。

  • 當資源也由叢集中的其他元件使用,且無法修改。 請參閱部署 Azure 機器學習 擴充功能,以查看是否有組態設定可停用衝突資源。

延伸項目的 HealthCheck

當安裝失敗且未達到上述任何錯誤訊息時,您可以使用內建健康情況檢查工作來全面檢查擴充功能。 當您嘗試安裝、更新或刪除擴充功能時,Azure 機器學習延伸模組包含一項 HealthCheck 作業,可預先檢查叢集整備程度。 HealthCheck 作業會輸出報告,該報表會儲存在命名空間中名為 arcml-healthcheck 的 configmap 中 azureml 。 報告的錯誤碼和可能解決方案會列在 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 叢集中不支援負載平衡器。 您必須在叢集中設定負載平衡器,或考慮將 設定 inferenceRouterServiceTypenodePortclusterIP
E40002 INSUFFICIENT_NODE 您已啟用 inferenceRouterHA ,您的叢集中至少需要三個節點。 如果您有少於三個節點,請停用HA。
E40003 INTERNAL_LOAD_BALANCER_NOT_SUPPORT 目前,只有 AKS 支援內部負載平衡器,而我們僅支援 azure 類型。 如果您沒有 AKS 叢集,請勿設定 internalLoadBalancerProvider
E40007 INVALID_SSL_SETTING SSL 金鑰或憑證無效。 CNAME 應該與憑證相容。
E45002 PROMETHEUS_CONFLICT 安裝的 Prometheus 運算子與現有的 Prometheus 運算符衝突。 如需詳細資訊,請參閱 Prometheus 運算符
E45003 BAD_NETWORK_CONNECTIVITY 您需要符合 網路需求
E45004 AZUREML_FE_ROLE_CONFLICT 舊版 AKS 不支援 Azure 機器學習 擴充功能。 若要安裝 Azure 機器學習 擴充功能,您必須刪除舊版 azureml-fe 元件
E45005 AZUREML_FE_DEPLOYMENT_CONFLICT 舊版 AKS 不支援 Azure 機器學習 擴充功能。 若要安裝 Azure 機器學習 擴充功能,您必須執行此表單下方的命令,以刪除舊版 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 機器學習 擴充功能會使用一些 開放原始碼元件,包括 Prometheus 操作員、火山排程器和 DCGM 導出工具。 如果 Kubernetes 叢集已安裝其中一些,您可以閱讀下列各節,將現有的元件與 Azure 機器學習 擴充功能整合。

Prometheus 運算符

Prometheus 運算符是 開放原始碼 架構,可協助在 kubernetes 中建置計量監視系統。 Azure 機器學習 擴充功能也會利用 Prometheus 運算符來協助監視作業的資源使用率。

如果叢集已由其他服務安裝 Prometheus 運算符,您可以指定installPromOp=false停用 Azure 機器學習 擴充功能中的 Prometheus 運算符,以避免兩個 Prometheus 運算符之間發生衝突。 在此情況下,現有的 prometheus 運算子會管理所有 Prometheus 實例。 若要確定 Prometheus 運作正常,當您在 Azure 機器學習 擴充功能中停用 prometheus 運算符時,必須注意下列事項。

  1. 檢查 azureml 命名空間中的 prometheus 是否由 Prometheus 運算元管理。 在某些情況下,prometheus 運算符會設定為只監視某些特定命名空間。 如果是,請確定 azureml 命名空間位於allowlist中。 如需詳細資訊,請參閱 命令旗標
  2. 檢查 prometheus 運算符中是否已啟用 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 匯出工具

Dcgm-exporter 是 NVIDIA 針對收集 GPU 計量所建議的官方工具。 我們已將其整合至 Azure 機器學習 擴充功能。 但是,根據預設,不會啟用dcgm-exporter,而且不會收集 GPU 計量。 您可以指定要 installDcgmExporter 啟用的旗標 true 。 因為它是 NVIDIA 的官方工具,您可能已在 GPU 叢集中安裝它。 若是如此,您可以設定 installDcgmExporterfalse ,並遵循將dcgm-匯出工具整合到 Azure 機器學習 擴充功能的步驟。 另一件事要注意的是,dcgm-exporter 可讓用戶設定要公開的計量。 針對 Azure 機器學習 擴充功能,請確定 DCGM_FI_DEV_GPU_UTIL已公開 、 DCGM_FI_DEV_FB_FREEDCGM_FI_DEV_FB_USED 計量。

  1. 請確定您已成功安裝 Aureml 擴充功能和 dcgm-匯出工具。 Dcgm 導出者可以由 Dcgm-exporter helm 圖表Gpu 運算符 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. 設定 ServiceMonitor,將 dcgm-exporter 服務公開至 Azure 機器學習 擴充功能。 執行下列命令,並在幾分鐘內生效。

    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
    

火山排程器

如果您的叢集已安裝火山套件,您可以設定 installVolcano=false,因此延伸模組不會安裝火山排程器。 訓練作業提交和排程需要火山排程器和火山控制站。

Azure 機器學習 擴充功能所使用的火山排程器設定為:

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

您必須使用相同的組態設定,而且如果您的火山版本低於 1.6,則必須停用job/validate火山許可中的 Webhook,讓 Azure 機器學習 定型工作負載可以正常執行。

火山排程器整合支援叢集自動調整程式

如此 線程 中所討論,幫 派外掛程式 不適用於叢集自動調整程式(CA),也不適用於 AKS 中的節點自動調整程式。

如果您使用 Azure 機器學習 擴充installVolcano=true功能隨附的火山,則擴充功能預設會設定排程器組態,以設定幫派外掛程式以防止作業死結。 因此,AKS 叢集中的叢集自動調整程式(CA)不支援由延伸模塊安裝的火山。

在此情況下,如果您偏好 AKS 叢集自動調整程式可以正常運作,您可以透過更新擴充功能來設定此參數volcanoScheduler.schedulerConfigMap,併為其指定無幫派火山排程器的自定義設定,例如:

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 機器學習 擴充功能時,通常會建立此命名空間。
  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
    

注意

由於移除幫派外掛程式,因此火山排程作業時可能發生死結。

  • 若要避免這種情況,您可以在 作業之間使用相同的實例類型。

請注意,如果您的火山版本低於 1.6,則必須在火山許可中停用 job/validate Webhook。

輸入 Nginx 控制器

Azure 機器學習 擴充功能安裝預設隨附輸入 nginx 控制器類別k8s.io/ingress-nginx。 如果您的叢集中已經有輸入 nginx 控制器,則必須使用不同的控制器類別來避免安裝失敗。

您有兩個選擇:

  • 將現有的控制器類別變更為 以外的 k8s.io/ingress-nginx專案。
  • 遵循下列範例,使用與您不同的自定義控制器類別,建立或更新我們的 Azure 機器學習 擴充功能。

例如,若要使用自定義控制器類別建立擴充功能:

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 機器學習 擴充功能一起安裝的 Nginx 輸入控制器因為記憶體不足(OOM) 錯誤而當機

徵兆

與 Azure 機器學習 擴充功能一起安裝的 nginx 輸入控制器會因為記憶體不足 (OOM) 錯誤而當機,即使沒有工作負載也一致。 控制器記錄不會顯示診斷問題的任何實用資訊。

可能的原因

如果 nginx 輸入控制器在具有許多 CPU 的節點上執行,就可能發生此問題。 根據預設,nginx 輸入控制器會根據 CPU 數目繁衍背景工作進程,這可能會耗用更多資源,並在具有更多 CPU 的節點上造成 OOM 錯誤。 這是 GitHub 上回報的已知問題

解決方法

若要解決此問題,您可以:

  • 使用 參數 nginxIngress.controllerConfig.worker-processes=8安裝擴充功能,以調整背景工作進程數目。
  • 使用 參數 nginxIngress.resources.controller.limits.memory=<new limit>來增加記憶體限制。

請務必根據特定的節點規格和工作負載需求來調整這兩個參數,以有效地優化工作負載。

下一步