

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 创建一个 NodeClass
<a name="sagemaker-hyperpod-eks-autoscaling-nodeclass"></a>

**重要**  
您的实例组必须从 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](sagemaker-hyperpod-eks-gpu-partitioning.md)。
+ 如果将自定义标签应用于实例组，则可以在查询`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`。

1. 创建一个包含 `NodeClass` 配置的 YAML 文件（例如 nodeclass.yaml）。

1. 使用 kubectl 将此配置应用于集群。

1. 在 `NodePool` 配置中引用 `NodeClass`。

1. 以下示例 `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
   ```

1. 应用配置：

   ```
   kubectl apply -f nodeclass.yaml
   ```

1. 监控 NodeClass 状态以确保状态中的 “就绪” 条件设置为 True：

   ```
   kubectl get hyperpodnodeclass sample-nc -o yaml
   ```

   ```
   apiVersion: 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>
   ```