在亚马逊上设置 GPU 分区 SageMaker HyperPod - 亚马逊 SageMaker AI

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

在亚马逊上设置 GPU 分区 SageMaker HyperPod

先决条件

  • HyperPod 支持的 GPU 实例的 Amazon EKS 集群

  • 已安装 NVIDIA GP

  • 用于集群管理的适当的 IAM 权限

使用 MIG 配置创建集群

使用 AWS CLI

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

{ "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 操作员

安装 GPU 操作员

{$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 分钟)

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

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)

移除旧设备插件

禁用现有的 nvidia-device-plugin:

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

验证 GPU 资源

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

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

更新 MIG 配置

在 MIG 更新之前准备节点

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

步骤 1:识别实例组中的节点

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

# 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 步:封锁并排干每个节点

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

封锁节点

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

# Cordon a single node kubectl cordon NODE_NAME # Example: kubectl cordon hyperpod-i-014a41a7001adca60

从节点中耗尽工作负载 Pod

在保留系统 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-systemcert-manager、、kubeflowhyperpod-inference-systemkube-publicmpi-operatorgpu-operator、、aws-hyperpodjupyter-k8s-systemhyperpod-observability、和 kueue-system keda

  • DaemonSet pod 将保留在节点上(设计时会忽略它们)

步骤 3:验证没有工作负载 Pod 正在运行

耗尽后,确认节点上没有工作负载 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:验证节点就绪状态

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

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

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

在现有集群上更新 MIG 配置文件

您可以更改现有集群上的 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 配置

创建或更新集群后,验证 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 配置的常用命令

使用以下命令对集群中的 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-XXXXXnvidia-device-plugin-XXXXX替换为集群中的实际 pod NODE_NAME 名称以及节点的名称。

使用 SageMaker AI 控制台

使用 MIG 创建新集群

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

  2. 选择由 EKS 精心编排

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

  4. 在 “实例组” 部分下,单击 “添加组

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

  6. 单击 “添加实例组” 并完成剩余的集群配置

  7. 单击 “提交” 创建集群

更新现有集群上的 MIG 配置

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

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

  3. 高级配置中,切换使用 GPU 分区(如果尚未启用),然后从下拉列表中选择不同的 MIG 配置

  4. 点击保存更改