建立和管理執行個體類型以有效利用計算資源
執行個體類型是 Azure Machine Learning 概念,可針對定型和推斷工作負載,鎖定特定類型的計算節點。 例如,在 Azure 虛擬機器中,執行個體類型為 STANDARD_D2_V3
。 本文說明如何建立和管理計算需求的執行個體類型。
在 Kubernetes 叢集中,執行個體類型會以隨著 Azure Machine Learning 延伸模組安裝的自訂資源定義 (CRD) 表示。 Azure Machine Learning 延伸模組中的兩個元素代表執行個體類型:
- 使用 nodeSelector 來指定應該執行 Pod 的節點。 節點必須有對應的標籤。
- 在 [資源] 區段中,您可以設定 Pod 的計算資源 (CPU、記憶體和 NVIDIA GPU)。
如果您在部署 Azure Machine Learning 延伸模組時指定 nodeSelector 欄位,nodeSelector
欄位將會套用至所有執行個體類型。 這表示:
- 針對您建立的每個執行個體類型,指定的
nodeSelector
欄位應該是延伸模組指定的nodeSelector
欄位的子集。 - 如果您使用執行個體類型搭配
nodeSelector
,工作負載將會在符合延伸模組指定的nodeSelector
欄位和執行個體類型指定的nodeSelector
欄位的任何節點上執行。 - 如果您使用不含
nodeSelector
欄位的執行個體類型,工作負載將會在符合延伸模組指定nodeSelector
欄位的任何節點上執行。
選取預設執行個體類型
根據預設,當您將 Kubernetes 叢集連結至 Azure Machine Learning 工作區時,會建立稱為 defaultinstancetype
的執行個體類型。 以下是定義:
resources:
requests:
cpu: "100m"
memory: "2Gi"
limits:
cpu: "2"
memory: "2Gi"
nvidia.com/gpu: null
如果您未套用 nodeSelector
欄位,則可以在任何節點上排程 Pod。 針對工作負載的 Pod 指派 0.1 個 CPU 核心、2 GB 的記憶體和 0 個 GPU 的預設資源用於要求。 工作負載 Pod 使用的資源限制為 2 個 CPU 核心和 8 GB 的記憶體。
預設執行個體類型刻意使用很少資源。 為了確保所有機器學習工作負載都以適當的資源 (例如 GPU 資源) 執行,強烈建議您建立自訂執行個體類型。
請記住關於預設執行個體類型的下列要點:
- 當您執行命令
kubectl get instancetype
時,defaultinstancetype
不會顯示為叢集中的InstanceType
自訂資源,但它確實出現在所有用戶端 (UI、Azure CLI、SDK)。 defaultinstancetype
可以使用具有相同名稱的自訂執行個體類型定義來覆寫。
建立自訂執行個體類型
若要建立新的執行個體類型,請為執行個體類型 CRD 建立新的自訂資源。 例如:
kubectl apply -f my_instance_type.yaml
以下是 my_instance_type.yaml 的內容:
apiVersion: amlarc.azureml.com/v1alpha1
kind: InstanceType
metadata:
name: myinstancetypename
spec:
nodeSelector:
mylabel: mylabelvalue
resources:
limits:
cpu: "1"
nvidia.com/gpu: 1
memory: "2Gi"
requests:
cpu: "700m"
memory: "1500Mi"
上述程式碼會建立具有標籤行為的執行個體類型:
- Pod 只會在具有標籤
mylabel: mylabelvalue
的節點上排程。 - 針對 Pod 指派
700m
CPU 和1500Mi
記憶體的資源要求。 - 針對 Pod 指派
1
CPU、2Gi
記憶體和1
NVIDIA GPU 的資源限制。
建立自訂執行個體類型必須符合下列參數和定義規則,否則會失敗:
參數 | 必要或選用 | 描述 |
---|---|---|
name |
必要 | 字串值,在叢集中必須是唯一的。 |
CPU request |
必要 | 字串值,不能為零或空白。 您可以指定 CPU (以 Millicore 為單位);例如, 100m 。 您也可以將它指定為完整數字。 例如,"1" 相當於 1000m 。 |
Memory request |
必要 | 字串值,不能為零或空白。 您可以將記憶體指定為完整數字 + 尾碼;例如, 1024Mi 表示 1,024 mebibytes (MiB)。 |
CPU limit |
必要 | 字串值,不能為零或空白。 您可以指定 CPU (以 Millicore 為單位);例如, 100m 。 您也可以將它指定為完整數字。 例如,"1" 相當於 1000m 。 |
Memory limit |
必要 | 字串值,不能為零或空白。 您可以將記憶體指定為完整數字 + 尾碼;例如, 1024Mi 表示 1024 MiB。 |
GPU |
選擇性 | 整數值,只能在 limits 區段中指定。 如需詳細資訊,請參閱 Kubernetes 文件。 |
nodeSelector |
選擇性 | 字串索引鍵和值的對應。 |
您也可以一次建立多個執行個體類型:
kubectl apply -f my_instance_type_list.yaml
以下是 my_instance_type_list.yaml 的內容:
apiVersion: amlarc.azureml.com/v1alpha1
kind: InstanceTypeList
items:
- metadata:
name: cpusmall
spec:
resources:
requests:
cpu: "100m"
memory: "100Mi"
limits:
cpu: "1"
nvidia.com/gpu: 0
memory: "1Gi"
- metadata:
name: defaultinstancetype
spec:
resources:
requests:
cpu: "1"
memory: "1Gi"
limits:
cpu: "1"
nvidia.com/gpu: 0
memory: "1Gi"
此範例會建立兩個執行個體類型:cpusmall
和 defaultinstancetype
。 此 defaultinstancetype
定義會覆寫當您將 Kubernetes 叢集連結至 Azure Machine Learning 工作區時所建立的 defaultinstancetype
定義。
若提交定型或推斷工作負載但沒有執行個體類型,則會使用 defaultinstancetype
。 若要指定 Kubernetes 叢集的預設執行個體類型,請以 defaultinstancetype
名稱建立執行個體類型。 它會自動辨識為預設值。
選取要提交定型作業的執行個體類型
若要使用 Azure CLI (v2) 選取定型作業的執行個體類型,請在作業 YAML 中將其名稱指定為 resources
屬性區段的一部分。 例如:
command: python -c "print('Hello world!')"
environment:
image: library/python:latest
compute: azureml:<Kubernetes-compute_target_name>
resources:
instance_type: <instance type name>
在上述範例中,將 <Kubernetes-compute_target_name>
取代為 Kubernetes 計算目標的名稱。 將 <instance type name>
取代為您想要選取的執行個體類型名稱。 如果您未指定 instance_type
屬性,系統會使用 defaultinstancetype
來提交作業。
選取要部署模型的執行個體類型
若要使用 Azure CLI (v2) 選取模型部署的執行個體類型,請為部署 YAML 中的 instance_type
屬性指定其名稱。 例如:
name: blue
app_insights_enabled: true
endpoint_name: <endpoint name>
model:
path: ./model/sklearn_mnist_model.pkl
code_configuration:
code: ./script/
scoring_script: score.py
instance_type: <instance type name>
environment:
conda_file: file:./model/conda.yml
image: mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:latest
在上述範例中,將 <instance type name>
取代為您想要選取的執行個體類型名稱。 如果您未指定 instance_type
屬性,系統會使用 defaultinstancetype
來部署模型。
重要
針對 MLflow 模型部署,資源要求至少需要 2 個 CPU 核心和 4 GB 的記憶體。 否則,部署作業將會失敗。
資源區段驗證
您可以使用 resources
區段來定義模型部署的資源要求和限制。 例如:
name: blue
app_insights_enabled: true
endpoint_name: <endpoint name>
model:
path: ./model/sklearn_mnist_model.pkl
code_configuration:
code: ./script/
scoring_script: score.py
environment:
conda_file: file:./model/conda.yml
image: mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:latest
resources:
requests:
cpu: "0.1"
memory: "0.2Gi"
limits:
cpu: "0.2"
#nvidia.com/gpu: 0
memory: "0.5Gi"
instance_type: <instance type name>
如果您使用 resources
區段,有效的資源定義必須符合下列規則。 無效的資源定義會導致模型部署失敗。
參數 | 必要或選用 | 描述 |
---|---|---|
requests: cpu: |
必要 | 字串值,不能為零或空白。 您可以指定 CPU (以 Millicore 為單位);例如, 100m 。 您也可以將它指定為完整數字。 例如,"1" 相當於 1000m 。 |
requests: memory: |
必要 | 字串值,不能為零或空白。 您可以將記憶體指定為完整數字 + 尾碼;例如, 1024Mi 表示 1024 MiB。 儲存體不能小於 1 MB。 |
limits: cpu: |
選用 (只有在您需要 GPU 時才需要) |
字串值,不能為零或空白。 您可以指定 CPU (以 Millicore 為單位);例如, 100m 。 您也可以將它指定為完整數字。 例如,"1" 相當於 1000m 。 |
limits: memory: |
選用 (只有在您需要 GPU 時才需要) |
字串值,不能為零或空白。 您可以將記憶體指定為完整數字 + 尾碼;例如, 1024Mi 表示 1,024 MiB。 |
limits: nvidia.com/gpu: |
選用 (只有在您需要 GPU 時才需要) |
整數值,不能是空的,且只能在 limits 區段中指定。 如需詳細資訊,請參閱 Kubernetes 文件。 如果您只需要 CPU,則可以省略整個 limits 區段。 |
模型部署需要執行個體類型。 如果您定義了 resources
區段,而且它會根據執行個體類型進行驗證,規則如下所示:
- 使用有效的
resource
區段定義,資源限制必須小於執行個體類型限制。 否則,部署將會失敗。 - 如果您未定義執行個體類型,系統會使用
defaultinstancetype
來驗證resources
區段。 - 如果您未定義
resources
區段,系統會使用執行個體類型來建立部署。