本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
创建 NodeClass
重要
您的实例组必须从 0 个节点开始,并让 Karpenter 处理自动扩缩。如果初始节点数大于 0,Karpenter 会将其缩减至 0。
节点类(NodeClass)定义了适用于 Amazon EKS 集群中节点组的基础设施级别设置,包括网络配置、存储设置和资源标记等。A HyperPodNodeClass 是一种自定义项NodeClass,它映射到中预先创建的实例组 SageMaker HyperPod,它定义了在 Karpenter 的自动扩展决策中支持哪些实例类型和可用区的限制。
创建节点类的注意事项
-
您可以在
NodeClass中最多指定 10 个实例组。 -
在 MIG(多实例 GPU)中使用 GPU 分区时,Karpenter 可以自动为节点配置支持 MiG 的实例组。确保您的实例组包含 MIG 支持的实例类型(ml.p4d.24xlarge、ml.p5.48xlarge 或 ml.p5e/p5en.48xlarge),并在创建集群时配置相应的 MIG 标签。有关配置 GPU 分区的更多信息,请参阅在亚马逊中使用 GPU 分区 SageMaker HyperPod。
-
如果将自定义标签应用于实例组,则可以在查询
HyperpodNodeClass状态时在desiredLabels字段中查看它们。这包括 MIG 配置标签,例如。nvidia.com/mig.config当传入的任务请求 MIG 资源时,Karpenter 将使用相应的 MIG 标签自动扩展实例。 -
如果您选择删除实例组,我们建议您先将其从您的集群中删除,
NodeClass然后再将其从您的 HyperPod集群中删除。如果删除一个正在NodeClass中使用的实例组,则NodeClass将被标记非Ready状态且无法进行预调配,并且在从NodeClass中移除该实例组之前,该实例组不会用于后续扩展操作。 -
当您从
NodeClass中移除实例组时,Karpenter 将检测到实例组中由 Karpenter 管理的节点存在偏差,并将根据中断预算控制措施中断节点。 -
实例组所使用的子网应属于同一个可用区。子网是通过
OverrideVpcConfig在实例组级别或集群级别指定的。默认情况下,将使用VpcConfig。 -
此时仅支持按需容量。不支持具有训练计划或预留容量的实例组。
-
不支持带
DeepHealthChecks (DHC)的实例组。这是因为 DHC 大约需要 60-90 分钟才能完成,在此期间,容器组(pod)将保持待处理状态,这可能会导致过度预调配。
以下步骤展示了如何创建 NodeClass。
-
创建一个包含
NodeClass配置的 YAML 文件(例如 nodeclass.yaml)。 -
使用 kubectl 将此配置应用于集群。
-
在
NodePool配置中引用NodeClass。 -
以下示例
NodeClass使用 ml.c5.xlarge 和 ml.c5.4xlarge 实例类型:apiVersion: karpenter.sagemaker.amazonaws.com/v1 kind: HyperpodNodeClass metadata: name: sample-nc spec: instanceGroups: # name of InstanceGroup in HyperPod cluster. InstanceGroup needs to pre-created # MaxItems: 10 - auto-c5-xaz1 - auto-c5-4xaz2 -
应用配置:
kubectl apply -f nodeclass.yaml -
监控 NodeClass 状态以确保状态中的 “就绪” 条件设置为 True:
kubectl get hyperpodnodeclass sample-nc -o yamlapiVersion: karpenter.sagemaker.amazonaws.com/v1 kind: HyperpodNodeClass metadata: creationTimestamp: "<timestamp>" name: sample-nc uid: <resource-uid> spec: instanceGroups: - auto-c5-az1 - auto-c5-4xaz2 status: conditions: // true when all IGs in the spec are present in SageMaker cluster, false otherwise - lastTransitionTime: "<timestamp>" message: "" observedGeneration: 3 reason: InstanceGroupReady status: "True" type: InstanceGroupReady // true if subnets of IGs are discoverable, false otherwise - lastTransitionTime: "<timestamp>" message: "" observedGeneration: 3 reason: SubnetsReady status: "True" type: SubnetsReady // true when all dependent resources are Ready [InstanceGroup, Subnets] - lastTransitionTime: "<timestamp>" message: "" observedGeneration: 3 reason: Ready status: "True" type: Ready instanceGroups: - desiredLabels: - key: <custom_label_key> value: <custom_label_value> - key: nvidia.com/mig.config value: all-1g.5gb instanceTypes: - ml.c5.xlarge name: auto-c5-az1 subnets: - id: <subnet-id> zone: <availability-zone-a> zoneId: <zone-id-a> - instanceTypes: - ml.c5.4xlarge name: auto-c5-4xaz2 subnets: - id: <subnet-id> zone: <availability-zone-b> zoneId: <zone-id-b>