在 Amazon 任务管理中使用拓扑感知调度 SageMaker HyperPod - 亚马逊 SageMaker AI

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

在 Amazon 任务管理中使用拓扑感知调度 SageMaker HyperPod

Amazon SageMaker HyperPod 任务管理中的拓扑感知调度可根据您的 Amazon 实例的物理网络拓扑放容器,从而优化分布式机器学习工作负载的训练效率。 EC2 通过考虑 AWS 基础设施的分层结构,包括可用区、网络块和物理机架,拓扑感知调度可确保需要频繁通信的 Pod 近距离调度,以最大限度地减少网络延迟。这种智能布局对于涉及密集 pod-to-pod沟通的大规模机器学习训练作业特别有益,从而缩短了训练时间,提高了整个集群的资源利用率。

注意

要使用拓扑感知调度,请确保您的 HyperPod 任务管理版本为 v1.2.2-eksbuild.1 或更高版本。

拓扑感知调度支持以下实例类型:

  • ml.p3dn.24xlarge

  • ml.p4d.24xlarge

  • ml.p4de.24xlarge

  • ml.p5.48xlarge

  • ml.p5e.48xlarge

  • ml.p5en.48xlarge

  • ml.p6e-gb200.36xlarge

  • ml.trn1.2xlarge

  • ml.trn1.32xlarge

  • ml.trn1n.32xlarge

  • ml.trn2.48xlarge

  • ml.trn2u.48xlarge

拓扑感知调度可与您的现有 HyperPod 工作流程集成,同时通过 kubectl YAML 文件和 CLI 提供灵活的拓扑首选项。 HyperPod HyperPod 任务治理会自动使用拓扑标签配置集群节点,并与 HyperPod 任务治理策略和资源借用机制配合使用,确保拓扑感知调度不会干扰您当前的操作流程。借助对首选拓扑规格和必需拓扑规格的内置支持,您可以微调工作负载布置以满足您的特定性能需求,同时保持在无法满足拓扑限制时回退到标准调度的灵活性。

通过利用中的拓扑感知标签 HyperPod,您可以通过考虑物理网络基础设施的智能容器放置来增强他们的机器学习工作负载。 HyperPod 任务治理基于分层数据中心拓扑自动优化 Pod 调度,这直接转化为减少网络延迟并提高分布式 ML 任务的训练性能。这种拓扑感知对于大规模的机器学习工作负载特别有价值,因为它通过战略性地将相关的 pod 放在网络层次结构中更紧密的位置来最大限度地减少通信开销。结果是优化了 pod 之间的通信网络延迟,提高了资源利用率,提高了计算密集型 AI/ML 应用程序的整体性能,所有这些都无需您手动管理复杂的网络拓扑配置。

以下是 HyperPod 任务管理可以将 Pod 调度到的可用拓扑网络层的标签:

  • topology.k8 network-node-layer s.aws/ -1

  • topology.k8 network-node-layer s.aws/-2

  • topology.k8 network-node-layer s.aws/-3

要使用拓扑感知调度,请在 YAML 文件中添加以下标签:

  • kueue.x-k8s.io/ podset-required-topology -表示此任务必须具有所需的 Pod,并且节点中的所有 Pod 都必须调度在同一个拓扑层内。

  • kueue.x-k8s.io/ podset-preferred-topology -表示此作业必须有 pod,但首选但不是必需的,在同一拓扑层内调度 pod。 HyperPod 在尝试下一个拓扑层之前,任务治理会尝试在一层内调度 pod。

如果资源不共享相同的拓扑标签,则作业将被暂停。该职位将在候补名单中。一旦 Kueue 看到有足够的资源,它就会接受并执行这项工作。

以下示例演示了如何在 YAML 文件中使用标签:

apiVersion: batch/v1 kind: Job metadata: name: test-tas-job namespace: hyperpod-ns-team-name labels: kueue.x-k8s.io/queue-name: hyperpod-ns-team-name-localqueue kueue.x-k8s.io/priority-class: PRIORITY_CLASS-priority spec: parallelism: 10 completions: 10 suspend: true template: metadata: labels: kueue.x-k8s.io/queue-name: hyperpod-ns-team-name-localqueue annotations: kueue.x-k8s.io/podset-required-topology: "topology.k8s.aws/network-node-layer-3" or kueue.x-k8s.io/podset-preferred-topology: "topology.k8s.aws/network-node-layer-3" spec: nodeSelector: topology.k8s.aws/network-node-layer-3: TOPOLOGY_LABEL_VALUE containers: - name: dummy-job image: gcr.io/k8s-staging-perf-tests/sleep:v0.1.0 args: ["3600s"] resources: requests: cpu: "100" restartPolicy: Never

下表说明了您可以在 kubectl YAML 文件中使用的新参数。

参数 描述
kueue.x-k8s.io/queue-name 用于运行作业的队列的名称。此队列名称的格式必须是。hyperpod-ns-team-name-localqueue
kueue.x-k8s.io/priority-class 允许您指定 Pod 调度的优先级。此规格是可选的。
annotations 包含您附加到作业的拓扑注释。可用的拓扑有 kuee.x-k8s.io/ 和 ku eue.x-k8s.io/。podset-required-topology podset-preferred-topology你可以同时使用注释或 NodeSelector,但不能同时使用两者。
nodeSelector 指定表示 Amazon EC2 实例放置层的网络层。使用此字段或注释,但不能同时使用两者。在你的 YAML 文件中,你还可以使用 nodeSelector 参数为你的容器选择确切的图层。要获取标签的值,请使用 DescribeInstanceTopologyAPI 操作。

您还可以使用 HyperPod CLI 来运行作业和使用拓扑感知调度。有关 HyperPod CLI 的更多信息,请参阅SageMaker HyperPod CLI 命令

hyp create hyp-pytorch-job \ --version 1.1 \ --job-name sample-pytorch-job \ --image 123456789012.dkr.ecr.us-west-2.amazonaws.com/ptjob:latest \ --pull-policy "Always" \ --tasks-per-node 1 \ --max-retry 1 \ --priority high-priority \ --namespace hyperpod-ns-team-name \ --queue-name hyperpod-ns-team-name-localqueue \ --preferred-topology-label topology.k8s.aws/network-node-layer-1

以下是一个示例配置文件,您可以使用它来运行 PytorchJob 带有拓扑标签的。如果你想运行 MPI 和 Tensorflow 作业,则该文件大致相似。如果您想改为运行这些作业,请记住相应地更改配置文件,例如改用正确的映像 PyTorchJob。如果您正在运行 PyTorchJob,则可以为主节点和工作节点分配不同的拓扑。 PyTorchJob 始终有一个主节点,因此我们建议您改用拓扑来支持 worker pod。

apiVersion: kubeflow.org/v1 kind: PyTorchJob metadata: annotations: {} labels: kueue.x-k8s.io/queue-name: hyperpod-ns-team-name-localqueue name: tas-test-pytorch-job namespace: hyperpod-ns-team-name spec: pytorchReplicaSpecs: Master: replicas: 1 restartPolicy: OnFailure template: metadata: labels: kueue.x-k8s.io/queue-name: hyperpod-ns-team-name-localqueue spec: containers: - command: - python3 - /opt/pytorch-mnist/mnist.py - --epochs=1 image: docker.io/kubeflowkatib/pytorch-mnist:v1beta1-45c5727 imagePullPolicy: Always name: pytorch Worker: replicas: 10 restartPolicy: OnFailure template: metadata: # annotations: # kueue.x-k8s.io/podset-required-topology: "topology.k8s.aws/network-node-layer-3" labels: kueue.x-k8s.io/queue-name: hyperpod-ns-team-name-localqueue spec: containers: - command: - python3 - /opt/pytorch-mnist/mnist.py - --epochs=1 image: docker.io/kubeflowkatib/pytorch-mnist:v1beta1-45c5727 imagePullPolicy: Always name: pytorch resources: limits: cpu: 1 requests: memory: 200Mi cpu: 1 #nodeSelector: # topology.k8s.aws/network-node-layer-3: xxxxxxxxxxx

要查看集群的拓扑,请使用 DescribeInstanceTopologyAPI 操作。默认情况下,拓扑隐藏在 AWS Management Console 和 Amazon SageMaker Studio 中。请按照以下步骤在您使用的界面中查看它们。

SageMaker Studio

  1. 在 SageMaker Studio 中,导航到您的集群。

  2. 在 “任务” 视图中,选择 “名称” 列中的选项菜单,然后选择 “管理列”。

  3. 选择请求的拓扑拓扑约束以添加列以查看 Kubernetes Pod 列表中的拓扑信息。

AWS Management Console

  1. 打开 Amazon A SageMaker I 控制台,网址为https://console.aws.amazon.com/sagemaker/

  2. HyperPod 集群下,选择集群管理

  3. 选择 “任务” 选项卡,然后选择齿轮图标。

  4. 在实例属性下,切换请求的拓扑拓扑约束

  5. 选择确认以查看表中的拓扑信息。