

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

# 在 Amazon 任务管理中使用拓扑感知调度 SageMaker HyperPod
<a name="sagemaker-hyperpod-eks-operate-console-ui-governance-tasks-scheduling"></a>

Amazon SageMaker HyperPod 任务管理中的拓扑感知调度可根据您的 Amazon EC2 实例的物理网络拓扑放容器，从而优化分布式机器学习工作负载的训练效率。通过考虑 Amazon 基础设施的分层结构，包括可用区、网络块和物理机架，拓扑感知调度可确保需要频繁通信的 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
+ topology.k8s.aws/ultraserver-id

要使用拓扑感知安排，请在 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 | 要用于运行作业的队列的名称。此 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 参数容器组（pod）选择确切的层。要获取标签的值，请使用 [ DescribeInstanceTopology](https://docs.amazonaws.cn/AWSEC2/latest/APIReference/API_DescribeInstanceTopology.html)API 操作。 | 

您还可以使用 HyperPod CLI 来运行作业和使用拓扑感知调度。有关 HyperPod CLI 的更多信息，请参阅[SageMaker HyperPod CLI 命令](sagemaker-hyperpod-eks-hyperpod-cli-reference.md)。

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

要查看集群的拓扑，请使用 [ DescribeInstanceTopology](https://docs.amazonaws.cn/AWSEC2/latest/APIReference/API_DescribeInstanceTopology.html)API 操作。默认情况下，拓扑隐藏在 Amazon Web Services 管理控制台 和 Amazon SageMaker Studio 中。按照以下步骤操作，在所使用的界面中查看它们。

**SageMaker Studio**

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

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

1. 选择**请求的拓扑**和**拓扑约束**以添加列，来查看 Kubernetes 容器组（pod）列表中的拓扑信息。

**Amazon Web Services 管理控制台**

1. 打开 Amazon A SageMaker I 控制台，网址为[https://console.aws.amazon.com/sagemaker/](https://console.amazonaws.cn/sagemaker/)。

1. 在**HyperPod 集群**下，选择**集群管理**。

1. 选择**任务**选项卡，然后选择齿轮图标。

1. 在实例属性下，切换**请求的拓扑**和**拓扑约束**。

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