

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

Amazon SageMaker HyperPod Amazon Machine Image (AMI) 是特殊化的機器映像，適用於分散式機器學習工作負載和高效能運算。每個 AMI 都會預先載入驅動程式、機器學習架構、訓練程式庫和效能監控工具。透過更新您叢集中的 AMI 版本，您可以將這些元件和套件的最新版本用於訓練任務和工作流程。

 在更新您叢集內的 AMI 版本時，您可以選擇立即處理更新、排程僅限一次的更新，或使用 Cron 表達式建立週期性排程。您也可以選擇更新執行個體群組中的所有執行個體，或僅批次更新執行個體。如果選擇批次更新，您可以設定 SageMaker AI 應該一次升級的執行個體百分比或數量。如果使用此更新方法，您可以設定 SageMaker AI 在批次之間應等待多久的間隔。

如果選擇批次更新，您也可以包含警示和指標的清單。在等待間隔期間，SageMaker AI 會觀察這些指標，如果有任何指標超過閾值，對應警示便會進入 ALARM 狀態，而 SageMaker AI 則會復原 AMI 更新。若要使用自動復原，您的 IAM 執行角色必須具有許可 `cloudwatch:DescribeAlarms`。

**注意**  
批次更新叢集僅適用於與 Amazon EKS 整合的 HyperPod 叢集。此外，如果您要建立多個排程，我們建議您在排程之間有一個緩衝時間。如果排程重疊，更新可能會失敗。

如需 HyperPod 叢集每個 AMI 版本的詳細資訊，請參閱 [Amazon SageMaker HyperPod AMI](sagemaker-hyperpod-release-ami.md)。如需一般 HyperPod 版本的詳細資訊，請參閱 [Amazon SageMaker HyperPod 版本備註](sagemaker-hyperpod-release-notes.md)。

您可以使用 SageMaker AI API 或 CLI 操作來更新叢集，或查看特定叢集的排程更新。如果您使用的是 AWS 主控台，請遵循下列步驟：

**注意**  
使用 AWS 主控台更新您的 AMI 僅適用於與 Amazon EKS 整合的叢集。如果您有 Slurm 叢集，則必須使用 SageMaker AI API 或 CLI 操作。

1. 開啟 Amazon SageMaker AI 主控台，網址為 [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 EKS 叢集中設定 [Pod 中斷預算](https://kubernetes.io/docs/tasks/run-application/configure-pdb/)的方式，HyperPod 會移出 Pod、釋出節點，並防止在 AMI 更新過程中進行任何更新排程。如果違反了預算中的任何限制條件，HyperPod 會在 AMI 更新期間略過該節點。若要讓 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}})
```


| **欄位** | **Values (數值)** | **萬用字元** | 
| --- | --- | --- | 
| 分鐘 | 00 – 59 | N/A | 
| 小時 | 00 – 23 | N/A | 
| 月中的日 | 01 – 31 | ? | 
| 月 | 01 – 12 | \* / | 
| 週中的日 | 1 – 7 或 MON-SUN | ? \# L | 
| 年 | 本年度 – 2099 | \* | 

**萬用字元**
+ **\*** (星號) 包含欄位中所有的值。在 `Hours` 欄位，**\*** 包含每個小時。
+ **/** (斜線) 萬用字元用於指定增量。在 `Months` 欄位中，您可以輸入 **\*/3** 來指定每 3 個月一次。
+ **?** (問號) 萬用字元用於表示不限定任何一個。在 `Day-of-month` 欄位，您可以輸入 **7**，如果您不在意這個月的 7 號是星期幾，就可以在 Day-of-week (週中的日) 欄位中輸入 **?**。
+ `day-of-week` 或欄位中的 **L** 萬用字元指定該月或週的最後一天。例如，`5L` 表示該月的最後一個星期五。
+ 星期幾欄位中的 **\#** 萬用字元指定一個月內指定星期幾的某個執行個體。例如，3\#2 代表則該月的第二個星期二：3 是指星期二，因為它是每週的第三天，2 指的是一個月內該類型的第二天。

您可以將 Cron 表達式用於以下案例：
+ 在特定時間和日子執行的一次性排程。您可以使用 `?` 萬用字元來表示幾號或星期幾並不重要。

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

  ```
  cron(30 14 15 12 ? 2024)
  ```
+ 在特定時間和日子執行的每週排程。以下範例建立了一個無論幾號都在每個星期一中午 12:00 執行的排程。

  ```
  cron(00 12 ? * 1 *)
  ```
+ 每個月執行的每月排程，無論星期幾。下列排程會在每月 15 號的中午 12:30 執行。

  ```
  cron(30 12 15 * ? *)
  ```
+ 使用星期幾的每月排程。

  ```
  cron(30 12 ? * MON *)
  ```
+ 若要建立每第 N 個月執行的排程，請使用 `/` 萬用字元。下列範例會建立每 3 個月執行的每月排程。下列兩個範例示範如何使用星期幾和幾號。

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

  ```
  cron(30 12 ? */3 MON *)
  ```
+ 在指定星期幾的某個執行個體上執行的排程。下列範例會建立一個在每個月第二個星期一中午 12:30 執行的排程。

  ```
  cron(30 12 ? * 1#2 *)
  ```
+ 在指定星期幾的最後一個執行個體上執行的排程。下列排程會在每個月最後一個星期一的中午 12:30 執行。

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