

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

# 在 SageMaker HyperPod 集群中更新您的 AMI 版本
<a name="sagemaker-hyperpod-release-ami-update"></a>

A SageMaker HyperPod mazon Amazon 机器映像 (AMIs) 是用于分布式机器学习工作负载和高性能计算的专用机器映像。每个 AMI 都预装了驱动程序、机器学习框架、训练库以及性能监控工具。通过更新集群中的 AMI 版本，您可以在训练作业和工作流中使用这些组件及软件包的最新版本。

 在更新集群中的 AMI 版本时，您可以选择立即执行更新、安排一次性更新，或使用 cron 表达式创建周期性计划。您也可以选择更新一个实例组中的所有实例，或者仅分批次更新实例。如果您选择批量更新，则可以设置 SageMaker AI 一次应升级的实例的百分比或数量。如果您使用这种更新方法，则可以设置 SageMaker AI 应在批次之间等待多长时间的间隔。

如果您选择批量更新，还可以纳入警报和指标列表。在等待间隔 SageMaker 内，AI 会观察这些指标，如果有任何指标超过其阈值，则相应的警报将进入警报状态， SageMaker AI 会回滚 AMI 更新。要使用自动回滚，IAM 执行角色必须具有权限 `cloudwatch:DescribeAlarms`。

**注意**  
批量更新集群仅适用于与 Amazon EKS HyperPod 集成的集群。此外，如果您要创建多个计划，建议您在各个计划之间预留一段时间缓冲。如果计划出现重叠，更新可能会失败。

有关您的 HyperPod 集群的每个 AMI 版本的更多信息，请参阅[亚马逊 SageMaker HyperPod AMI](sagemaker-hyperpod-release-ami.md)。有关常规 HyperPod 版本的更多信息，请参阅[亚马逊 SageMaker HyperPod 发行说明](sagemaker-hyperpod-release-notes.md)。

您可以使用 SageMaker AI API 或 CLI 操作来更新集群或查看特定集群的计划更新。如果您使用的是 AWS 控制台，请按照以下步骤操作：

**注意**  
使用 AWS 控制台更新您的 AMI 仅适用于与 Amazon EKS 集成的集群。如果你有 Slurm 集群，则必须使用 SageMaker AI API 或 CLI 操作。

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

1. 在左侧，展开**HyperPod 集群**，然后选择**集群管理**。

1. 选择要更新的集群，然后选择**详细信息**和**更新 AMI**。



要通过编程方式创建和管理更新计划，请使用以下 API 操作：
+ [CreateCluster](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateCluster.html)— 在指定更新计划的同时创建集群
+ [UpdateCluster](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_UpdateCluster.html)— 更新集群以添加更新计划
+ [ UpdateClusterSoftware](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_UpdateClusterSoftware.html)— 更新集群的平台软件
+ [ DescribeCluster](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeCluster.html)— 查看您为集群创建的更新计划
+ [DescribeClusterNode](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeClusterNode.html)以及 [ListClusterNodes](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ListClusterNodes.html)— 查看上次更新集群的时间。

## 所需的权限
<a name="sagemaker-hyperpod-release-ami-update-permissions"></a>

根据您在 Amazon EK HyperPod S 集群中配置[容器中断预算](https://kubernetes.io/docs/tasks/run-application/configure-pdb/)的方式，在 AMI 更新过程中驱逐容器、释放节点并阻止任何更新计划。如果违反了预算内的任何限制，则在 AMI 更新期间 HyperPod 跳过该节点。 SageMaker HyperPod 要正确驱逐 pod，必须向 HyperPod 服务相关角色添加必要的权限。以下 yaml 文件具有必要的权限。

```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: hyperpod-patching
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["list"]
- apiGroups: [""]
  resources: ["pods/eviction"]
  verbs: ["create"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: hyperpod-patching
subjects:
- kind: User
  name: hyperpod-service-linked-role
roleRef:
  kind: ClusterRole
  name: hyperpod-patching
  apiGroup: rbac.authorization.k8s.io
```

使用以下命令可应用权限。

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

cd sagemaker-hyperpod-cli/helm_chart

helm upgrade hyperpod-dependencies HyperPodHelmChart --namespace kube-system --install
```

## Cron 表达式
<a name="sagemaker-hyperpod-release-ami-update-cron"></a>

要配置特定时间的一次性更新或周期性计划，请使用 cron 表达式。cron 表达式支持六个字段，各字段之间用空格分隔。所有六个字段均为必填字段。

```
cron({{Minutes}} {{Hours}} {{Day-of-month}} {{Month}} {{Day-of-week}} {{Year}})
```


| **字段** | **值** | **通配符** | 
| --- | --- | --- | 
| Minutes | 00 – 59 | 不适用 | 
| Hours | 00 – 23 | 不适用 | 
| D ay-of-month | 01 – 31 | ? | 
| Month | 01 – 12 | \* / | 
| D ay-of-week | 1 – 7 或 MON-SUN | ? \# L | 
| Year | 当前年份 – 2099 | \* | 

**通配符**
+ **\***（星号）通配符包含该字段中的所有值。在 `Hours` 字段中，**\*** 将包含每个小时。
+ **/**（正斜杠）通配符用于指定增量。在 `Months` 字段中，您可以输入 **\*/3** 来指定每三个月执行一次。
+ **?**（问号）通配符用于指定一个或另一个。在`Day-of-month`字段中你可以输入 **7**，如果你不在乎第七天是什么日子，你可以输入**？** 在 Day-of-week野外。
+ `day-of-week` 字段中的 **L** 通配符用于指定月或周的最后一天。例如，`5L` 表示当月的最后一个星期五。
+  ay-of-week字段中的 **\#** 通配符指定一个月内一周中指定某一天的特定实例。例如，3\#2 指该月的第二个星期二：3 指的是星期二，因为它是每周的第三天，2 是指该月内该类型的第二天。

您可以将 cron 表达式用于以下场景：
+ 在特定日期和时间运行的一次性计划。你可以使用`?`通配符来表示这一点， day-of-month也可以无关紧 day-of-week要。

  ```
  cron(30 14 ? 12 MON 2024)
  ```

  ```
  cron(30 14 15 12 ? 2024)
  ```
+ 在特定日期和时间运行的每周计划。以下示例创建了一个无论如何均在每周一中午 12:00 运行的时间表。 day-of-month

  ```
  cron(00 12 ? * 1 *)
  ```
+ 每月计划，无论如何，每月运行一次 day-of-week. 以下计划在每个月 15 日的中午 12:30 运行。

  ```
  cron(30 12 15 * ? *)
  ```
+ 使用的月度计划 day-of-week.

  ```
  cron(30 12 ? * MON *)
  ```
+ 要创建每 N 个月运行一次的计划，请使用 `/` 通配符。以下示例创建了每 3 个月运行一次的每月计划。以下两个示例演示了它如何与 day-of-week和配合使用 day-of-month。

  ```
  cron(30 12 15 */3 ? *)
  ```

  ```
  cron(30 12 ? */3 MON *)
  ```
+ 在指定的星期几对特定实例运行的计划。以下示例创建了一个计划，该计划在每个月第二个星期一的中午 12:30 运行。

  ```
  cron(30 12 ? * 1#2 *)
  ```
+ 在指定的星期几对最后一个实例运行的计划。以下计划在每个月最后一个星期一的中午 12:30 运行。

  ```
  cron(30 12 ? * 1L *)
  ```