為 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 |
注意
- 為了 進行測試,您應該參考資源 要求。
- 為了 生產目的,您應該參考資源 限制。
重要
以下是一些其他參考考慮:
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-NAMESPACE
是default
,則略過設定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 概念,可讓使用者提供及取用各種記憶體資源。
- 建立 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
- 在具有 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 | NoSchedule 、NoExecute 或 PreferNoSchedule |
所有 Azure 機器學習 工作負載,包括擴充系統服務 Pod 和機器學習工作負載 Pod 都會容許這種amlarc overall 污點。 |
amlarc 系統 | ml.azure.com/amlarc-system | true | NoSchedule 、NoExecute 或 PreferNoSchedule |
只有 Azure 機器學習 擴充系統服務 Pod 可以容忍此amlarc system 污點。 |
amlarc 工作負載 | ml.azure.com/amlarc-workload | true | NoSchedule 、NoExecute 或 PreferNoSchedule |
只有機器學習工作負載 Pod 可以容忍這種 amlarc workload 污點。 |
amlarc 資源群組 | ml.azure.com/resource-group | <資源組名> | NoSchedule 、NoExecute 或 PreferNoSchedule |
只有從特定資源群組建立的機器學習工作負載 Pod 才會容許此 amlarc resource group 污點。 |
amlarc 工作區 | ml.azure.com/workspace | <工作區名稱> | NoSchedule 、NoExecute 或 PreferNoSchedule |
只有從特定工作區建立的機器學習工作負載 Pod 會容許此 amlarc workspace 污點。 |
amlarc 計算 | ml.azure.com/compute | <計算名稱> | NoSchedule 、NoExecute 或 PreferNoSchedule |
只有使用特定計算目標建立的機器學習工作負載 Pod 才會容許這種 amlarc compute 污點。 |
提示
- 針對 Azure Kubernetes Service(AKS),您可以遵循 Azure Kubernetes Service (AKS) 中進階排程器功能的最佳做法中的範例,將污點套用至節點集區。
- 針對 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
。
執行下列內容來部署
ing-azureml-fe.yaml
:kubectl apply -f ing-azureml-fe.yaml
檢查輸入控制器的記錄以取得部署狀態。
現在,
azureml-fe
應用程式應該可供使用。 您可以造訪下列項目來檢查:- Nginx 輸入控制器:Nginx 輸入控制器的公用 LoadBalancer 位址
- Azure 應用程式閘道:應用程式閘道 的公用位址。
建立推斷作業並叫用。
注意
在叫用之前,將 scoring_uri 中的ip取代為 Nginx 輸入控制器的公用 LoadBalancer 位址。
透過 HTTPS 公開服務
部署輸入之前,您必須建立 kubernetes 祕密來裝載憑證和私密金鑰。 您可以執行下列內容來建立 kubernetes 祕密
kubectl create secret tls <ingress-secret-name> -n azureml --key <path-to-key> --cert <path-to-cert>
定義下列輸入。 在輸入中,指定
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
中。執行 來部署 ing-azureml-fe-tls.yaml
kubectl apply -f ing-azureml-fe-tls.yaml
檢查輸入控制器的記錄以取得部署狀態。
現在應用程式
azureml-fe
可在 HTTPS 上使用。 您可以造訪 Nginx 輸入控制器的公用 LoadBalancer 位址來檢查此情況。建立推斷作業並叫用。
注意
使用指向 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 叢集啟用自動調整,叢集就會根據作用中執行和部署的數量自動相應放大或相應縮小。 作業啟動器上的效能改善,可縮短作業運行時間,以大幅縮短作業運行時間。 |