

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 Amazon SageMaker HyperPod 上設定 GPU 分割區
<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>
+ 具有支援 GPU 執行個體的 HyperPod Amazon EKS 叢集
+ 已安裝 NVIDIA GPU Operator
+ 叢集管理的適當 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 Operator
<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 Operator Pod 正在執行：

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

**預期的 Pod：**
+ gpu-operator-\* - 1 個執行個體 （叢集控制器）
+ nvidia-device-plugin-daemonset-\* - 每個 GPU 節點 1 個 （所有 GPU 執行個體）
+ nvidia-mig-manager-\* - 每個具備 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 數量及其終止寬限期
下列命名空間中的系統 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 Operator** 預設已啟用

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. 按一下**儲存變更**