次の方法で共有

创建和管理实例类型,以便高效利用计算资源

实例类型是一个 Azure 机器学习概念,它允许针对某些类型的计算节点进行训练和推理工作负荷。 例如,在 Azure 虚拟机中,实例类型为 STANDARD_D2_V3。 本文介绍如何为计算要求创建和管理实例类型。

在 Kubernetes 群集中,实例类型表示为随 Azure 机器学习扩展一起安装的自定义资源定义(CRD)。 Azure 机器学习扩展中的两个元素表示实例类型:

  • nodeSelector:使用 nodeSelector 指定 Pod 应运行哪个节点。 节点必须具有相应的标签。
  • 资源:在 “资源 ”部分中,可以为 Pod 设置计算资源(CPU、内存和 NVIDIA GPU)。

如果在 部署 Azure 机器学习扩展时指定 nodeSelector 字段,该 nodeSelector 字段将应用于所有实例类型。 这意味着:

  • 对于创建的每个实例类型,指定的 nodeSelector 字段应是扩展指定的 nodeSelector 字段的子集。
  • 如果使用实例类型, nodeSelector则工作负荷在与扩展指定的 nodeSelector 字段和实例类型指定的 nodeSelector 字段匹配的任何节点上运行。
  • 如果使用没有 nodeSelector 字段的实例类型,则工作负荷在与扩展指定的 nodeSelector 字段匹配的任何节点上运行。

创建默认实例类型

默认情况下,在将 Kubernetes 群集附加到 Azure 机器学习工作区时,将创建调用 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 资源)运行,强烈建议 创建自定义实例类型

请记住有关默认实例类型的以下几点:

  • defaultinstancetype运行命令kubectl get instancetype时,群集中不会显示为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 分配 CPU 和1500Mi内存的资源请求700m
  • 为 Pod 分配了 CPU、2Gi内存和 1 NVIDIA GPU 的资源限制1

自定义实例类型创建必须满足以下参数和定义规则,否则失败:

参数 必需还是可选 Description
name 必选 群集中必须唯一的字符串值。
CPU request 必选 不能为零或为空的字符串值。
可以在 millicores 中指定 CPU;例如, 100m. 还可以将其指定为完整数字。 例如, "1" 等效于 1000m.
Memory request 必选 不能为零或为空的字符串值。
可以将内存指定为完整数字 + 后缀;例如, 1024Mi 对于 1,024 兆字节(MiB)。
CPU limit 必选 不能为零或为空的字符串值。
可以在 millicores 中指定 CPU;例如, 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 定义替代 defaultinstancetype 将 Kubernetes 群集附加到 Azure 机器学习工作区时创建的定义。

如果提交没有实例类型的训练或推理工作负荷,则使用 defaultinstancetype。 若要为 Kubernetes 群集指定默认实例类型,请使用名称 defaultinstancetype创建实例类型。 它会自动识别为默认值。

选择要提交训练作业的实例类型

若要使用 Azure CLI(v2)为训练作业选择实例类型,请在作业 YAML 中将其名称指定为 properties 节的一部分 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 时,有效的资源定义必须符合以下规则。 无效的资源定义会导致模型部署失败。

参数 必需还是可选 Description
requests:
cpu:
必选 不能为零或为空的字符串值。
可以在 millicores 中指定 CPU;例如, 100m. 还可以以完整数字指定它。 例如, "1" 等效于 1000m.
requests:
memory:
必选 不能为零或为空的字符串值。
可以将内存指定为完整数字 + 后缀;例如, 1024Mi 对于 1024 MiB。
内存不能小于 1 MB。
limits:
cpu:
自选
(仅当需要 GPU 时才需要)
不能为零或为空的字符串值。
可以在 millicores 中指定 CPU;例如, 100m. 还可以以完整数字指定它。 例如, "1" 等效于 1000m.
limits:
memory:
自选
(仅当需要 GPU 时才需要)
不能为零或为空的字符串值。
可以将内存指定为完整数字 + 后缀;例如, 1024Mi 对于 1,024 MiB。
limits:
nvidia.com/gpu:
自选
(仅当需要 GPU 时才需要)
不能为空且只能在节中指定的 limits 整数值。
有关详细信息,请参阅 Kubernetes 文档
如果只需要 CPU,则可以省略整个 limits 部分。

模型部署 需要 实例类型。 如果定义该 resources 节,则会根据以下规则根据实例类型对其进行验证:

  • 使用有效的 resource 节定义,资源限制必须小于实例类型限制。 否则,部署会失败。
  • 如果未定义实例类型,系统将使用该 defaultinstancetype 部分进行 resources 验证。
  • 如果未定义 resources 该部分,系统将使用实例类型来创建部署。

后续步骤