建立和管理執行個體類型以有效利用計算資源

執行個體類型是 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"

此範例會建立兩個執行個體類型:cpusmalldefaultinstancetype。 此 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 區段,系統會使用執行個體類型來建立部署。

下一步