分享方式:


為 Azure Machine Learning 設定 Kubernetes 叢集的參考

本文包含使用 Azure 機器學習 設定 Kubernetes 的參考資訊。

支援的 Kubernetes 版本和區域

  • 安裝 Azure 機器學習 延伸模組的 Kubernetes 叢集具有 “N-2” 的版本支持視窗,其與 Azure Kubernetes Service (AKS) 版本支持原則一致,其中 'N' 是 Azure Kubernetes Service 的最新 GA 次要版本。

    • 例如,如果 AKS 今天引進 1.20.a,則支援 1.20.a、1.20.b、1.19.c、1.19.d、1.18.e 和 1.18.f 版。

    • 如果客戶執行不支援的 Kubernetes 版本,則會要求在要求叢集支援時升級。 Azure 機器學習 擴充功能支持原則並未涵蓋執行不支援 Kubernetes 版本的叢集。

  • Azure 機器學習 擴充功能區域可用性:

    • Azure 機器學習 擴充功能可以部署至已啟用 AKS 或已啟用 Azure Arc 的 Kubernetes,位於已啟用 Azure Arc 的 Kubernetes 區域支援所列的支持區域中。

當您部署 Azure 機器學習 擴充功能時,某些相關服務會部署到適用於 Azure 的 Kubernetes 叢集 機器學習。 下表列出 相關服務及其叢集中的資源使用量

部署/精靈集 複製品# 訓練 推斷 CPU 要求(m) CPU 限制(m) 記憶體要求(Mi) 記憶體限制(Mi)
metrics-controller-manager 1 10 100 20 300
Prometheus 運算子 1 100 400 128 512
普羅 米修斯 1 100 1000 512 4096
kube-state-metrics 1 10 100 32 256
gateway 1 50 500 256 2048
fluent-bit 每個節點1個 10 200 100 300
inference-operator-controller-manager 1 N/A 100 1000 128 1024
amlarc-identity-controller 1 N/A 200 1000 200 1024
amlarc-identity-proxy 1 N/A 200 1000 200 1024
azureml-ingress-nginx-controller 1 N/A 100 1000 64 512
azureml-fe-v2 1 (用於測試目的)

3 (生產用途)
N/A 900 2000 800 1200
online-deployment 每個部署1個 使用者建立 N/A <user-define> <user-define> <user-define> <user-define>
online-deployment/identity-sidecar 每個部署1個 N/A 10 50 100 100
aml-operator 1 N/A 20 1020 124 2168
volcano-admission 1 N/A 10 100 64 256
火山控制器 1 N/A 50 500 128 512
火山-施德拉爾 1 N/A 50 500 128 512

排除您自己的部署/Pod, 最低系統資源需求 總數如下:

案例 已啟用推斷 已啟用訓練 CPU 要求(m) CPU 限制(m) 記憶體要求(Mi) 記憶體限制(Mi) 節點計數 建議的 VM 大小下限 對應的 AKS VM SKU
針對測試 N/A 1780 8300 2440 12296 1 個節點 2 個 vCPU、7 GiB 記憶體、6400 IOPS、1500Mbps BW DS2v2
針對測試 N/A 410 4420 1492 10960 1 個節點 2 個 vCPU、7 GiB 記憶體、6400 IOPS、1500Mbps BW DS2v2
針對測試 1910 10420 2884 15744 1 個節點 4 vCPU、14 GiB 記憶體、12800 IOPS、1500Mbps BW DS3v2
針對生產環境 N/A 3600 12700 4240 15296 3 節點(秒) 4 vCPU、14 GiB 記憶體、12800 IOPS、1500Mbps BW DS3v2
針對生產環境 N/A 410 4420 1492 10960 1 個節點(秒) 8 vCPU、28GiB Memroy、25600 IOPS、6000Mbps BW DS4v2
針對生產環境 3730 14820 4684 18744 3 節點(秒) 4 vCPU、14 GiB 記憶體、12800 IOPS、1500Mbps BW DS4v2

注意

  • 為了 進行測試,您應該參考資源 要求
  • 為了 生產目的,您應該參考資源 限制

重要

以下是一些其他參考考慮:

  • 如需 較高的網路頻寬和更佳的磁碟 I/O 效能,我們建議使用較大的 SKU。
    • DV2/DSv2 為例,使用大型 SKU 可以減少提取映射的時間,以提升網路/記憶體效能。
    • 如需 AKS 保留的詳細資訊,請參閱 AKS 保留
  • 如果您使用 AKS 叢集,您可能需要考慮 AKS 中容器映射的大小限制,您可以在 AKS 容器映射大小限制中找到更多資訊。

ARO 或 OCP 叢集的必要條件

停用安全性增強型 Linux (SELinux)

已啟用 SELinux 的機器不支援 Azure 機器學習 數據集(Azure 機器學習 定型作業中使用的 SDK v1 功能)。 因此,您必須在所有背景工作角色上停用selinux,才能使用 Azure 機器學習 數據集。

ARO 和 OCP 的特殊許可權設定

針對 ARO 或 OCP 叢集上的 Azure 機器學習 擴充功能部署,授與對 Azure 機器學習 服務帳戶的特殊許可權存取權、執行oc edit scc privileged命令,並在 “users:

  • system:serviceaccount:azure-arc:azure-arc-kube-aad-proxy-sa
  • system:serviceaccount:azureml:{EXTENSION-NAME}-kube-state-metrics
  • system:serviceaccount:azureml:prom-admission
  • system:serviceaccount:azureml:default
  • system:serviceaccount:azureml:prom-operator
  • system:serviceaccount:azureml:load-amlarc-selinux-policy-sa
  • system:serviceaccount:azureml:azureml-fe-v2
  • system:serviceaccount:azureml:prom-prometheus
  • system:serviceaccount:{KUBERNETES-COMPUTE-NAMESPACE}:default
  • system:serviceaccount:azureml:azureml-ingress-nginx
  • system:serviceaccount:azureml:azureml-ingress-nginx-admission

注意

  • {EXTENSION-NAME}:是使用 az k8s-extension create --name CLI 命令指定的延伸模組名稱。
  • {KUBERNETES-COMPUTE-NAMESPACE}:是將計算附加至 Azure 機器學習 工作區時所指定的 Kubernetes 計算命名空間。 如果 KUBERNETES-COMPUTE-NAMESPACEdefault,則略過設定system:serviceaccount:{KUBERNETES-COMPUTE-NAMESPACE}:default

收集的記錄詳細數據

叢集中有關 Azure 機器學習 工作負載的一些記錄會透過擴充元件收集,例如狀態、計量、生命週期等。下列清單顯示收集的所有記錄詳細數據,包括收集的記錄類型,以及傳送至或儲存的記錄類型。

Pod 資源描述 詳細記錄資訊
amlarc-identity-controller 透過受控識別要求及更新 Azure Blob/Azure Container Registry 權杖。 只有在安裝擴充功能時設定時才使用 enableInference=true 。 它有追蹤記錄,以取得端點的身分識別,以向 Azure 機器學習 服務進行驗證。
amlarc-identity-proxy 透過受控識別要求及更新 Azure Blob/Azure Container Registry 權杖。 只有在安裝擴充功能時設定時才使用 enableInference=true 。 它有追蹤記錄,可取得叢集身分識別以向 Azure 機器學習 服務進行驗證的狀態。
aml-operator 管理定型工作的生命週期。 記錄包含叢集中的 Azure 機器學習 定型作業 Pod 狀態。
azureml-fe-v2 將傳入推斷要求路由至已部署服務的前端元件。 存取要求層級的記錄,包括要求標識符、開始時間、回應時間、錯誤詳細數據和要求延遲的持續時間。 服務元數據變更的追蹤記錄、執行狀況良好的服務狀態等等,以供偵錯之用。
gateway 閘道用於通訊及來回傳送資料。 追蹤從 Azure 機器學習 服務到叢集的要求記錄。
healthcheck -- 記錄包含azureml命名空間資源 (Azure 機器學習 擴充功能) 狀態,以診斷擴充功能無法運作的情況。
inference-operator-controller-manager 管理推斷端點的生命週期。 記錄包含 Azure 機器學習 推斷端點和叢集中的部署 Pod 狀態。
metrics-controller-manager 管理 Prometheus 的設定。 追蹤記錄,以取得上傳定型作業的狀態,以及CPU使用率和記憶體使用率的推斷部署計量。
轉寄伺服器 轉接伺服器只有在已連線的叢集中才需要,而且不會安裝在 AKS 叢集中。 轉送伺服器可與 Azure 轉送搭配運作來與雲端服務通訊。 記錄包含來自 Azure 轉播的要求層級資訊。

Azure 機器學習 作業會與自定義數據記憶體連線

永續性磁碟區 (PV) 和永續性磁碟區宣告 (PV) 是 Kubernetes 概念,可讓使用者提供及取用各種記憶體資源。

  1. 建立 PV,以 NFS 為例
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv 
spec:
  capacity:
    storage: 1Gi 
  accessModes:
    - ReadWriteMany 
  persistentVolumeReclaimPolicy: Retain
  storageClassName: ""
  nfs: 
    path: /share/nfs
    server: 20.98.110.84 
    readOnly: false
  1. 在具有 ML 工作負載的相同 Kubernetes 命名空間中建立PVC。 在 中metadata,您必須新增標籤,Azure 機器學習 才能辨識標籤ml.azure.com/pvc: "true",並新增註釋ml.azure.com/mountpath: <mount path>來設定掛接路徑。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc  
  namespace: default
  labels:
    ml.azure.com/pvc: "true"
  annotations:
    ml.azure.com/mountpath: "/mnt/nfs"
spec:
  storageClassName: ""
  accessModes:
  - ReadWriteMany      
  resources:
     requests:
       storage: 1Gi

重要

  • 只有命令作業/元件、hyperdrive 作業/元件和批次部署支援來自PVC的自定義數據記憶體。 > * 即時在線端點、AutoML 作業和 PRS 作業不支援來自PVC的自定義資料記憶體。
  • 此外,只有與PVC(s) 相同 Kubernetes 命名空間中的 Pod 才會掛接磁碟區。 資料科學家能夠存取 mount path 作業中PVC批注中指定的 。 AutoML 作業和 Prs 作業將無法存取PVC(s)。

支援的 Azure Machine Learning 污點和容差

Taint 和 Toleration 是 Kubernetes 概念,可共同運作,以確保 Pod 不會排程到不適當的節點上。

與 Azure 機器學習 整合的 Kubernetes 叢集(包括 AKS 和 Arc Kubernetes 叢集)現在支援特定的 Azure 機器學習 污點和容忍,允許使用者在 Azure 機器學習 專用節點上新增特定的 Azure 機器學習 污點,以防止非 Azure 機器學習 工作負載排程到這些專用節點上節點。

我們僅支援將 amlarc 特定污點放在您的節點上,其定義如下:

污點 機碼 影響 描述
amlarc 整體 ml.azure.com/amlarc true NoScheduleNoExecutePreferNoSchedule 所有 Azure 機器學習 工作負載,包括擴充系統服務 Pod 和機器學習工作負載 Pod 都會容許這種amlarc overall污點。
amlarc 系統 ml.azure.com/amlarc-system true NoScheduleNoExecutePreferNoSchedule 只有 Azure 機器學習 擴充系統服務 Pod 可以容忍此amlarc system污點。
amlarc 工作負載 ml.azure.com/amlarc-workload true NoScheduleNoExecutePreferNoSchedule 只有機器學習工作負載 Pod 可以容忍這種 amlarc workload 污點。
amlarc 資源群組 ml.azure.com/resource-group <資源組名> NoScheduleNoExecutePreferNoSchedule 只有從特定資源群組建立的機器學習工作負載 Pod 才會容許此 amlarc resource group 污點。
amlarc 工作區 ml.azure.com/workspace <工作區名稱> NoScheduleNoExecutePreferNoSchedule 只有從特定工作區建立的機器學習工作負載 Pod 會容許此 amlarc workspace 污點。
amlarc 計算 ml.azure.com/compute <計算名稱> NoScheduleNoExecutePreferNoSchedule 只有使用特定計算目標建立的機器學習工作負載 Pod 才會容許這種 amlarc compute 污點。

提示

  1. 針對 Azure Kubernetes Service(AKS),您可以遵循 Azure Kubernetes Service (AKS) 中進階排程器功能的最佳做法中的範例,將污點套用至節點集區。
  2. 針對 Arc Kubernetes 叢集,例如內部部署 Kubernetes 叢集,您可以使用 kubectl taint 命令將污點新增至節點。 如需更多範例,請參閱 Kubernetes 檔

最佳作法

根據 Azure 機器學習 專用節點的排程需求,您可以新增多個 amlarc 特定的污點,以限制哪些 Azure 機器學習 工作負載可以在節點上執行。 我們列出使用 amlarc 污點的最佳作法:

  • 若要防止非 Azure 機器學習 工作負載在 Azure 機器學習 專用節點/節點集區上執行,您可以只將污點新增aml overall至這些節點。
  • 若要防止非系統 Pod 在 Azure 機器學習 專用節點/節點集區上執行,您必須新增下列污點:
    • amlarc overall 污點
    • amlarc system 污點
  • 若要防止非 ml 工作負載在 Azure 機器學習 專用節點/節點集區上執行,您必須新增下列污點:
    • amlarc overall 污點
    • amlarc workloads 污點
  • 若要防止未從工作區 X 建立的工作負載在 Azure 機器學習 專用節點/節點集區上執行,您必須新增下列污點:
    • amlarc overall 污點
    • amlarc resource group (has this <workspace X>) 污點
    • amlarc <workspace X> 污點
  • 若要防止計算目標 X建立的工作負載在 Azure 機器學習 專用節點/節點集區上執行,您必須新增下列污點:
    • amlarc overall 污點
    • amlarc resource group (has this <workspace X>) 污點
    • amlarc workspace (has this <compute X>) 污點
    • amlarc <compute X> 污點

透過 HTTP 或 HTTPS 整合其他輸入控制器與 Azure 機器學習 擴充功能

除了預設的 Azure 機器學習 推斷負載平衡器 azureml-fe 之外,您也可以透過 HTTP 或 HTTPS 將其他負載平衡器與 Azure 機器學習 擴充功能整合。

本教學課程有助於說明如何整合 Nginx 輸入控制器Azure 應用程式閘道

必要條件

  • 使用 和 allowInsecureConnections=True部署 Azure 機器學習 擴充功能inferenceRouterServiceType=ClusterIP,讓 Nginx 輸入控制器可以自行處理 TLS 終止,而不是在服務透過 HTTPS 公開時將其移交給 azureml-fe
  • 若要與 Nginx 輸入控制器整合,您需要搭配 Nginx 輸入控制器設定 Kubernetes 叢集。
  • 若要與 Azure 應用程式閘道 整合,您需要具有 Azure 應用程式閘道 輸入控制器的 Kubernetes 叢集設定。
    • Greenfield 部署:如果您從頭開始,請參閱這些指示。
    • Brownfield 部署:如果您有現有的 AKS 叢集和 應用程式閘道,請參閱這些指示。
  • 如果您想要在此應用程式上使用 HTTPS,則需要 x509 憑證及其私鑰。

透過 HTTP 公開服務

為了公開 azureml-fe,我們將使用下列輸入資源:

# Nginx Ingress Controller example
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: azureml-fe
  namespace: azureml
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /
        backend:
          service:
            name: azureml-fe
            port:
              number: 80
        pathType: Prefix

此輸入會將 azureml-fe 服務和選取的部署公開為 Nginx 輸入控制器的預設後端。

# Azure Application Gateway example
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: azureml-fe
  namespace: azureml
spec:
  ingressClassName: azure-application-gateway
  rules:
  - http:
      paths:
      - path: /
        backend:
          service:
            name: azureml-fe
            port:
              number: 80
        pathType: Prefix

此輸入會將azureml-fe服務和選取的部署公開為 應用程式閘道的預設後端。

將上述輸入資源儲存為 ing-azureml-fe.yaml

  1. 執行下列內容來部署 ing-azureml-fe.yaml

    kubectl apply -f ing-azureml-fe.yaml
    
  2. 檢查輸入控制器的記錄以取得部署狀態。

  3. 現在,azureml-fe 應用程式應該可供使用。 您可以造訪下列項目來檢查:

    • Nginx 輸入控制器:Nginx 輸入控制器的公用 LoadBalancer 位址
    • Azure 應用程式閘道:應用程式閘道 的公用位址。
  4. 建立推斷作業並叫用。

    注意

    在叫用之前,將 scoring_uri 中的ip取代為 Nginx 輸入控制器的公用 LoadBalancer 位址。

透過 HTTPS 公開服務

  1. 部署輸入之前,您必須建立 kubernetes 祕密來裝載憑證和私密金鑰。 您可以執行下列內容來建立 kubernetes 祕密

    kubectl create secret tls <ingress-secret-name> -n azureml --key <path-to-key> --cert <path-to-cert>
    
  2. 定義下列輸入。 在輸入中,指定 secretName 區段中的祕密名稱。

    # Nginx Ingress Controller example
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: azureml-fe
      namespace: azureml
    spec:
      ingressClassName: nginx
      tls:
      - hosts:
        - <domain>
        secretName: <ingress-secret-name>
      rules:
      - host: <domain>
        http:
          paths:
          - path: /
            backend:
              service:
                name: azureml-fe
                port:
                  number: 80
            pathType: Prefix
    
    # Azure Application Gateway example
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: azureml-fe
      namespace: azureml
    spec:
      ingressClassName: azure-application-gateway
      tls:
      - hosts:
        - <domain>
        secretName: <ingress-secret-name>
      rules:
      - host: <domain>
        http:
          paths:
          - path: /
            backend:
              service:
                name: azureml-fe
                port:
                  number: 80
            pathType: Prefix
    

    注意

    將上述輸入資源中的 和 <ingress-secret-name> 取代<domain>為指向 Nginx 輸入控制器/應用程式閘道 和秘密名稱之 LoadBalancer 的網域。 將上述輸入資源儲存在檔案名稱 ing-azureml-fe-tls.yaml 中。

  3. 執行 來部署 ing-azureml-fe-tls.yaml

    kubectl apply -f ing-azureml-fe-tls.yaml
    
  4. 檢查輸入控制器的記錄以取得部署狀態。

  5. 現在應用程式 azureml-fe 可在 HTTPS 上使用。 您可以造訪 Nginx 輸入控制器的公用 LoadBalancer 位址來檢查此情況。

  6. 建立推斷作業並叫用。

    注意

    使用指向 Nginx 輸入控制器的 LoadBalancer 或叫用之前 應用程式閘道 的 https 和網域取代 scoring_uri 中的通訊協定和 IP。

使用 ARM 範本部署延伸模組

受控叢集上的擴充功能可以使用ARM範本進行部署。 您可以從 deployextension.json 找到範例範本,並搭配示範參數檔案deployextension.parameters.json

若要使用範例部署範本,請使用正確的值編輯參數檔案,然後執行下列命令:

az deployment group create --name <ARM deployment name> --resource-group <resource group name> --template-file deployextension.json --parameters deployextension.parameters.json

如需如何使用ARM範本的詳細資訊,請參閱 ARM樣本檔

AzuremML 擴充功能版本資訊

注意

新功能會在兩周的行事曆上發行。

Date 版本 版本描述
2024年9月26日 1.1.64 已修正弱點。
2023年11月21日 1.1.39 已修正弱點。 精簡的錯誤訊息。 轉寄伺服器 API 的穩定性增加。
2023 年 11 月 1 日 1.1.37 更新數據平面 Envoy 版本。
2023 年 10 月 11 日 1.1.35 修正易受攻擊的映像。 錯誤修正。
2023 年 8 月 25 日 1.1.34 修正易受攻擊的映像。 傳回更詳細的身分識別錯誤。 錯誤修正。
2023 年 7 月 18 日 1.1.29 新增識別運算子錯誤。 錯誤修正。
2023年6月4日 1.1.28 改善自動調整程式以處理多個節點集區。 錯誤修正。
2023年4月18日 1.1.26 錯誤修正和弱點修正。
2023年3月27日 1.1.25 新增 Azure 機器學習 作業節流。 當 SSH 設定失敗時,訓練作業的快速失敗。 將 Prometheus 的刮傷間隔縮減為 30 秒。 改善推斷的錯誤訊息。 修正易受攻擊的映像。
2023年3月7日 1.1.23 將預設實例類型變更為使用 2Gi 記憶體。 更新計分費的計量組態,以新增 15s scrape_interval。 新增 mdc sidecar 的資源規格。 修正易受攻擊的映像。 錯誤修正。
2023 年 2 月 14 日 1.1.21 錯誤修正。
2023年2月7日 1.1.19 改善推斷的錯誤傳回訊息。 更新預設實例類型以使用 2Gi 記憶體限制。 進行叢集健康情況檢查,以取得 Pod 健全狀況、資源配額、Kubernetes 版本和擴充功能版本。 錯誤修正
2022年12月27日 1.1.17 將 Fluent-bit 從 DaemonSet 移至 Sidecars。 新增 MDC 支援。 精簡錯誤訊息。 支援叢集模式 (windows, linux) 作業。 錯誤修正
2022年11月29日 1.1.16 新增CRD的實例類型驗證。 支援容錯。 縮短 SVC 名稱。 工作負載核心小時。 多個 Bug 修正和改善。
2022 年 9 月 13 日 1.1.10 錯誤修正。
2022 年 8 月 29 日 1.1.9 改善健康情況檢查邏輯。 錯誤修正。
2022年6月23日 1.1.6 錯誤修正。
2022年6月15日 1.1.5 已更新訓練,以使用新的通用運行時間來執行作業。 已移除 AKS 擴充功能的 Azure 轉譯使用量。 已從擴充功能中移除服務總線使用量。 已更新安全性內容使用方式。 已將 azureml-fe 推斷更新為 v2。 已更新為使用火山作為訓練工作排程器。 錯誤修正。
2021年10月14日 1.0.37 AMLArc 訓練作業中的PV/PV磁碟區掛接支援。
2021年9月16日 1.0.29 新的區域可供使用,WestUS、CentralUS、NorthCentralUS、KoreaCentral。 作業佇列可擴充性。 請參閱 Azure 機器學習 Workspace Studio 中的作業佇列詳細數據。 自動終止原則。 在 ScriptRunConfig 中支援max_run_duration_seconds。 如果執行時間超過設定值,系統就會嘗試自動取消執行。 叢集自動調整支援的效能改善。 從內部部署容器登錄部署Arc代理程式和ML擴充功能。
2021 年 8 月 24 日 1.0.28 作業 YAML 支援計算實例類型。 將受控識別指派給AMLArc計算。
2021 年 8 月 10 日 1.0.20 新的 Kubernetes 散發支援 K3S - 輕量型 Kubernetes。 將 Azure 機器學習 擴充功能部署至 AKS 叢集,而不需透過 Azure Arc 連線。透過 Python SDK 自動化 機器學習 (AutoML)。 使用 2.0 CLI 將 Kubernetes 叢集連結至 Azure 機器學習 工作區。 優化 Azure 機器學習 擴充元件 CPU/記憶體資源使用率。
2021 年 7 月 2 日 1.0.13 新的 Kubernetes 散發套件支援、OpenShift Kubernetes 和 GKE (Google Kubernetes Engine)。 自動調整支援。 如果使用者管理的 Kubernetes 叢集啟用自動調整,叢集就會根據作用中執行和部署的數量自動相應放大或相應縮小。 作業啟動器上的效能改善,可縮短作業運行時間,以大幅縮短作業運行時間。