

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

# 在亚马逊上设置 GPU 分区 SageMaker HyperPod
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup"></a>

**Topics**
+ [先决条件](#sagemaker-hyperpod-eks-gpu-partitioning-setup-prerequisites)
+ [使用 MIG 配置创建集群](#sagemaker-hyperpod-eks-gpu-partitioning-setup-create-cluster)
+ [向现有集群添加 GPU 操作员](#sagemaker-hyperpod-eks-gpu-partitioning-setup-add-operator)
+ [更新 MIG 配置](#sagemaker-hyperpod-eks-gpu-partitioning-setup-update)
+ [正在验证 MIG 配置](#sagemaker-hyperpod-eks-gpu-partitioning-setup-verify)
+ [调试 MIG 配置的常用命令](#sagemaker-hyperpod-eks-gpu-partitioning-setup-debug-commands)
+ [使用 SageMaker AI 控制台](#sagemaker-hyperpod-eks-gpu-partitioning-setup-console)

## 先决条件
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-prerequisites"></a>
+ HyperPod 支持的 GPU 实例的 Amazon EKS 集群
+ 已安装 NVIDIA GP
+ 用于集群管理的适当的 IAM 权限

## 使用 MIG 配置创建集群
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-create-cluster"></a>

### 使用 AWS CLI
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-create-cluster-cli"></a>

```
aws sagemaker create-cluster \
  --cluster-name my-mig-cluster \
  --orchestrator 'Eks={ClusterArn=arn:aws:eks:region:account:cluster/cluster-name}' \
  --instance-groups '{
    "InstanceGroupName": "gpu-group",
    "InstanceType": "ml.p4d.24xlarge",
    "InstanceCount": 1,
    "LifeCycleConfig": {
       "SourceS3Uri": "s3://my-bucket",
       "OnCreate": "on_create_script.sh"
    },
    "KubernetesConfig": {
       "Labels": {
          "nvidia.com/mig.config": "all-1g.5gb"
       }
    },
    "ExecutionRole": "arn:aws:iam::account:role/execution-role",
    "ThreadsPerCore": 1
  }' \
  --vpc-config '{
     "SecurityGroupIds": ["sg-12345"],
     "Subnets": ["subnet-12345"]
  }' \
  --node-provisioning-mode Continuous
```

### 使用 CloudFormation
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-create-cluster-cfn"></a>

```
{
  "ClusterName": "my-mig-cluster",
  "InstanceGroups": [
    {
      "InstanceGroupName": "gpu-group",
      "InstanceType": "ml.p4d.24xlarge",
      "InstanceCount": 1,
      "KubernetesConfig": {
        "Labels": {
          "nvidia.com/mig.config": "all-2g.10gb"
        }
      },
      "ExecutionRole": "arn:aws:iam::account:role/execution-role"
    }
  ],
  "Orchestrator": {
    "Eks": {
      "ClusterArn": "arn:aws:eks:region:account:cluster/cluster-name"
    }
  },
  "NodeProvisioningMode": "Continuous"
}
```

## 向现有集群添加 GPU 操作员
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-add-operator"></a>

### 安装 GPU 操作员
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-add-operator-install"></a>

`{$AWS_REGION}`替换为你的集群区域（例如 us-east-1、us-west-2）。

```
helm install gpuo helm_chart/HyperPodHelmChart/charts/gpu-operator \
-f helm_chart/HyperPodHelmChart/charts/gpu-operator/regional-values/values-{$AWS_REGION}.yaml \
-n kube-system
```

### 验证安装（等待 2-3 分钟）
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-add-operator-verify"></a>

检查所有 GPU 操作员舱是否正在运行：

```
kubectl get pods -n kube-system | grep -E "(gpu-operator|nvidia-)"
```

**预期的 pod：**
+ gpu-operator-\$1-1 个实例（集群控制器）
+ nvidia-device-plugin-daemonset-\$1-每个 GPU 节点 1 个（所有 GPU 实例）
+ nvidia-mig-manager-\$1-每个支持 MiG 的节点 1 个 (A100/H100)

### 移除旧设备插件
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-add-operator-remove"></a>

禁用现有的 nvidia-device-plugin：

```
helm upgrade dependencies helm_chart/HyperPodHelmChart \
--set nvidia-device-plugin.devicePlugin.enabled=false \
-n kube-system
```

### 验证 GPU 资源
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-add-operator-verify-gpu"></a>

确认节点显示 GPU 容量。它应该显示：nvidia.com/gpu：8（或你的实际 GPU 数量）。

```
kubectl describe nodes | grep "nvidia.com/gpu"
```

## 更新 MIG 配置
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-update"></a>

**在 MIG 更新之前准备节点**  
在更新实例组上的 MIG 配置之前，您必须准备好节点以防止工作负载中断。请按照以下步骤安全地从要重新配置的节点中排出工作负载。

### 步骤 1：识别实例组中的节点
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-update-identify"></a>

首先，确定属于您要更新的实例组的所有节点：

```
# List all nodes in the instance group
kubectl get nodes -l sagemaker.amazonaws.com/instance-group-name=INSTANCE_GROUP_NAME

# Example:
kubectl get nodes -l sagemaker.amazonaws.com/instance-group-name=p4d-group
```

此命令返回指定实例组中所有节点的列表。在以下步骤中记下每个节点的名称。

### 第 2 步：封锁并排干每个节点
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-update-drain"></a>

对于步骤 1 中确定的每个节点，请执行以下操作：

#### 封锁节点
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-update-drain-cordon"></a>

封锁可防止在节点上调度新的 pod：

```
# Cordon a single node
kubectl cordon NODE_NAME

# Example:
kubectl cordon hyperpod-i-014a41a7001adca60
```

#### 从节点中耗尽工作负载 Pod
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-update-drain-evict"></a>

在保留系统 Pod 的同时，耗尽节点以驱逐所有工作负载 pod：

```
# Drain the node (ignore DaemonSets and evict pods)
kubectl drain NODE_NAME \
  --ignore-daemonsets \
  --delete-emptydir-data \
  --force \
  --grace-period=300

# Example:
kubectl drain hyperpod-i-014a41a7001adca60 \
  --ignore-daemonsets \
  --delete-emptydir-data \
  --force \
  --grace-period=300
```

**命令选项解释：**
+ `--ignore-daemonsets`-即使有 DaemonSet pod 也允许排水操作继续进行
+ `--delete-emptydir-data`-使用 emptyDir 卷删除 pod（成功排空所必需的）
+ `--force`-强制删除不受控制器管理的 pod（谨慎使用）
+ `--grace-period=300`-让 pod 有 5 分钟的时间来优雅地终止

**重要**  
耗尽操作可能需要几分钟，具体取决于吊舱的数量及其终止宽限期
以下命名空间中的系统 pod 将保持运行状态：`kube-system`、`cert-manager`、、`kubeflow`、`hyperpod-inference-system`、`kube-public`、`mpi-operator`、`gpu-operator`、、`aws-hyperpod`、`jupyter-k8s-system``hyperpod-observability`、和 `kueue-system` `keda`
DaemonSet pod 将保留在节点上（设计时会忽略它们）

### 步骤 3：验证没有工作负载 Pod 正在运行
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-update-verify"></a>

耗尽后，确认节点上没有工作负载 Pod（不包括系统命名空间）：

```
# Check for any remaining pods outside system namespaces
kubectl get pods --all-namespaces --field-selector spec.nodeName=NODE_NAME \
  | grep -v "kube-system" \
  | grep -v "cert-manager" \
  | grep -v "kubeflow" \
  | grep -v "hyperpod-inference-system" \
  | grep -v "kube-public" \
  | grep -v "mpi-operator" \
  | grep -v "gpu-operator" \
  | grep -v "aws-hyperpod" \
  | grep -v "jupyter-k8s-system" \
  | grep -v "hyperpod-observability" \
  | grep -v "kueue-system" \
  | grep -v "keda"

# Example:
kubectl get pods --all-namespaces --field-selector spec.nodeName=hyperpod-i-014a41a7001adca60 \
  | grep -v "kube-system" \
  | grep -v "cert-manager" \
  | grep -v "kubeflow" \
  | grep -v "hyperpod-inference-system" \
  | grep -v "kube-public" \
  | grep -v "mpi-operator" \
  | grep -v "gpu-operator" \
  | grep -v "aws-hyperpod" \
  | grep -v "jupyter-k8s-system" \
  | grep -v "hyperpod-observability" \
  | grep -v "kueue-system" \
  | grep -v "keda"
```

**预期输出：**如果节点已正确排空，则此命令不应返回任何结果（或仅显示标题行）。如果有任何 pod 仍在运行，请调查它们未被驱逐的原因，并在必要时手动将其删除。

### 步骤 4：验证节点就绪状态
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-update-readiness"></a>

在继续进行 MIG 更新之前，请确认所有节点都已封锁：

```
# Check node status - should show "SchedulingDisabled"
kubectl get nodes -l sagemaker.amazonaws.com/instance-group-name=INSTANCE_GROUP_NAME
```

节点应显示`SchedulingDisabled`在 STATUS 列中，表示它们已被封锁并准备好进行 MIG 更新。

### 在现有集群上更新 MIG 配置文件
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-update-change"></a>

您可以更改现有集群上的 MIG 配置文件：

```
aws sagemaker update-cluster \
  --cluster-name my-mig-cluster \
  --instance-groups '{
    "InstanceGroupName": "gpu-group",
    "InstanceType": "ml.p4d.24xlarge",
    "InstanceCount": 1,
    "KubernetesConfig": {
       "Labels": {
          "nvidia.com/mig.config": "all-3g.20gb"
       }
    },
    "ExecutionRole": "arn:aws:iam::account:role/execution-role"
  }'
```

**注意**  
如果任务已在节点上运行，则 MIG 分区将失败。在重新尝试 MIG 分区之前，用户将收到错误消息，要求其耗尽节点。

## 正在验证 MIG 配置
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-verify"></a>

创建或更新集群后，验证 MIG 配置：

```
# Update kubeconfig
aws eks update-kubeconfig --name your-eks-cluster --region us-east-2

# Check MIG labels
kubectl get node NODE_NAME -o=jsonpath='{.metadata.labels}' | grep mig

# Check available MIG resources
kubectl describe node NODE_NAME | grep -A 10 "Allocatable:"
```

## 调试 MIG 配置的常用命令
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-debug-commands"></a>

使用以下命令对集群中的 MIG 配置进行故障排除和验证：

```
# Check GPU Operator status
kubectl get pods -n gpu-operator-resources

# View MIG configuration
kubectl exec -n gpu-operator-resources nvidia-driver-XXXXX -- nvidia-smi mig -lgi

# Check device plugin configuration
kubectl logs -n gpu-operator-resources nvidia-device-plugin-XXXXX

# Monitor node events
kubectl get events --field-selector involvedObject.name=NODE_NAME
```

**注意**  
将`nvidia-driver-XXXXX`和`nvidia-device-plugin-XXXXX`替换为集群中的实际 pod `NODE_NAME` 名称以及节点的名称。

## 使用 SageMaker AI 控制台
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-console"></a>

### 使用 MIG 创建新集群
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-console-create"></a>

1. 导航至 **Amazon SageMaker AI** > **HyperPod 集群** > **集群管理** > **创建 HyperPod 集群**

1. 选择由 **EKS 精心编排**

1. 选择 “**自定义设置”** 并确认默认情况下已启用 **GPU 运算符**

1. 在**实例组**部分下，点击**添加组**

1. 配置实例组并导航到**高级配置**以启用 “**使用 GPU 分区**” 切换，然后从下**拉列表中选择所需的 MIG 配置**

1. 点击**添加实例组**并完成其余的集群配置

1. 单击 “**提交**” 创建集群

### 更新现有集群上的 MIG 配置
<a name="sagemaker-hyperpod-eks-gpu-partitioning-setup-console-update"></a>

1. 导航至 **Amazon SageMaker AI** > **HyperPod 集群** > **集群管理**

1. 选择您的现有集群，然后在要修改的实例组上单击**编辑**

1. 在**高级配置**中，切换**使用 GPU 分区**（如果尚未启用），然后从下拉列表中选择不同的 **MIG 配置**

1. 单击 “**保存更改**”