

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

# 在 Amazon EKS 编排的 SageMaker HyperPod 集群上运行作业
<a name="sagemaker-hyperpod-eks-run-jobs"></a>

以下主题提供了在使用 Amazon EKS 编排的预配置 SageMaker HyperPod 集群上访问计算节点和运行机器学习工作负载的过程和示例。根据您在集群上设置环境的方式，有多种方法可以在 HyperPod 集 HyperPod 群上运行 ML 工作负载。

**注意**  
通过 SageMaker HyperPod CLI 或 kubectl 运行作业时， HyperPod 可以跨命名空间（团队）跟踪计算利用率（GPU/CPU 小时数）。这些指标为使用情况报告提供支持，该报告可提供：  
已分配资源与已借入资源消耗情况可见性
用于审计的团队资源利用率（最长 180 天）
与任务治理策略保持一致的成本归属
要利用使用情况报告，您必须安装使用情况报告基础设施。我们强烈建议配置[任务治理](sagemaker-hyperpod-eks-operate-console-ui-governance.md)，以强制实施计算资源配额并启用精细成本归属。  
有关设置和生成使用情况报告的更多信息，请参阅[中的报告计算使用情况 HyperPod](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-usage-reporting.html)。

**提示**  
要获得有关如何设置和使用由 Amazon EKS 编排的 SageMaker HyperPod 集群的实践经验和指导，我们建议您参加此次研讨会 Amazon EKS Su [ppor](https://catalog.us-east-1.prod.workshops.aws/workshops/2433d39e-ccfe-4c00-9d3d-9917b729258e) t。 SageMaker HyperPod

数据科学家用户可以使用 EKS 集群集作为集群的协调器来训练基础模型。 SageMaker HyperPod 科学家们利用 [SageMaker HyperPod CLI](https://github.com/aws/sagemaker-hyperpod-cli) 和原生`kubectl`命令来查找可用 SageMaker HyperPod 集群、提交训练作业 (Pod) 并管理其工作负载。 SageMaker HyperPod CLI 支持使用训练作业架构文件提交作业，并提供任务列表、描述、取消和执行的功能。科学家可以根据由管理的计算配额使用 [Kubeflow 训练运算符](https://www.kubeflow.org/docs/components/training/overview/) HyperPod，并由 [SageMaker AI 管理 MLflow来管理](https://docs.aws.amazon.com/sagemaker/latest/dg/mlflow.html) ML 实验和训练运行。

**Topics**
+ [安装 SageMaker HyperPod CLI](sagemaker-hyperpod-eks-run-jobs-access-nodes.md)
+ [SageMaker HyperPod CLI 命令](sagemaker-hyperpod-eks-hyperpod-cli-reference.md)
+ [使用 SageMaker HyperPod CLI 运行作业](sagemaker-hyperpod-eks-run-jobs-hyperpod-cli.md)
+ [使用 `kubectl` 运行作业](sagemaker-hyperpod-eks-run-jobs-kubectl.md)

# 安装 SageMaker HyperPod CLI
<a name="sagemaker-hyperpod-eks-run-jobs-access-nodes"></a>

SageMaker HyperPod 提供了[SageMaker HyperPod 命令行界面](https://github.com/aws/sagemaker-hyperpod-cli) (CLI) 包。

1. 检查本地计算机上的 Python 版本是否在 3.8 和 3.11 之间。

1. 在 [SageMaker HyperPod CLI](https://github.com/aws/sagemaker-hyperpod-cli) 包的 `README` markdown 文件中检查先决条件。

1. 从中克隆 SageMaker HyperPod CLI 包 GitHub。

   ```
   git clone https://github.com/aws/sagemaker-hyperpod-cli.git
   ```

1. 安装 C SageMaker HyperPod LI。

   ```
   cd sagemaker-hyperpod-cli && pip install .
   ```

1. 通过运行以下命令测试 SageMaker HyperPod CLI 是否成功安装。

   ```
   hyperpod --help
   ```

**注意**  
如果您是一名数据科学家并想使用 SageMaker HyperPod CLI，请确保您的集群管理员按照[科学家的 IAM 用户](sagemaker-hyperpod-prerequisites-iam.md#sagemaker-hyperpod-prerequisites-iam-cluster-user)和[设置 Kubernetes 基于角色的访问控制](sagemaker-hyperpod-eks-setup-rbac.md)中的说明正确设置您的 IAM 角色。

# SageMaker HyperPod CLI 命令
<a name="sagemaker-hyperpod-eks-hyperpod-cli-reference"></a>

下表汇总了 C SageMaker HyperPod LI 命令。

**注意**  
有关完整的 CLI 参考，请参阅 C [SageMaker HyperPod LI GitHub 存储库](https://github.com/aws/sagemaker-hyperpod-cli)中的[自述文件](https://github.com/aws/sagemaker-hyperpod-cli?tab=readme-ov-file#sagemaker-hyperpod-command-line-interface)。


| SageMaker HyperPod CLI 命令 | 实体  | 说明 | 
| --- | --- | --- | 
| hyperpod get-clusters | 集群/访问 | 列出用户已获得 IAM 权限向其提交训练工作负载的所有集群提供未运行任何工作负载或任务的全部可用实例的当前快照以及最大容量，按运行状况检查状态分组（例如:） BurnInPassed | 
| hyperpod connect-cluster | 集群/访问 | 配置为kubectl对指定的 HyperPod 集群和命名空间进行操作 | 
| hyperpod start-job  | 作业 | 将作业提交到目标集群-作业名称在名称空间级别将是唯一的-用户可以通过将 yaml 作为 CLI 参数传递来覆盖 yaml 规范 | 
| hyperpod get-job | 作业 | 显示已提交作业的元数据 | 
| hyperpod list-jobs | 作业 | 列出 con cluster/namespace nected 中的所有作业，用户已被添加到 IAM 权限以提交训练工作负载 | 
| hyperpod cancel-job | 作业 | 停止并删除作业，并放弃底层计算资源。该作业无法再次恢复。必要时，需要启动一项新作业。 | 
| hyperpod list-pods | 容器组（pod） | 列出命名空间中给定作业的所有容器组（pod） | 
| hyperpod get-log | 容器组（pod） | 读取指定作业中某个微粒容器组（pod）的日志 | 
| hyperpod exec | 容器组（pod） | 在指定容器组（pod）的 shell 中运行 bash 命令并发布输出结果 | 
| hyperpod --help | 实用程序 | 列出所有支持的命令 | 

# 使用 SageMaker HyperPod CLI 运行作业
<a name="sagemaker-hyperpod-eks-run-jobs-hyperpod-cli"></a>

要运行作业，请确保在 EKS 集群中安装了 Kubeflow Training Operator。有关更多信息，请参阅 [使用 Helm 在 Amazon EKS 集群上安装软件包](sagemaker-hyperpod-eks-install-packages-using-helm-chart.md)。

运行`hyperpod get-cluster`命令以获取可用 HyperPod 集群列表。

```
hyperpod get-clusters
```

运行，`hyperpod connect-cluster`配置 SageMaker HyperPod CLI，让 EKS 集群负责协调集群。 HyperPod 

```
hyperpod connect-cluster --cluster-name <hyperpod-cluster-name>
```

使用 `hyperpod start-job` 命令运行作业。下面的命令显示了带有所需选项的命令。

```
hyperpod start-job \
    --job-name <job-name>
    --image <docker-image-uri>
    --entry-script <entrypoint-script>
    --instance-type <ml.instance.type>
    --node-count <integer>
```

`hyperpod start-job` 命令还包含各种选项，如作业自动恢复和作业调度。

## 启用作业自动恢复
<a name="sagemaker-hyperpod-eks-run-jobs-hyperpod-cli-enable-auto-resume"></a>

`hyperpod start-job` 命令还有以下选项用于指定作业自动恢复。要使用 SageMaker HyperPod节点弹性功能启用作业自动恢复，必须将该`restart-policy`选项的值设置为。`OnFailure`作业必须在 `kubeflow` 命名空间或以 `hyperpod` 为前缀的命名空间下运行。
+ [--auto-resume<bool>] \$1可选项，启用作业失败后自动恢复，默认为 false
+ [--max-retry<int>] \$1可选项，如果自动恢复为 true，如果未指定，最大重试默认为 1
+ [--restart-policy<enum>] \$1Optional，重启策略。 PyTorchJob 可用值为 `Always`、`OnFailure`、`Never` 或 `ExitCode`。默认值为 `OnFailure`。

```
hyperpod start-job \
    ... // required options \
    --auto-resume true \
    --max-retry 3 \
    --restart-policy OnFailure
```

## 使用调度选项运行作业
<a name="sagemaker-hyperpod-eks-run-jobs-hyperpod-cli-scheduling"></a>

`hyperpod start-job` 命令有以下选项，用于使用队列机制设置作业。

**注意**  
您需要在 EKS 集群中安装 [Kueue](https://kueue.sigs.k8s.io/docs/overview/)。如果您尚未安装，请按照[SageMaker HyperPod 任务管理设置](sagemaker-hyperpod-eks-operate-console-ui-governance-setup.md)中的说明进行安装。
+ [--scheduler-type<enum>] \$1可选项，指定调度程序类型。默认值为 `Kueue`。
+ [--queue-name<string>] \$1可选项，指定要与作业一起提交的[本地队列](https://kueue.sigs.k8s.io/docs/concepts/local_queue/)或[集群队列](https://kueue.sigs.k8s.io/docs/concepts/cluster_queue/)的名称。队列应由集群管理员使用 `CreateComputeQuota` 创建。
+ [--priority<string>] \$1可选项，指定应由集群管理员创建的[工作负载优先级类别](https://kueue.sigs.k8s.io/docs/concepts/workload_priority_class/)的名称。

```
hyperpod start-job \
    ... // required options
    --scheduler-type Kueue \
    --queue-name high-priority-queue \
    --priority high
```

## 从配置文件运行作业
<a name="sagemaker-hyperpod-eks-run-jobs-hyperpod-cli-from-config"></a>

另一种方法是创建包含作业所需全部参数的作业配置文件，然后使用 --config-file 选项将该配置文件传递给 `hyperpod start-job` 命令。在本例中：

1. 创建包含所需参数的作业配置文件。有关[基准配置文件，请参阅 SageMaker HyperPod CLI GitHub 存储库中的作业配置文件](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-eks-run-jobs-hyperpod-cli.html#sagemaker-hyperpod-eks-hyperpod-cli-from-config)。

1. 使用配置文件启动作业，如下所示。

   ```
   hyperpod start-job --config-file /path/to/test_job.yaml
   ```

**提示**  
有关`hyperpod start-job`命令参数的完整列表，请参阅 SageMaker HyperPod CLI GitHub 存储库中的 “[提交 Job](https://github.com/aws/sagemaker-hyperpod-cli?tab=readme-ov-file#submitting-a-job)” 部分。`README.md`

# 使用 `kubectl` 运行作业
<a name="sagemaker-hyperpod-eks-run-jobs-kubectl"></a>

**注意**  
训练作业自动恢复需要 Kubeflow Training Operator 发行版 `1.7.0`、`1.8.0` 或 `1.8.1`。

请注意，您应使用 Helm 图表在集群中安装 Kubeflow 训练操作员。有关更多信息，请参阅 [使用 Helm 在 Amazon EKS 集群上安装软件包](sagemaker-hyperpod-eks-install-packages-using-helm-chart.md)。运行以下命令验证 Kubeflow Training Operator 控制面板是否设置正确。

```
kubectl get pods -n kubeflow
```

返回的输出结果应与下面类似。

```
NAME                                             READY   STATUS    RESTARTS   AGE
training-operator-658c68d697-46zmn               1/1     Running   0          90s
```

**提交训练作业**

要运行训练作业，请准备作业配置文件并运行 [https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#apply](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#apply) 命令，如下所示。

```
kubectl apply -f /path/to/training_job.yaml
```

**描述训练作业**

要检索提交给 EKS 集群的作业详情，请使用以下命令。它返回作业信息，如作业提交时间、完成时间、作业状态和配置详情。

```
kubectl get -o yaml training-job -n kubeflow
```

**停止训练作业并删除 EKS 资源**

要停止训练作业，请使用 kubectl delete。下面是停止根据配置文件 `pytorch_job_simple.yaml` 创建的训练作业的示例。

```
kubectl delete -f /path/to/training_job.yaml 
```

这应该返回以下输出内容。

```
pytorchjob.kubeflow.org "training-job" deleted
```

**启用作业自动恢复**

SageMaker HyperPod 支持 Kubernetes 作业的作业自动恢复功能，与 Kubeflow 训练操作员控制平面集成。

确保集群中有足够的节点已通过 SageMaker HyperPod 运行状况检查。节点的污点 `sagemaker.amazonaws.com/node-health-status` 应设置为 `Schedulable`。建议在作业 YAML 文件中包含一个节点选择器，以选择具有相应配置的节点，如下所示。

```
sagemaker.amazonaws.com/node-health-status: Schedulable
```

以下代码片段是如何修改 Kubeflow PyTorch 作业 YAML 配置以启用作业自动恢复功能的示例。您需要添加两个注释，并将 `restartPolicy` 设置为 `OnFailure`，如下所示。

```
apiVersion: "kubeflow.org/v1"
kind: PyTorchJob 
metadata:
    name: pytorch-simple
    namespace: kubeflow
    annotations: { // config for job auto resume
      sagemaker.amazonaws.com/enable-job-auto-resume: "true"
      sagemaker.amazonaws.com/job-max-retry-count: "2"
    }
spec:
  pytorchReplicaSpecs:
  ......
  Worker:
      replicas: 10
      restartPolicy: OnFailure
      template:
          spec:
              nodeSelector:
                  sagemaker.amazonaws.com/node-health-status: Schedulable
```

**检查作业自动恢复状态**

运行以下命令检查作业自动恢复的状态。

```
kubectl describe pytorchjob -n kubeflow <job-name>
```

根据故障规律，您可能会看到以下两种 Kubeflow 训练作业重启规律。

**规律 1**：

```
Start Time:    2024-07-11T05:53:10Z
Events:
  Type     Reason                   Age                    From                   Message
  ----     ------                   ----                   ----                   -------
  Normal   SuccessfulCreateService  9m45s                  pytorchjob-controller  Created service: pt-job-1-worker-0
  Normal   SuccessfulCreateService  9m45s                  pytorchjob-controller  Created service: pt-job-1-worker-1
  Normal   SuccessfulCreateService  9m45s                  pytorchjob-controller  Created service: pt-job-1-master-0
  Warning  PyTorchJobRestarting     7m59s                  pytorchjob-controller  PyTorchJob pt-job-1 is restarting because 1 Master replica(s) failed.
  Normal   SuccessfulCreatePod      7m58s (x2 over 9m45s)  pytorchjob-controller  Created pod: pt-job-1-worker-0
  Normal   SuccessfulCreatePod      7m58s (x2 over 9m45s)  pytorchjob-controller  Created pod: pt-job-1-worker-1
  Normal   SuccessfulCreatePod      7m58s (x2 over 9m45s)  pytorchjob-controller  Created pod: pt-job-1-master-0
  Warning  PyTorchJobRestarting     7m58s                  pytorchjob-controller  PyTorchJob pt-job-1 is restarting because 1 Worker replica(s) failed.
```

**规律 2**：

```
Events:
  Type    Reason                   Age    From                   Message
  ----    ------                   ----   ----                   -------
  Normal  SuccessfulCreatePod      19m    pytorchjob-controller  Created pod: pt-job-2-worker-0
  Normal  SuccessfulCreateService  19m    pytorchjob-controller  Created service: pt-job-2-worker-0
  Normal  SuccessfulCreatePod      19m    pytorchjob-controller  Created pod: pt-job-2-master-0
  Normal  SuccessfulCreateService  19m    pytorchjob-controller  Created service: pt-job-2-master-0
  Normal  SuccessfulCreatePod      4m48s  pytorchjob-controller  Created pod: pt-job-2-worker-0
  Normal  SuccessfulCreatePod      4m48s  pytorchjob-controller  Created pod: pt-job-2-master-0
```