实例类型是 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 GiB 内存和 0 个 GPU。 工作负荷的 Pod 使用的资源限制为 2 个 CPU 核心和 2 GiB 内存。
默认实例类型故意使用最少的资源。 若要确保所有机器学习工作负载都使用适当的资源(例如 GPU 资源)运行, 请创建自定义实例类型。
请记住有关默认实例类型的以下几点:
-
defaultinstancetype运行命令InstanceType时,群集中不会显示为kubectl get 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 的资源请求
700m和内存的资源请求1500Mi。 - 为 Pod 分配 CPU 的资源限制
1、内存的资源限制2Gi以及 NVIDIA GPU 的资源限制1。
自定义实例类型创建必须满足以下参数和定义规则,否则失败:
| 参数 | 必需还是可选 | Description |
|---|---|---|
name |
必选 | 群集中必须唯一的字符串值。 |
CPU request |
必选 | 不能为零或为空的字符串值。 可以用毫核为单位指定 CPU;例如, 100m。 还可以将其指定为完整数字。 例如, "1" 等效于 1000m. |
Memory request |
必选 | 不能为零或为空的字符串值。 可以将内存指定为完整数字 + 后缀;例如, 1024Mi 对于 1,024 兆字节(MiB)。 |
CPU limit |
必选 | 不能为零或为空的字符串值。 您可以以毫核为单位指定 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"
前面的示例创建两种实例类型: cpusmall 和 defaultinstancetype。 此 defaultinstancetype 定义会覆盖你在将 Kubernetes 群集附加到 Azure 机器学习 工作区时创建的 defaultinstancetype 定义。
如果提交没有实例类型的训练或推理工作负荷,则使用 defaultinstancetype。 若要为 Kubernetes 群集指定默认实例类型,请使用名称 defaultinstancetype创建实例类型。 它会自动识别为默认值。
选择要提交训练作业的实例类型
若要使用 Azure CLI (v2)为训练作业选择实例类型,请在作业 YAML 中将其名称指定为 properties 节的一部分resources。 例如:
$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
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) 为模型部署选择实例类型,请为instance_type部署 YAML 中的属性指定其名称。 例如:
$schema: https://azuremlschemas.azureedge.net/latest/kubernetesOnlineDeployment.schema.json
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 定义模型部署的资源请求和限制。 例如:
$schema: https://azuremlschemas.azureedge.net/latest/kubernetesOnlineDeployment.schema.json
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: |
必选 | 不能为零或为空的字符串值。 您可以以毫核为单位指定 CPU,例如: 100m。 您也可以使用完整的数字来指定该值。 例如, "1" 等效于 1000m. |
requests:memory: |
必选 | 不能为零或为空的字符串值。 可以将内存指定为完整数字 + 后缀;例如, 1024Mi 对于 1024 MiB。 内存不能小于 1 MB。 |
limits:cpu: |
自选 (仅在需要 GPU 时才必需) |
不能为零或为空的字符串值。 您可以以毫核为单位指定 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该部分,系统将使用实例类型来创建部署。