

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

# SageMaker HyperPod 食谱
<a name="sagemaker-hyperpod-recipes"></a>

Amazon SageMaker HyperPod 配方是预先配置的训练堆栈，可帮助您快速开始训练和微调来自各种模型系列（例如 Llama、Mistral、Mixtral 或FMs）的公开基础模型 ()。 AWS DeepSeekRecipes 可以自动执行 end-to-end训练循环，包括加载数据集、应用分布式训练技术以及管理检查点以更快地从故障中恢复。

SageMaker HyperPod 对于可能不具备深厚机器学习专业知识的用户来说，配方特别有益，因为它们消除了训练大型模型所涉及的大部分复杂性。

你可以在内部运行食谱， SageMaker HyperPod 也可以作为 SageMaker 训练作业运行食谱。

下表保存在 SageMaker HyperPod GitHub 存储库中，提供了 up-to-date有关支持预训练和微调的模型、它们各自的配方和启动脚本、支持的实例类型等的最多信息。
+ 有关可进行预训练的模型、配方和启动脚本的最新列表，请参阅[预训练表](https://github.com/aws/sagemaker-hyperpod-recipes?tab=readme-ov-file#pre-training)。
+ 有关可进行微调的模型、配方和启动脚本的最新列表，请参阅[微调表](https://github.com/aws/sagemaker-hyperpod-recipes?tab=readme-ov-file#fine-tuning)。

对于 SageMaker HyperPod 用户而言， end-to-end训练工作流程的自动化来自于训练适配器与 SageMaker HyperPod 配方的集成。训练适配器基于 [NVIDIA NeMo 框架](https://docs.nvidia.com/nemo-framework/user-guide/latest/overview.html)和 N [euronx 分布式训练](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/libraries/neuronx-distributed/index.html)软件包构建。如果您熟悉使用训练适配器 NeMo，则使用训练适配器的过程是相同的。训练适配器在集群上运行配方。

![\[该图显示了 SageMaker HyperPod 配方工作流程。顶部的 “食谱” 图标会进入 “HyperPod 食谱启动器” 盒子。此框连接到标有“集群：Slurm、K8s...”的较大部分，其中包含三个 GPU 图标以及关联的配方文件。集群部分的底部标有 “使用 HyperPod 训练适配器进行训练”。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/sagemaker-hyperpod-recipes-overview.png)


您也可以通过定义自己的自定义配方来训练自己的模型。

要开始某个教程，请参阅[教程](sagemaker-hyperpod-recipes-tutorials.md)。

**Topics**
+ [

# 教程
](sagemaker-hyperpod-recipes-tutorials.md)
+ [

# 默认配置
](default-configurations.md)
+ [

# 特定于集群的配置
](cluster-specific-configurations.md)
+ [

# 注意事项
](cluster-specific-configurations-special-considerations.md)
+ [

# 高级设置
](cluster-specific-configurations-advanced-settings.md)
+ [

# 附录
](appendix.md)

# 教程
<a name="sagemaker-hyperpod-recipes-tutorials"></a>

以下快速入门教程可帮助您开始使用配方来进行训练：
+ SageMaker HyperPod 使用 Slurm 编排
  + 预训练
    + [HyperPod Slurm 集群预训练教程 (GPU)](hyperpod-gpu-slurm-pretrain-tutorial.md)
    + [Trainium Slurm 集群预训练教程](hyperpod-trainium-slurm-cluster-pretrain-tutorial.md)
  + 微调
    + [HyperPod Slurm cluster peft-Lora 教程 (GPU)](hyperpod-gpu-slurm-peft-lora-tutorial.md)
    + [HyperPod Slurm 集群 DPO 教程 (GPU)](hyperpod-gpu-slurm-dpo-tutorial.md)
+ SageMaker HyperPod 使用 K8s 编排
  + 预训练
    + [Kubernetes 集群预训练教程（GPU）](sagemaker-hyperpod-gpu-kubernetes-cluster-pretrain-tutorial.md)
    + [Trainium SageMaker 训练作业预训练教程](sagemaker-hyperpod-trainium-sagemaker-training-jobs-pretrain-tutorial.md)
+ SageMaker 培训工作
  + 预训练
    + [SageMaker 训练作业预训练教程 (GPU)](sagemaker-hyperpod-gpu-sagemaker-training-jobs-pretrain-tutorial.md)
    + [Trainium SageMaker 训练作业预训练教程](sagemaker-hyperpod-trainium-sagemaker-training-jobs-pretrain-tutorial.md)

# HyperPod Slurm 集群预训练教程 (GPU)
<a name="hyperpod-gpu-slurm-pretrain-tutorial"></a>

按照以下教程操作，设置 Slurm 环境并在 Llama 80 亿参数模型上开始训练作业。

**先决条件**  
在开始设置环境以运行配方之前，请确保您：  
设置 HyperPod GPU Slurm 集群。  
你的 HyperPod Slurm 集群必须启用 Nvidia Enroot 和 Pyxis（默认情况下它们处于启用状态）。
拥有一个共享存储位置。它可以是 Amazon FSx 文件系统或可从群集节点访问的 NFS 系统。
拥有采用以下格式之一的数据：  
JSON
JSONGZ（压缩 JSON）
ARROW
（可选）如果您使用中的模型权重进行预训练或微调，则必须获得 HuggingFace 代币。 HuggingFace 有关获取令牌的更多信息，请参阅[用户访问令牌](https://huggingface.co/docs/hub/en/security-tokens)。

## HyperPod GPU Slurm 环境设置
<a name="hyperpod-gpu-slurm-environment-setup"></a>

要在 HyperPod GPU Slurm 集群上启动训练作业，请执行以下操作：

1. 通过 SSH 连接到 Slurm 集群的头节点。

1. 登录后，设置虚拟环境。确保您使用 Python 3.9 或更高版本。

   ```
   #set up a virtual environment
   python3 -m venv ${PWD}/venv
   source venv/bin/activate
   ```

1. 将 SageMaker HyperPod 配方和 SageMaker HyperPod 适配器存储库克隆到共享存储位置。

   ```
   git clone https://github.com/aws/sagemaker-hyperpod-training-adapter-for-nemo.git
   git clone --recursive https://github.com/aws/sagemaker-hyperpod-recipes.git
   cd sagemaker-hyperpod-recipes
   pip3 install -r requirements.txt
   ```

1. 使用 Enroot 创建一个 squash 文件。要查找最新版本的 SMP 容器，请参阅 [SageMaker 模型并行度库的发行说明](model-parallel-release-notes.md)。要更深入地了解如何使用 Enroot 文件，请参阅[构建 AWS经过优化的 Nemo-](https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/2.nemo-launcher#2-build-aws-optimized-nemo-launcher-image) Launcher 镜像。

   ```
   REGION="<region>"
   IMAGE="658645717510.dkr.ecr.${REGION}.amazonaws.com/smdistributed-modelparallel:2.4.1-gpu-py311-cu121"
   aws ecr get-login-password --region ${REGION} | docker login --username AWS --password-stdin 658645717510.dkr.ecr.${REGION}.amazonaws.com
   enroot import -o $PWD/smdistributed-modelparallel.sqsh dockerd://${IMAGE}
   mv $PWD/smdistributed-modelparallel.sqsh "/fsx/<any-path-in-the-shared-filesystem>"
   ```

1. 要使用 Enroot squash 文件开始训练，请使用以下示例来修改 `recipes_collection/config.yaml` 文件。

   ```
   container: /fsx/path/to/your/smdistributed-modelparallel.sqsh
   ```

## 启动训练作业
<a name="hyperpod-gpu-slurm-launch-training-job"></a>

安装依赖项后，从 `sagemaker-hyperpod-recipes/launcher_scripts` 目录中启动训练作业。你可以通过克隆[SageMaker HyperPod 配方存储库](https://github.com/aws/sagemaker-hyperpod-recipes)来获得依赖关系：

首先，从 Github 中选择训练配方，模型名称将被指定为配方的一部分。在以下示例中，我们使用 `launcher_scripts/llama/run_hf_llama3_8b_seq16k_gpu_p5x16_pretrain.sh` 脚本启动 Llama 8b，带序列长度 8192 的预训练配方 `llama/hf_llama3_8b_seq16k_gpu_p5x16_pretrain`。
+ `IMAGE`：环境设置部分中的容器。
+ （可选）如果您需要预先训练的权重，则 HuggingFace 可以通过设置以下键值对来提供 HuggingFace 标记：

  ```
  recipes.model.hf_access_token=<your_hf_token>
  ```

```
#!/bin/bash
IMAGE="${YOUR_IMAGE}"
SAGEMAKER_TRAINING_LAUNCHER_DIR="${SAGEMAKER_TRAINING_LAUNCHER_DIR:-${PWD}}"

TRAIN_DIR="${YOUR_TRAIN_DIR}" # Location of training dataset
VAL_DIR="${YOUR_VAL_DIR}" # Location of validation dataset

# experiment ouput directory
EXP_DIR="${YOUR_EXP_DIR}"

HYDRA_FULL_ERROR=1 python3 "${SAGEMAKER_TRAINING_LAUNCHER_DIR}/main.py" \
  recipes=training/llama/hf_llama3_8b_seq16k_gpu_p5x16_pretrain \
  base_results_dir="${SAGEMAKER_TRAINING_LAUNCHER_DIR}/results" \
  recipes.run.name="hf_llama3_8b" \
  recipes.exp_manager.exp_dir="$EXP_DIR" \
  recipes.model.data.train_dir="$TRAIN_DIR" \
  recipes.model.data.val_dir="$VAL_DIR" \
  container="${IMAGE}" \
  +cluster.container_mounts.0="/fsx:/fsx"
```

在启动程序脚本中配置所有必需参数后，可使用以下命令运行脚本。

```
bash launcher_scripts/llama/run_hf_llama3_8b_seq16k_gpu_p5x16_pretrain.sh
```

有关 Slurm 集群配置的更多信息，请参阅[在 HyperPod Slurm 上运行训练作业](cluster-specific-configurations-run-training-job-hyperpod-slurm.md)。

# Trainium Slurm 集群预训练教程
<a name="hyperpod-trainium-slurm-cluster-pretrain-tutorial"></a>

按照以下教程操作，在 Slurm 集群上设置 Trainium 环境，并在 Llama 80 亿参数模型上开始训练作业。

**先决条件**  
在开始设置环境之前，请确保您：  
设置 SageMaker HyperPod Trainium Slurm 集群。
拥有一个共享存储位置。它可以是可从群集节点访问的 Amazon FSx 文件系统或 NFS 系统。
拥有采用以下格式之一的数据：  
JSON
JSONGZ（压缩 JSON）
ARROW
（可选）如果您使用中的模型权重进行预训练或微调，则必须获得 HuggingFace 代币。 HuggingFace 有关获取令牌的更多信息，请参阅[用户访问令牌](https://huggingface.co/docs/hub/en/security-tokens)。

## 在 Slurm 集群上设置 Trainium 环境
<a name="hyperpod-trainium-slurm-cluster-pretrain-setup-trainium-environment"></a>

要在 Slurm 集群上启动训练作业，请执行以下操作：
+ 通过 SSH 连接到 Slurm 集群的头节点。
+ 登录后，设置 Neuron 环境。有关设置 Neuron 的信息，请参阅 [Neuron 设置步骤](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/libraries/nxd-training/tutorials/hf_llama3_8B_SFT.html#setting-up-the-environment)。我们建议使用预安装了 Neuron 驱动程序的深度学习 AMI，例如[带 DLAMI Pytorch 的 Ubuntu 20](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/general/setup/neuron-setup/pytorch/neuronx/ubuntu/torch-neuronx-ubuntu20-pytorch-dlami.html#setup-torch-neuronx-ubuntu20-dlami-pytorch)。
+ 将 SageMaker HyperPod 配方存储库克隆到集群中的共享存储位置。共享存储位置可以是可从群集节点访问的 Amazon FSx 文件系统或 NFS 系统。

  ```
  git clone --recursive https://github.com/aws/sagemaker-hyperpod-recipes.git
  cd sagemaker-hyperpod-recipes
  pip3 install -r requirements.txt
  ```
+ 阅读以下教程：[HuggingFace Llama](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/libraries/nxd-training/tutorials/hf_llama3_8B_pretraining.html#) 3-8B 预训练
+ 准备模型配置。Neuron 存储库中提供的模型配置。有关本教程中使用的模型配置，请参阅 [llama3 8b 模型配置](https://github.com/aws-neuron/neuronx-distributed/blob/main/examples/training/llama/tp_zero1_llama_hf_pretrain/8B_config_llama3/config.json)

## 在 Trainium 中启动训练作业
<a name="hyperpod-trainium-slurm-cluster-pretrain-launch-training-job-trainium"></a>

要在 Trainium 中启动训练作业，请指定集群配置和 Neuron 配方。例如，要在 Trainium 中启动 llama3 8b 预训练作业，请将启动脚本 `launcher_scripts/llama/run_hf_llama3_8b_seq8k_trn1x4_pretrain.sh` 设置为以下内容：
+ `MODEL_CONFIG`：环境设置部分中的模型配置
+ （可选）如果您需要预先训练的权重，则 HuggingFace 可以通过设置以下键值对来提供 HuggingFace 标记：

  ```
  recipes.model.hf_access_token=<your_hf_token>
  ```

```
#!/bin/bash

#Users should set up their cluster type in /recipes_collection/config.yaml

SAGEMAKER_TRAINING_LAUNCHER_DIR=${SAGEMAKER_TRAINING_LAUNCHER_DIR:-"$(pwd)"}

COMPILE=0
TRAIN_DIR="${TRAIN_DIR}" # Location of training dataset
MODEL_CONFIG="${MODEL_CONFIG}" # Location of config.json for the model

HYDRA_FULL_ERROR=1 python3 "${SAGEMAKER_TRAINING_LAUNCHER_DIR}/main.py" \
    base_results_dir="${SAGEMAKER_TRAINING_LAUNCHER_DIR}/results" \
    instance_type="trn1.32xlarge" \
    recipes.run.compile="$COMPILE" \
    recipes.run.name="hf-llama3-8b" \
    recipes.trainer.num_nodes=4 \
    recipes=training/llama/hf_llama3_8b_seq8k_trn1x4_pretrain \
    recipes.data.train_dir="$TRAIN_DIR" \
    recipes.model.model_config="$MODEL_CONFIG"
```

要启动训练作业，请运行以下命令：

```
bash launcher_scripts/llama/run_hf_llama3_8b_seq8k_trn1x4_pretrain.sh
```

有关 Slurm 集群配置的更多信息，请参阅[在 HyperPod Slurm 上运行训练作业](cluster-specific-configurations-run-training-job-hyperpod-slurm.md)。

# HyperPod Slurm 集群 DPO 教程 (GPU)
<a name="hyperpod-gpu-slurm-dpo-tutorial"></a>

按照以下教程操作，设置 Slurm 环境并在 Llama 80 亿参数模型上开始直接偏好优化（DPO）。

**先决条件**  
在开始设置环境之前，请确保您：  
设置 HyperPod GPU Slurm 集群  
你的 HyperPod Slurm 集群必须启用 Nvidia Enroot 和 Pyxis（默认情况下它们处于启用状态）。
拥有一个共享存储位置。它可以是可从群集节点访问的 Amazon FSx 文件系统或 NFS 系统。
采用下列格式之一的令牌化二元偏好数据集：  
JSON
JSONGZ（压缩 JSON）
ARROW
（可选）如果您需要预先训练的权重， HuggingFace 或者您正在训练 Llama 3.2 模型，则必须在开始训练之前获取 HuggingFace 代币。有关获取令牌的更多信息，请参阅[用户访问令牌](https://huggingface.co/docs/hub/en/security-tokens)。

## 设置 HyperPod GPU Slurm 环境
<a name="hyperpod-gpu-slurm-dpo-hyperpod-gpu-slurm-environment"></a>

要在 Slurm 集群上启动训练作业，请执行以下操作：
+ 通过 SSH 连接到 Slurm 集群的头节点。
+ 登录后，设置虚拟环境。确保您使用 Python 3.9 或更高版本。

  ```
  #set up a virtual environment
  python3 -m venv ${PWD}/venv
  source venv/bin/activate
  ```
+ 将 SageMaker HyperPod 配方和 SageMaker HyperPod 适配器存储库克隆到共享存储位置。共享存储位置可以是可从群集节点访问的 Amazon FSx 文件系统或 NFS 系统。

  ```
  git clone https://github.com/aws/sagemaker-hyperpod-training-adapter-for-nemo.git
  git clone --recursive https://github.com/aws/sagemaker-hyperpod-recipes.git
  cd sagemaker-hyperpod-recipes
  pip3 install -r requirements.txt
  ```
+ 使用 Enroot 创建一个 squash 文件。要查找最新版本的 SMP 容器，请参阅 [SageMaker 模型并行度库的发行说明](model-parallel-release-notes.md)。有关使用 Enroot 文件的更多信息，请参阅[构建 AWS经过优化的 Nemo-](https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/2.nemo-launcher#2-build-aws-optimized-nemo-launcher-image) Launcher 镜像。

  ```
  REGION="<region>"
  IMAGE="658645717510.dkr.ecr.${REGION}.amazonaws.com/smdistributed-modelparallel:2.4.1-gpu-py311-cu121"
  aws ecr get-login-password --region ${REGION} | docker login --username AWS --password-stdin 658645717510.dkr.ecr.${REGION}.amazonaws.com
  enroot import -o $PWD/smdistributed-modelparallel.sqsh dockerd://${IMAGE}
  mv $PWD/smdistributed-modelparallel.sqsh "/fsx/<any-path-in-the-shared-filesystem>"
  ```
+ 要使用 Enroot squash 文件开始训练，请使用以下示例来修改 `recipes_collection/config.yaml` 文件。

  ```
  container: /fsx/path/to/your/smdistributed-modelparallel.sqsh
  ```

## 启动训练作业
<a name="hyperpod-gpu-slurm-dpo-launch-training-job"></a>

要在单个 Slurm 计算节点上为序列长度为 8192 的 Llama 80 亿参数模型启动 DPO 作业，请将启动脚本 `launcher_scripts/llama/run_hf_llama3_8b_seq8k_gpu_dpo.sh` 设置为以下内容：
+ `IMAGE`：环境设置部分中的容器。
+ `HF_MODEL_NAME_OR_PATH`：在配方的 hf\$1model\$1name\$1or\$1path 参数中定义预训练权重的名称或路径。
+ （可选）如果您需要预先训练的权重，则 HuggingFace 可以通过设置以下键值对来提供 HuggingFace 标记：

  ```
  recipes.model.hf_access_token=${HF_ACCESS_TOKEN}
  ```

**注意**  
在此设置中，用于 DPO 的参考模型是从正在训练的基础模型自动派生出来的（未明确定义单独的参考模型）。DPO 特定的超参数已预配置了以下默认值：  
`beta`：0.1（控制 KL 散度正则化的强度）
`label_smoothing`：0.0（未对偏好标签应用平滑处理）

```
recipes.dpo.beta=${BETA}
recipes.dpo.label_smoothing=${LABEL_SMOOTHING}
```

```
#!/bin/bash
IMAGE="${YOUR_IMAGE}"
SAGEMAKER_TRAINING_LAUNCHER_DIR="${SAGEMAKER_TRAINING_LAUNCHER_DIR:-${PWD}}"

TRAIN_DIR="${YOUR_TRAIN_DIR}" # Location of training dataset
VAL_DIR="${YOUR_VAL_DIR}" # Location of validation dataset
# experiment output directory
EXP_DIR="${YOUR_EXP_DIR}"
HF_ACCESS_TOKEN="${YOUR_HF_TOKEN}"
HF_MODEL_NAME_OR_PATH="${HF_MODEL_NAME_OR_PATH}"
BETA="${BETA}"
LABEL_SMOOTHING="${LABEL_SMOOTHING}"

# Add hf_model_name_or_path and turn off synthetic_data
HYDRA_FULL_ERROR=1 python3 ${SAGEMAKER_TRAINING_LAUNCHER_DIR}/main.py \
recipes=fine-tuning/llama/hf_llama3_8b_seq8k_gpu_dpo \
base_results_dir=${SAGEMAKER_TRAINING_LAUNCHER_DIR}/results \
recipes.run.name="hf_llama3_dpo" \
recipes.exp_manager.exp_dir="$EXP_DIR" \
recipes.model.data.train_dir="$TRAIN_DIR" \
recipes.model.data.val_dir="$VAL_DIR" \
recipes.model.hf_model_name_or_path="$HF_MODEL_NAME_OR_PATH" \
container="${IMAGE}" \
+cluster.container_mounts.0="/fsx:/fsx" \
recipes.model.hf_access_token="${HF_ACCESS_TOKEN}" \
recipes.dpo.enabled=true \
recipes.dpo.beta="${BETA}" \
recipes.dpo.label_smoothing="${LABEL_SMOOTHING}$" \
```

在上一个脚本中配置所有必需的参数后，可以通过运行该脚本来启动训练作业。

```
bash launcher_scripts/llama/run_hf_llama3_8b_seq8k_gpu_dpo.sh
```

有关 Slurm 集群配置的更多信息，请参阅[在 HyperPod Slurm 上运行训练作业](cluster-specific-configurations-run-training-job-hyperpod-slurm.md)。

# HyperPod Slurm cluster peft-Lora 教程 (GPU)
<a name="hyperpod-gpu-slurm-peft-lora-tutorial"></a>

按照以下教程操作，设置 Slurm 环境并在 Llama 80 亿参数模型上启动参数高效微调（PEFT）作业。

**先决条件**  
在开始设置环境之前，请确保您：  
设置 HyperPod GPU Slurm 集群  
你的 HyperPod Slurm 集群必须启用 Nvidia Enroot 和 Pyxis（默认情况下它们处于启用状态）。
拥有一个共享存储位置。它可以是可从群集节点访问的 Amazon FSx 文件系统或 NFS 系统。
拥有采用以下格式之一的数据：  
JSON
JSONGZ（压缩 JSON）
ARROW
（可选）如果您需要预先训练的权重， HuggingFace 或者您正在训练 Llama 3.2 模型，则必须在开始训练之前获取 HuggingFace 代币。有关获取令牌的更多信息，请参阅[用户访问令牌](https://huggingface.co/docs/hub/en/security-tokens)。

## 设置 HyperPod GPU Slurm 环境
<a name="hyperpod-gpu-slurm-peft-lora-setup-hyperpod-gpu-slurm-environment"></a>

要在 Slurm 集群上启动训练作业，请执行以下操作：
+ 通过 SSH 连接到 Slurm 集群的头节点。
+ 登录后，设置虚拟环境。确保您使用 Python 3.9 或更高版本。

  ```
  #set up a virtual environment
  python3 -m venv ${PWD}/venv
  source venv/bin/activate
  ```
+ 将 SageMaker HyperPod 配方和 SageMaker HyperPod 适配器存储库克隆到共享存储位置。共享存储位置可以是可从群集节点访问的 Amazon FSx 文件系统或 NFS 系统。

  ```
  git clone https://github.com/aws/sagemaker-hyperpod-training-adapter-for-nemo.git
  git clone --recursive https://github.com/aws/sagemaker-hyperpod-recipes.git
  cd sagemaker-hyperpod-recipes
  pip3 install -r requirements.txt
  ```
+ 使用 Enroot 创建一个 squash 文件。要查找最新版本的 SMP 容器，请参阅 [SageMaker 模型并行度库的发行说明](model-parallel-release-notes.md)。有关使用 Enroot 文件的更多信息，请参阅[构建 AWS经过优化的 Nemo-](https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/2.nemo-launcher#2-build-aws-optimized-nemo-launcher-image) Launcher 镜像。

  ```
  REGION="<region>"
  IMAGE="658645717510.dkr.ecr.${REGION}.amazonaws.com/smdistributed-modelparallel:2.4.1-gpu-py311-cu121"
  aws ecr get-login-password --region ${REGION} | docker login --username AWS --password-stdin 658645717510.dkr.ecr.${REGION}.amazonaws.com
  enroot import -o $PWD/smdistributed-modelparallel.sqsh dockerd://${IMAGE}
  mv $PWD/smdistributed-modelparallel.sqsh "/fsx/<any-path-in-the-shared-filesystem>"
  ```
+ 要使用 Enroot squash 文件开始训练，请使用以下示例来修改 `recipes_collection/config.yaml` 文件。

  ```
  container: /fsx/path/to/your/smdistributed-modelparallel.sqsh
  ```

## 启动训练作业
<a name="hyperpod-gpu-slurm-peft-lora-launch-training-job"></a>

要在单个 Slurm 计算节点上为序列长度为 8192 的 Llama 80 亿参数模型启动 PEFT 作业，请将启动脚本 `launcher_scripts/llama/run_hf_llama3_8b_seq8k_gpu_lora.sh` 设置为以下内容：
+ `IMAGE`：环境设置部分中的容器。
+ `HF_MODEL_NAME_OR_PATH`：在配方的 hf\$1model\$1name\$1or\$1path 参数中定义预训练权重的名称或路径。
+ （可选）如果您需要预先训练的权重，则 HuggingFace 可以通过设置以下键值对来提供 HuggingFace 标记：

  ```
  recipes.model.hf_access_token=${HF_ACCESS_TOKEN}
  ```

```
#!/bin/bash
IMAGE="${YOUR_IMAGE}"
SAGEMAKER_TRAINING_LAUNCHER_DIR="${SAGEMAKER_TRAINING_LAUNCHER_DIR:-${PWD}}"

TRAIN_DIR="${YOUR_TRAIN_DIR}" # Location of training dataset
VAL_DIR="${YOUR_VAL_DIR}" # Location of validation dataset

# experiment output directory
EXP_DIR="${YOUR_EXP_DIR}"
HF_ACCESS_TOKEN="${YOUR_HF_TOKEN}"
HF_MODEL_NAME_OR_PATH="${YOUR_HF_MODEL_NAME_OR_PATH}"

# Add hf_model_name_or_path and turn off synthetic_data
HYDRA_FULL_ERROR=1 python3 ${SAGEMAKER_TRAINING_LAUNCHER_DIR}/main.py \
    recipes=fine-tuning/llama/hf_llama3_8b_seq8k_gpu_lora \
    base_results_dir=${SAGEMAKER_TRAINING_LAUNCHER_DIR}/results \
    recipes.run.name="hf_llama3_lora" \
    recipes.exp_manager.exp_dir="$EXP_DIR" \
    recipes.model.data.train_dir="$TRAIN_DIR" \
    recipes.model.data.val_dir="$VAL_DIR" \
    recipes.model.hf_model_name_or_path="$HF_MODEL_NAME_OR_PATH" \
    container="${IMAGE}" \
    +cluster.container_mounts.0="/fsx:/fsx" \
    recipes.model.hf_access_token="${HF_ACCESS_TOKEN}"
```

在上一个脚本中配置所有必需的参数后，可以通过运行该脚本来启动训练作业。

```
bash launcher_scripts/llama/run_hf_llama3_8b_seq8k_gpu_lora.sh
```

有关 Slurm 集群配置的更多信息，请参阅[在 HyperPod Slurm 上运行训练作业](cluster-specific-configurations-run-training-job-hyperpod-slurm.md)。

# Kubernetes 集群预训练教程（GPU）
<a name="sagemaker-hyperpod-gpu-kubernetes-cluster-pretrain-tutorial"></a>

可通过两种方法在 GPU Kubernetes 集群中启动训练作业：
+ （推荐）[HyperPod 命令行工具](https://github.com/aws/sagemaker-hyperpod-cli)
+  NeMo 风格启动器

**先决条件**  
在开始设置环境之前，请确保您：  
 HyperPod GPU Kubernetes 集群设置正确。
拥有一个共享存储位置。它可以是可从群集节点访问的 Amazon FSx 文件系统或 NFS 系统。
拥有采用以下格式之一的数据：  
JSON
JSONGZ（压缩 JSON）
ARROW
（可选）如果您使用中的模型权重进行预训练或微调，则必须获得 HuggingFace 代币。 HuggingFace 有关获取令牌的更多信息，请参阅[用户访问令牌](https://huggingface.co/docs/hub/en/security-tokens)。

## GPU Kubernetes 环境设置
<a name="sagemaker-hyperpod-gpu-kubernetes-environment-setup"></a>

要设置 GPU Kubernetes 环境，请执行以下操作：
+ 设置虚拟环境。确保您使用 Python 3.9 或更高版本。

  ```
  python3 -m venv ${PWD}/venv
  source venv/bin/activate
  ```
+ 使用下列方法之一安装依赖项：
  + （推荐）：[HyperPod 命令行工具方法](https://github.com/aws/sagemaker-hyperpod-cli)：

    ```
    # install HyperPod command line tools
    git clone https://github.com/aws/sagemaker-hyperpod-cli
    cd sagemaker-hyperpod-cli
    pip3 install .
    ```
  + SageMaker HyperPod 食谱方法：

    ```
    # install SageMaker HyperPod Recipes.
    git clone --recursive git@github.com:aws/sagemaker-hyperpod-recipes.git
    cd sagemaker-hyperpod-recipes
    pip3 install -r requirements.txt
    ```
+ [设置 kubectl 和 eksctl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)
+ [安装 Helm](https://helm.sh/docs/intro/install/)
+ 连接到 Kubernetes 集群

  ```
  aws eks update-kubeconfig --region "CLUSTER_REGION" --name "CLUSTER_NAME"
  hyperpod connect-cluster --cluster-name "CLUSTER_NAME" [--region "CLUSTER_REGION"] [--namespace <namespace>]
  ```

## 使用 SageMaker HyperPod CLI 启动训练作业
<a name="sagemaker-hyperpod-gpu-kubernetes-launch-training-job-cli"></a>

我们建议使用 SageMaker HyperPod 命令行界面 (CLI) 工具提交带有配置的训练作业。以下示例为 `hf_llama3_8b_seq16k_gpu_p5x16_pretrain` 模型提交训练作业。
+ `your_training_container`：深度学习容器。要查找最新版本的 SMP 容器，请参阅 [SageMaker 模型并行度库的发行说明](model-parallel-release-notes.md)。
+ （可选）如果您需要预先训练的权重，则 HuggingFace 可以通过设置以下键值对来提供 HuggingFace 标记：

  ```
  "recipes.model.hf_access_token": "<your_hf_token>"
  ```

```
hyperpod start-job --recipe training/llama/hf_llama3_8b_seq16k_gpu_p5x16_pretrain \
--persistent-volume-claims fsx-claim:data \
--override-parameters \
'{
"recipes.run.name": "hf-llama3-8b",
"recipes.exp_manager.exp_dir": "/data/<your_exp_dir>",
"container": "658645717510.dkr.ecr.<region>.amazonaws.com/smdistributed-modelparallel:2.4.1-gpu-py311-cu121",
"recipes.model.data.train_dir": "<your_train_data_dir>",
"recipes.model.data.val_dir": "<your_val_data_dir>",
"cluster": "k8s",
"cluster_type": "k8s"
}'
```

提交训练作业后，可使用以下命令来验证您是否已成功提交该作业。

```
kubectl get pods
NAME                             READY   STATUS             RESTARTS        AGE
hf-llama3-<your-alias>-worker-0   0/1     running         0               36s
```

如果 `STATUS` 为 `PENDING` 或 `ContainerCreating`，请运行以下命令以获取更多详细信息。

```
kubectl describe pod name_of_pod
```

在作业 `STATUS` 更改为 `Running` 后，可使用以下命令检查日志。

```
kubectl logs name_of_pod
```

在运行 `kubectl get pods` 时，`STATUS` 会变为 `Completed`。

## 使用配方启动程序启动训练作业
<a name="sagemaker-hyperpod-gpu-kubernetes-launch-training-job-recipes"></a>

或者，您可以使用 SageMaker HyperPod 食谱来提交您的训练作业。使用配方需更新 `k8s.yaml`、`config.yaml` 以及运行启动脚本。
+ 在 `k8s.yaml` 中，更新 `persistent_volume_claims`。它将Amazon FSx 声明挂载到每个计算单元的`/data`目录中

  ```
  persistent_volume_claims:
    - claimName: fsx-claim
      mountPath: data
  ```
+ 在 `config.yaml` 中，更新 `git` 下的 `repo_url_or_path`。

  ```
  git:
    repo_url_or_path: <training_adapter_repo>
    branch: null
    commit: null
    entry_script: null
    token: null
  ```
+ 更新 `launcher_scripts/llama/run_hf_llama3_8b_seq16k_gpu_p5x16_pretrain.sh`
  + `your_contrainer`：深度学习容器。要查找最新版本的 SMP 容器，请参阅 [SageMaker 模型并行度库的发行说明](model-parallel-release-notes.md)。
  + （可选）如果您需要预先训练的权重，则 HuggingFace 可以通过设置以下键值对来提供 HuggingFace 标记：

    ```
    recipes.model.hf_access_token=<your_hf_token>
    ```

  ```
  #!/bin/bash
  #Users should setup their cluster type in /recipes_collection/config.yaml
  REGION="<region>"
  IMAGE="658645717510.dkr.ecr.${REGION}.amazonaws.com/smdistributed-modelparallel:2.4.1-gpu-py311-cu121"
  SAGEMAKER_TRAINING_LAUNCHER_DIR=${SAGEMAKER_TRAINING_LAUNCHER_DIR:-"$(pwd)"}
  EXP_DIR="<your_exp_dir>" # Location to save experiment info including logging, checkpoints, ect
  TRAIN_DIR="<your_training_data_dir>" # Location of training dataset
  VAL_DIR="<your_val_data_dir>" # Location of talidation dataset
  
  HYDRA_FULL_ERROR=1 python3 "${SAGEMAKER_TRAINING_LAUNCHER_DIR}/main.py" \
      recipes=training/llama/hf_llama3_8b_seq8k_gpu_p5x16_pretrain \
      base_results_dir="${SAGEMAKER_TRAINING_LAUNCHER_DIR}/results" \
      recipes.run.name="hf-llama3" \
      recipes.exp_manager.exp_dir="$EXP_DIR" \
      cluster=k8s \
      cluster_type=k8s \
      container="${IMAGE}" \
      recipes.model.data.train_dir=$TRAIN_DIR \
      recipes.model.data.val_dir=$VAL_DIR
  ```
+ 启动训练作业

  ```
  bash launcher_scripts/llama/run_hf_llama3_8b_seq16k_gpu_p5x16_pretrain.sh
  ```

提交训练作业后，可使用以下命令来验证您是否已成功提交该作业。

```
kubectl get pods
```

```
NAME READY   STATUS             RESTARTS        AGE
hf-llama3-<your-alias>-worker-0   0/1     running         0               36s
```

如果 `STATUS` 为 `PENDING` 或 `ContainerCreating`，请运行以下命令以获取更多详细信息。

```
kubectl describe pod <name-of-pod>
```

在作业 `STATUS` 更改为 `Running` 后，可使用以下命令检查日志。

```
kubectl logs name_of_pod
```

在运行 `kubectl get pods` 时，`STATUS` 会变成 `Completed`。

有关 k8s 集群配置的更多信息，请参阅[在 HyperPod k8s 上运行训练作业](cluster-specific-configurations-run-training-job-hyperpod-k8s.md)。

# Trainium Kubernetes 集群预训练教程
<a name="sagemaker-hyperpod-trainium-kubernetes-cluster-pretrain-tutorial"></a>

可使用下列方法之一在 Trainium Kubernetes 集群中启动训练作业。
+ （推荐）[HyperPod 命令行工具](https://github.com/aws/sagemaker-hyperpod-cli)
+  NeMo 风格启动器

**先决条件**  
在开始设置环境之前，请确保您：  
设置 HyperPod Trainium Kubernetes 集群
共享存储位置，可以是 Amazon FSx 文件系统或 NFS 系统，可从群集节点进行访问。
拥有采用以下格式之一的数据：  
JSON
JSONGZ（压缩 JSON）
ARROW
（可选）如果您使用中的模型权重进行预训练或微调，则必须获得 HuggingFace 代币。 HuggingFace 有关获取令牌的更多信息，请参阅[用户访问令牌](https://huggingface.co/docs/hub/en/security-tokens)。

## 设置 Trainium Kubernetes 环境
<a name="sagemaker-hyperpod-trainium-setup-trainium-kubernetes-environment"></a>

要设置 Trainium Kubernetes 环境，请执行以下操作：

1. **完成以下教程中的步骤：[HuggingFace Llama3-8B 预训练](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/libraries/nxd-training/tutorials/hf_llama3_8B_pretraining.html#download-the-dataset)，从下载数据集开始。**

1. 准备模型配置。可从 Neuron 存储库中获取这些配置。在本教程中，您可以使用 llama3 8b 模型配置。

1. 虚拟环境设置。确保您使用 Python 3.9 或更高版本。

   ```
   python3 -m venv ${PWD}/venv
   source venv/bin/activate
   ```

1. 安装依赖项
   + （推荐）使用以下 HyperPod 命令行工具

     ```
     # install HyperPod command line tools
     git clone https://github.com/aws/sagemaker-hyperpod-cli
     cd sagemaker-hyperpod-cli
     pip3 install .
     ```
   + 如果您使用的是 SageMaker HyperPod 食谱，请指定以下内容

     ```
     # install SageMaker HyperPod Recipes.
     git clone --recursive git@github.com:aws/sagemaker-hyperpod-recipes.git
     cd sagemaker-hyperpod-recipes
     pip3 install -r requirements.txt
     ```

1. [设置 kubectl 和 eksctl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)

1. [安装 Helm](https://helm.sh/docs/intro/install/)

1. 连接到 Kubernetes 集群

   ```
   aws eks update-kubeconfig --region "${CLUSTER_REGION}" --name "${CLUSTER_NAME}"
   hyperpod connect-cluster --cluster-name "${CLUSTER_NAME}" [--region "${CLUSTER_REGION}"] [--namespace <namespace>]
   ```

1. 容器：[Neuron 容器](https://github.com/aws-neuron/deep-learning-containers?tab=readme-ov-file#pytorch-training-neuronx)

## 使用 SageMaker HyperPod CLI 启动训练作业
<a name="sagemaker-hyperpod-trainium-launch-training-job-cli"></a>

我们建议使用 SageMaker HyperPod 命令行界面 (CLI) 工具提交带有配置的训练作业。以下示例为 `hf_llama3_8b_seq8k_trn1x4_pretrain` Trainium 模型提交训练作业。
+ `your_neuron_container`：[Neuron 容器](https://github.com/aws-neuron/deep-learning-containers?tab=readme-ov-file#pytorch-training-neuronx)。
+ `your_model_config`：环境设置部分中的模型配置
+ （可选）如果您需要预先训练的权重，则 HuggingFace 可以通过设置以下键值对来提供 HuggingFace 标记：

  ```
  "recipes.model.hf_access_token": "<your_hf_token>"
  ```

```
hyperpod start-job --recipe training/llama/hf_llama3_8b_seq8k_trn1x4_pretrain \
--persistent-volume-claims fsx-claim:data \
--override-parameters \
'{
 "cluster": "k8s",
 "cluster_type": "k8s",
 "container": "<your_neuron_contrainer>",
 "recipes.run.name": "hf-llama3",
 "recipes.run.compile": 0,
 "recipes.model.model_config": "<your_model_config>",
 "instance_type": "trn1.32xlarge",
 "recipes.data.train_dir": "<your_train_data_dir>"
}'
```

提交训练作业后，可使用以下命令来验证您是否已成功提交该作业。

```
kubectl get pods
NAME                              READY   STATUS             RESTARTS        AGE
hf-llama3-<your-alias>-worker-0   0/1     running         0               36s
```

如果 `STATUS` 为 `PENDING` 或 `ContainerCreating`，请运行以下命令以获取更多详细信息。

```
kubectl describe pod name_of_pod
```

在作业 `STATUS` 更改为 `Running` 后，可使用以下命令检查日志。

```
kubectl logs name_of_pod
```

在运行 `kubectl get pods` 时，`STATUS` 会变成 `Completed`。

## 使用配方启动程序启动训练作业
<a name="sagemaker-hyperpod-trainium-launch-training-job-recipes"></a>

或者，使用 SageMaker HyperPod 食谱提交您的训练作业。要使用配方提交训练作业，请更新 `k8s.yaml` 和 `config.yaml`。运行模型的 bash 脚本以启动它。
+ 在中`k8s.yaml`，更新 persistent\$1volume\$1claims 以将 FSx 亚马逊声明挂载到计算节点的 /data 目录中

  ```
  persistent_volume_claims:
    - claimName: fsx-claim
      mountPath: data
  ```
+ 更新 launcher\$1 \$1hf\$1llama3\$18b\$1seq8k\$1trn1x4\$1pretrain.sh scripts/llama/run
  + `your_neuron_contrainer`：环境设置部分中的容器
  + `your_model_config`：环境设置部分中的模型配置

  （可选）如果您需要预先训练的权重，则 HuggingFace 可以通过设置以下键值对来提供 HuggingFace 标记：

  ```
  recipes.model.hf_access_token=<your_hf_token>
  ```

  ```
   #!/bin/bash
  #Users should set up their cluster type in /recipes_collection/config.yaml
  IMAGE="<your_neuron_contrainer>"
  MODEL_CONFIG="<your_model_config>"
  SAGEMAKER_TRAINING_LAUNCHER_DIR=${SAGEMAKER_TRAINING_LAUNCHER_DIR:-"$(pwd)"}
  TRAIN_DIR="<your_training_data_dir>" # Location of training dataset
  VAL_DIR="<your_val_data_dir>" # Location of talidation dataset
  
  HYDRA_FULL_ERROR=1 python3 "${SAGEMAKER_TRAINING_LAUNCHER_DIR}/main.py" \
    recipes=training/llama/hf_llama3_8b_seq8k_trn1x4_pretrain \
    base_results_dir="${SAGEMAKER_TRAINING_LAUNCHER_DIR}/results" \
    recipes.run.name="hf-llama3-8b" \
    instance_type=trn1.32xlarge \
    recipes.model.model_config="$MODEL_CONFIG" \
    cluster=k8s \
    cluster_type=k8s \
    container="${IMAGE}" \
    recipes.data.train_dir=$TRAIN_DIR \
    recipes.data.val_dir=$VAL_DIR
  ```
+ 启动作业

  ```
  bash launcher_scripts/llama/run_hf_llama3_8b_seq8k_trn1x4_pretrain.sh
  ```

提交训练作业后，可使用以下命令来验证您是否已成功提交该作业。

```
kubectl get pods
NAME                             READY   STATUS             RESTARTS        AGE
hf-llama3-<your-alias>-worker-0   0/1     running         0               36s
```

如果 `STATUS` 为 `PENDING` 或 `ContainerCreating`，请运行以下命令以获取更多详细信息。

```
kubectl describe pod name_of_pod
```

在作业 STATUS 更改为 Running 后，可使用以下命令检查日志。

```
kubectl logs name_of_pod
```

在运行 `kubectl get pods` 时，`STATUS` 会变成 `Completed`。

有关 k8s 集群配置的更多信息，请参阅[Trainium Kubernetes 集群预训练教程](#sagemaker-hyperpod-trainium-kubernetes-cluster-pretrain-tutorial)。

# SageMaker 训练作业预训练教程 (GPU)
<a name="sagemaker-hyperpod-gpu-sagemaker-training-jobs-pretrain-tutorial"></a>

本教程将指导您完成使用带有 GPU 实例的训练作业设置和运行预 SageMaker 训练作业的过程。
+ 设置环境
+ 使用 SageMaker HyperPod 食谱启动训练作业

在开始之前，确保您满足以下先决条件。

**先决条件**  
在开始设置环境之前，请确保您：  
Amazon FSx 文件系统或 Amazon S3 存储桶，您可以在其中加载数据和输出训练项目。
在亚马逊 AI 上申请 1x ml.p4d.24xlarge 和 1x ml.p5.48xlarge 的服务配额。 SageMaker 要请求增加服务配额，请执行以下操作：  
在 S AWS ervice Quotas 控制台上，导航到 AWS 服务，
选择 **Amazon SageMaker AI**。
选择一个 ml.p4d.24xlarge 和一个 ml.p5.48xlarge 实例。
使用以下托管策略创建 AWS Identity and Access Management(IAM) 角色，以授予 SageMaker AI 运行示例的权限。  
AmazonSageMakerFullAccess
Amazon EC2 FullAccess
拥有采用以下格式之一的数据：  
JSON
JSONGZ（压缩 JSON）
ARROW
（可选）如果您使用中的模型权重进行预训练或微调，则必须获得 HuggingFace 代币。 HuggingFace 有关获取令牌的更多信息，请参阅[用户访问令牌](https://huggingface.co/docs/hub/en/security-tokens)。

## GPU SageMaker 训练作业环境设置
<a name="sagemaker-hyperpod-gpu-sagemaker-training-jobs-environment-setup"></a>

在运行 SageMaker 训练作业之前，请运行`aws configure`命令配置您的 AWS 凭证和首选区域。作为配置命令的替代方案，您可以通过环境变量（例如、）提供凭证。有关更多信息 `AWS_ACCESS_KEY_ID``AWS_SECRET_ACCESS_KEY`，请参阅 [SageMaker AI Python SDK](https://github.com/aws/sagemaker-python-sdk)。`AWS_SESSION_TOKEN.`

我们强烈建议在 AI 中 SageMaker 使用 A SageMaker I Jupyter 笔记本 JupyterLab 来启动 SageMaker 训练作业。有关更多信息，请参阅 [SageMaker JupyterLab](studio-updated-jl.md)。
+ （可选）设置虚拟环境和依赖项。如果您在 Amazon SageMaker Studio 中使用 Jupyter 笔记本电脑，则可以跳过此步骤。确保您使用 Python 3.9 或更高版本。

  ```
  # set up a virtual environment
  python3 -m venv ${PWD}/venv
  source venv/bin/activate
  # install dependencies after git clone.
  
  git clone --recursive git@github.com:aws/sagemaker-hyperpod-recipes.git
  cd sagemaker-hyperpod-recipes
  pip3 install -r requirements.txt
  # Set the aws region.
  
  aws configure set <your_region>
  ```
+ 安装 SageMaker AI Python SDK

  ```
  pip3 install --upgrade sagemaker
  ```
+ `Container`：GPU 容器由 SageMaker AI Python SDK 自动设置。您也可以提供自己的容器。
**注意**  
如果您正在运行 Llama 3.2 多模态训练作业，则 `transformers` 版本必须为 `4.45.2 ` 版或更高版本。

  `source_dir`仅当你使用 SageMaker AI Python SDK 时才会追加`transformers==4.45.2`到`requirements.txt`中。例如，如果您在 SageMaker AI JupyterLab 的笔记本中使用它，请将其追加。

  如果您使用 HyperPod 配方使用集群类型启动`sm_jobs`，则此操作将自动完成。

## 使用 Jupyter Notebook 启动训练作业
<a name="sagemaker-hyperpod-gpu-sagemaker-training-jobs-launch-training-job-notebook"></a>

您可以使用以下 Python 代码使用您的配方运行 SageMaker 训练作业。它利用 AI [SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable/) 中的 PyTorch 估算器来提交配方。以下示例在 AI 训练平台上启动 llama3-8b 配方。 SageMaker 

```
import os
import sagemaker,boto3
from sagemaker.debugger import TensorBoardOutputConfig

from sagemaker.pytorch import PyTorch

sagemaker_session = sagemaker.Session()
role = sagemaker.get_execution_role()

bucket = sagemaker_session.default_bucket() 
output = os.path.join(f"s3://{bucket}", "output")
output_path = "<s3-URI>"

overrides = {
    "run": {
        "results_dir": "/opt/ml/model",
    },
    "exp_manager": {
        "exp_dir": "",
        "explicit_log_dir": "/opt/ml/output/tensorboard",
        "checkpoint_dir": "/opt/ml/checkpoints",
    },   
    "model": {
        "data": {
            "train_dir": "/opt/ml/input/data/train",
            "val_dir": "/opt/ml/input/data/val",
        },
    },
}

tensorboard_output_config = TensorBoardOutputConfig(
    s3_output_path=os.path.join(output, 'tensorboard'),
    container_local_output_path=overrides["exp_manager"]["explicit_log_dir"]
)

estimator = PyTorch(
    output_path=output_path,
    base_job_name=f"llama-recipe",
    role=role,
    instance_type="ml.p5.48xlarge",
    training_recipe="training/llama/hf_llama3_8b_seq8k_gpu_p5x16_pretrain",
    recipe_overrides=recipe_overrides,
    sagemaker_session=sagemaker_session,
    tensorboard_output_config=tensorboard_output_config,
)

estimator.fit(inputs={"train": "s3 or fsx input", "val": "s3 or fsx input"}, wait=True)
```

前面的代码使用训练配方创建一个 PyTorch 估计器对象，然后使用该`fit()`方法拟合模型。使用 training\$1recipe 参数指定要用于训练的配方。

**注意**  
如果您正在运行 Llama 3.2 多模态训练作业，则转换器版本必须为 4.45.2 版或更高版本。

`source_dir`只有当你直接使用 SageMaker AI Python SDK 时，才会追加`transformers==4.45.2`到`requirements.txt`中。例如，在使用 Jupyter Notebook 时，必须将版本追加到文本文件。

在为 SageMaker 训练作业部署终端节点时，必须指定正在使用的图像 URI。如果不提供映像 URI，则估算器将使用训练映像作为部署的映像。 SageMaker HyperPod 提供的训练图像不包含推理和部署所需的依赖关系。以下示例说明如何将推理映像用于部署：

```
from sagemaker import image_uris
container=image_uris.retrieve(framework='pytorch',region='us-west-2',version='2.0',py_version='py310',image_scope='inference', instance_type='ml.p4d.24xlarge')
predictor = estimator.deploy(initial_instance_count=1,instance_type='ml.p4d.24xlarge',image_uri=container)
```

**注意**  
在 Sagemaker 笔记本实例上运行上述代码可能需要超过 AI 提供的默认 5GB 存储空间。 SageMaker JupyterLab 如果您遇到空间不足的问题，请创建一个新的笔记本实例，您可在该实例中使用其他笔记本实例，并增加笔记本的存储空间。

## 使用配方启动程序启动训练作业
<a name="sagemaker-hyperpod-gpu-sagemaker-training-jobs-launch-training-job-recipes"></a>

更新 `./recipes_collection/cluster/sm_jobs.yaml` 文件，使其看起来与以下内容类似：

```
sm_jobs_config:
  output_path: <s3_output_path>
  tensorboard_config:
    output_path: <s3_output_path>
    container_logs_path: /opt/ml/output/tensorboard  # Path to logs on the container
  wait: True  # Whether to wait for training job to finish
  inputs:  # Inputs to call fit with. Set either s3 or file_system, not both.
    s3:  # Dictionary of channel names and s3 URIs. For GPUs, use channels for train and validation.
      train: <s3_train_data_path>
      val: null
  additional_estimator_kwargs:  # All other additional args to pass to estimator. Must be int, float or string.
    max_run: 180000
    enable_remote_debug: True
  recipe_overrides:
    exp_manager:
      explicit_log_dir: /opt/ml/output/tensorboard
    data:
      train_dir: /opt/ml/input/data/train
    model:
      model_config: /opt/ml/input/data/train/config.json
    compiler_cache_url: "<compiler_cache_url>"
```

更新 `./recipes_collection/config.yaml` 以在 `cluster` 和 `cluster_type` 中指定 `sm_jobs`。

```
defaults:
  - _self_
  - cluster: sm_jobs  # set to `slurm`, `k8s` or `sm_jobs`, depending on the desired cluster
  - recipes: training/llama/hf_llama3_8b_seq8k_trn1x4_pretrain
cluster_type: sm_jobs  # bcm, bcp, k8s or sm_jobs. If bcm, k8s or sm_jobs, it must match - cluster above.
```

通过以下命令启动作业

```
python3 main.py --config-path recipes_collection --config-name config
```

有关配置 SageMaker 训练作业的更多信息，请参阅在训练作业上运行 SageMaker 训练作业。

# Trainium SageMaker 训练作业预训练教程
<a name="sagemaker-hyperpod-trainium-sagemaker-training-jobs-pretrain-tutorial"></a>

本教程将指导您完成使用带有 AWS Trainium 实例的训练作业设置和运行预 SageMaker 训练作业的过程。
+ 设置环境
+ 启动训练作业

在开始之前，确保您满足以下先决条件。

**先决条件**  
在开始设置环境之前，请确保您：  
Amazon FSx 文件系统或 S3 存储桶，您可以在其中加载数据和输出训练项目。
在 Amazon A SageMaker I 上为该`ml.trn1.32xlarge`实例申请服务配额。要请求增加服务配额，请执行以下操作：  
导航到 S AWS ervice Quotas 控制台。
选择 AWS 服务。
选择 JupyterLab。
为 `ml.trn1.32xlarge` 指定一个实例。
使用`AmazonSageMakerFullAccess`和`AmazonEC2FullAccess`托管策略创建 AWS Identity and Access Management (IAM) 角色。这些政策为 Amazon SageMaker AI 提供了运行示例的权限。
拥有采用以下格式之一的数据：  
JSON
JSONGZ（压缩 JSON）
ARROW
（可选）如果您需要预先训练的权重， HuggingFace 或者您正在训练 Llama 3.2 模型，则必须在开始训练之前获取 HuggingFace 代币。有关获取令牌的更多信息，请参阅[用户访问令牌](https://huggingface.co/docs/hub/en/security-tokens)。

## 为 Trainium 培训工作 SageMaker 设置环境
<a name="sagemaker-hyperpod-trainium-sagemaker-training-jobs-environment-setup"></a>

在运行 SageMaker 训练作业之前，请使用`aws configure`命令配置您的 AWS 凭据和首选区域。作为替代方案，您也可以通过环境变量（例如 `AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY` 和 `AWS_SESSION_TOKEN`）提供凭证。有关更多信息，请参阅 [SageMaker AI Python 开发工具包](https://github.com/aws/sagemaker-python-sdk)。

我们强烈建议在 AI 中 SageMaker 使用 A SageMaker I Jupyter 笔记本 JupyterLab 来启动 SageMaker 训练作业。有关更多信息，请参阅 [SageMaker JupyterLab](studio-updated-jl.md)。
+ （可选）如果您在 Amazon SageMaker Studio 中使用 Jupyter 笔记本，则可以跳过运行以下命令。请务必使用 python 3.9 或更高版本

  ```
  # set up a virtual environment
  python3 -m venv ${PWD}/venv
  source venv/bin/activate
  # install dependencies after git clone.
  
  git clone --recursive git@github.com:aws/sagemaker-hyperpod-recipes.git
  cd sagemaker-hyperpod-recipes
  pip3 install -r requirements.txt
  ```
+ 安装 SageMaker AI Python SDK

  ```
  pip3 install --upgrade sagemaker
  ```
+ 
  + 如果您正在运行 llama 3.2 3.2 多模态训练作业，则 `transformers` 版本必须为 `4.45.2` 版或更高版本。
    + 仅当你使用 AI SageMaker Python SDK 时，才会追加`transformers==4.45.2`到 source\$1dir `requirements.txt` 中。
    + 如果您使用 HyperPod 配方`sm_jobs`作为集群类型启动，则无需指定变形金刚版本。
  + `Container`: Neuron 容器由 SageMaker AI Python SDK 自动设置。

## 使用 Jupyter Notebook 启动训练作业
<a name="sagemaker-hyperpod-trainium-sagemaker-training-jobs-launch-training-job-notebook"></a>

您可以使用以下 Python 代码使用您的配方运行 SageMaker 训练作业。它利用 AI [SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable/) 中的 PyTorch 估算器来提交配方。以下示例将 llama3-8b 配方作为 AI Training Job 启动。 SageMaker 
+ `compiler_cache_url`：用于保存已编译的构件（例如 Amazon S3 构件）的缓存。

```
import os
import sagemaker,boto3
from sagemaker.debugger import TensorBoardOutputConfig

from sagemaker.pytorch import PyTorch

sagemaker_session = sagemaker.Session()
role = sagemaker.get_execution_role()

recipe_overrides = {
    "run": {
        "results_dir": "/opt/ml/model",
    },
    "exp_manager": {
        "explicit_log_dir": "/opt/ml/output/tensorboard",
    },
    "data": {
        "train_dir": "/opt/ml/input/data/train",
    },
    "model": {
        "model_config": "/opt/ml/input/data/train/config.json",
    },
    "compiler_cache_url": "<compiler_cache_url>"
} 

tensorboard_output_config = TensorBoardOutputConfig(
    s3_output_path=os.path.join(output, 'tensorboard'),
    container_local_output_path=overrides["exp_manager"]["explicit_log_dir"]
)

estimator = PyTorch(
    output_path=output_path,
    base_job_name=f"llama-trn",
    role=role,
    instance_type="ml.trn1.32xlarge",
    sagemaker_session=sagemaker_session,
    training_recipe="training/llama/hf_llama3_70b_seq8k_trn1x16_pretrain",
    recipe_overrides=recipe_overrides,
)

estimator.fit(inputs={"train": "your-inputs"}, wait=True)
```

前面的代码使用训练配方创建一个 PyTorch 估计器对象，然后使用该`fit()`方法拟合模型。使用 `training_recipe` 参数指定要用于训练的配方。

## 使用配方启动程序启动训练作业
<a name="sagemaker-hyperpod-trainium-sagemaker-training-jobs-launch-training-job-recipes"></a>
+ 更新 `./recipes_collection/cluster/sm_jobs.yaml`
  + compiler\$1cache\$1url：用于保存构件的 URL。它可以是 Amazon S3 URL。

  ```
  sm_jobs_config:
    output_path: <s3_output_path>
    wait: True
    tensorboard_config:
      output_path: <s3_output_path>
      container_logs_path: /opt/ml/output/tensorboard  # Path to logs on the container
    wait: True  # Whether to wait for training job to finish
    inputs:  # Inputs to call fit with. Set either s3 or file_system, not both.
      s3:  # Dictionary of channel names and s3 URIs. For GPUs, use channels for train and validation.
        train: <s3_train_data_path>
        val: null
    additional_estimator_kwargs:  # All other additional args to pass to estimator. Must be int, float or string.
      max_run: 180000
      image_uri: <your_image_uri>
      enable_remote_debug: True
      py_version: py39
    recipe_overrides:
      model:
        exp_manager:
          exp_dir: <exp_dir>
        data:
          train_dir: /opt/ml/input/data/train
          val_dir: /opt/ml/input/data/val
  ```
+ 更新 `./recipes_collection/config.yaml`

  ```
  defaults:
    - _self_
    - cluster: sm_jobs
    - recipes: training/llama/hf_llama3_8b_seq8k_trn1x4_pretrain
  cluster_type: sm_jobs # bcm, bcp, k8s or sm_jobs. If bcm, k8s or sm_jobs, it must match - cluster above.
  
  instance_type: ml.trn1.32xlarge
  base_results_dir: ~/sm_job/hf_llama3_8B # Location to store the results, checkpoints and logs.
  ```
+ 使用 `main.py` 启动作业

  ```
  python3 main.py --config-path recipes_collection --config-name config
  ```

有关配置 SageMaker 训练作业的更多信息，请参阅[SageMaker 训练作业预训练教程 (GPU)](sagemaker-hyperpod-gpu-sagemaker-training-jobs-pretrain-tutorial.md)。

# 默认配置
<a name="default-configurations"></a>

本节概述了使用 SageMaker HyperPod启动和自定义大型语言模型 (LLM) 训练过程所需的基本组件和设置。此部分介绍构成训练作业基础的密钥存储库、配置文件和配方结构。了解这些默认配置非常重要，有助于高效地设置并管理 LLM 训练工作流，无论您是使用预定义的配方还是对配方进行自定义以满足您的特定需求。

**Topics**
+ [

# GitHub 存储库
](github-repositories.md)
+ [

# 常规配置
](sagemaker-hyperpod-recipes-general-configuration.md)

# GitHub 存储库
<a name="github-repositories"></a>

要启动训练作业，您需要使用来自两个不同 GitHub存储库的文件：
+ [SageMaker HyperPod 食谱](https://github.com/aws/sagemaker-hyperpod-recipes)
+ [SageMaker HyperPod 训练适配器 NeMo](https://github.com/aws/sagemaker-hyperpod-training-adapter-for-nemo)

这些存储库包含用于启动、管理和自定义大语言模型（LLM）训练过程的基本组件。您可以使用存储库中的脚本来设置和运行您的训练作业 LLMs。

## HyperPod 食谱存储库
<a name="sagemaker-hyperpod-recipe-repository"></a>

使用[SageMaker HyperPod 食谱](https://github.com/aws/sagemaker-hyperpod-recipes)存储库获取食谱。

1. `main.py`：此文件是启动向集群或训练作业提交训练作业的过程的主要入口点。 SageMaker 

1. `launcher_scripts`: 此目录包含一系列常用脚本，旨在简化各种大型语言模型的训练过程 (LLMs)。

1. `recipes_collection`：此文件夹包含开发人员提供的一系列预定义的 LLM 配方。用户可以将这些配方与其自定义数据结合使用，训练根据其具体要求定制的 LLM 模型。

您可以使用 SageMaker HyperPod 配方来启动训练或微调作业。无论您使用哪个集群，作业提交过程都相同。例如，您可以使用同一脚本向 Slurm 或 Kubernetes 集群提交作业。启动程序会根据三个配置文件调度训练作业：

1. 常规配置（`config.yaml`）：包括常用设置，例如训练作业中使用的默认参数或环境变量。

1. 集群配置（集群）：仅适用于使用集群的训练作业。如果您要向 Kubernetes 集群提交训练作业，则可能需要指定卷、标签或重启策略等信息。对于 Slurm 集群，您可能需要指定 Slurm 作业名称。所有参数都与您所使用的特定集群相关。

1. 配方（配方）：配方包含训练作业的设置，例如模型类型、分片度或数据集路径。例如，您可以指定 Llama 作为训练模型，并使用模型或数据并行技术 [例如，全分片分布式并行（FSDP）] 跨八台计算机对其进行训练。您还可以为训练作业指定其他检查点频率或路径。

指定配方后，您可以运行启动器脚本，通过`main.py`入口点根据配置在集群上指定 end-to-end训练作业。对于您使用的每个配方，launch\$1scripts 文件夹中都有随附的 Shell 脚本。这些示例将指导您提交和启动训练作业。下图说明了 SageMaker HyperPod 配方启动器如何根据上述内容向集群提交训练作业。目前， SageMaker HyperPod 配方启动器建立在 Nvidia Fr NeMo amework Launcher 之上。有关更多信息，请参阅[《NeMo 启动器指南》](https://docs.nvidia.com/nemo-framework/user-guide/latest/overview.html)。

![\[该图说明了 HyperPod 配方启动器的工作流程。左侧虚线框内有三个文件图标，分别标有“配方”、“config.yaml”和“slurm.yaml、k8s.yaml 或 sm_job.yaml（集群配置）”。箭头从这个盒子指向一个标有 “HyperPod 食谱启动器” 的中心盒子。从这个中央框出发，另一个箭头向右指向“训练作业”，箭头上方标有“main.py”。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/sagemaker-hyperpod-recipe-launcher.png)


## HyperPod 配方适配器存储库
<a name="hyperpod-recipe-adapter"></a>

 SageMaker HyperPod 训练适配器是一个训练框架。可使用它管理训练作业的整个生命周期。可使用该适配器将模型的预训练或微调作业分发给多台计算机。该适配器使用不同的并行技术来分发训练作业。它还负责检查点保存功能的实现与管理。有关更多详细信息，请参阅[高级设置](cluster-specific-configurations-advanced-settings.md)。

使用[SageMaker HyperPod 配方适配器存储库](https://github.com/aws/sagemaker-hyperpod-training-adapter-for-nemo)来使用配方适配器。

1. `src`：此目录包含大语言模型（LLM）训练的实现，包括模型并行、混合精度训练和检查点管理等各种功能。

1. `examples`：此文件夹提供了一组示例，这些示例演示了如何创建用于训练 LLM 模型的入口点，可用作用户实用指南。

# 常规配置
<a name="sagemaker-hyperpod-recipes-general-configuration"></a>

config.yaml 文件指定训练配方和集群。它还包括运行时配置，例如训练作业的环境变量。

```
defaults:
  - _self_
  - cluster: slurm 
  - recipes: training/llama/hf_llama3_8b_seq8192_gpu
instance_type: p5.48xlarge
git:
  repo_url_or_path: null
  branch: null
  commit: null
  entry_script: null
  token: null
env_vars:
  NCCL_DEBUG: WARN
```

您可以修改 `config.yaml` 中的以下参数：

1. `defaults`：指定您的默认设置，例如默认集群或默认配方。

1. `instance_type`：修改 Amazon EC2 实例类型以匹配您使用的实例类型。

1. `git`：指定训练作业的 SageMaker HyperPod 配方适配器存储库的位置。

1. `env_vars`：您可以指定要传入运行时训练作业的环境变量。例如，您可以通过指定 NCCL\$1DEBUG 环境变量来调整 NCCL 的日志记录级别。

配方是用于定义训练作业架构的核心配置。此文件包含训练作业所需的多项重要信息，例如：
+ 是否使用模型并行
+ 数据集的源
+ 混合精度训练
+ 与检查点相关的配置

您可以按原样使用配方。也可以使用以下信息对其进行修改。

## 运行
<a name="run"></a>

以下是运行训练作业所需的基本运行信息。

```
run:
  name: llama-8b
  results_dir: ${base_results_dir}/${.name}
  time_limit: "6-00:00:00"
  model_type: hf
```

1. `name`：在配置文件中指定训练作业的名称。

1. `results_dir`：可以指定训练作业结果的存储目录。

1. `time_limit`：可以为训练作业设置最长训练时间，以防止其过长时间占用硬件资源。

1. `model_type`：可以指定所使用的模型的类型。例如，您可以指定您的模型`hf`是否来自 HuggingFace。

## exp\$1manager
<a name="exp-manager"></a>

exp\$1manager 可配置实验。利用 exp\$1manager，可以指定输出目录或检查点设置等字段。以下示例说明如何配置 exp\$1manager。

```
exp_manager:
  exp_dir: null
  name: experiment
  create_tensorboard_logger: True
```

1. `exp_dir`：实验目录包含训练作业的标准输出和标准错误文件。默认情况下，它使用当前目录。

1. `name`：用于在 exp\$1dir 下标识实验的实验名称。

1. `create_tensorboard_logger`：指定`True`或`False`以启用或禁用 TensorBoard记录器。

## 检查点
<a name="checkpointing"></a>

我们支持以下三种检查点：
+ 自动检查点
+ 手动检查点
+ 完整检查点

### 自动检查点
<a name="auto-checkpointing"></a>

如果您要保存或加载由 SageMaker HyperPod 配方适配器自动管理的检查点，则可以启用`auto_checkpoint`。要启用 `auto_checkpoint`，请将 `enabled` 设置为 `True`。您可以使用自动检查点进行训练和微调。您可以对共享文件系统和 Amazon S3 使用自动检查点。

```
exp_manager
  checkpoint_dir: ${recipes.exp_manager.exp_dir}/checkpoints/
  auto_checkpoint:
    enabled: True
```

自动检查点会以异步方式保存 local\$1state\$1dict，且保存间隔为自动计算出的最优间隔。

**注意**  
在此检查点模式下，自动保存的检查点不支持在各个训练运行之间重新分片。要从最新的自动保存的检查点恢复，您必须保留相同的分片度。您无需指定额外信息即可自动恢复。

### 手动检查点
<a name="manual-checkpointing"></a>

您可以修改 `checkpoint_callback_params`，以异步方式将中间检查点保存在 shared\$1state\$1dict 中。例如，您可以指定以下配置以每 10 个步骤启用分片检查点，并保留最新的 3 个检查点。

分片检查点允许您在各个训练运行之间更改分片度，并通过设置 `resume_from_checkpoint` 来加载检查点。

**注意**  
如果是 PEFT 微调，则分片检查点不支持 Amazon S3。
自动检查点和手动检查点是互斥的。
只允许更改 FSDP 分片度和复制度。

```
exp_manager:
  checkpoint_callback_params:
    # Set save_top_k = 0 to disable sharded checkpointing
    save_top_k: 3
    every_n_train_steps: 10
    monitor: "step"
    mode: "max"
    save_last: False
  resume_from_checkpoint: ${recipes.exp_manager.exp_dir}/checkpoints/
```

要了解有关检查点的更多信息，请参阅[使用 SMP 的检查点](model-parallel-core-features-v2-checkpoints.md)。

### 完整检查点
<a name="full-checkpointing"></a>

导出的 full\$1state\$1dict 检查点可用于推理或微调。您可以通过 hf\$1model\$1name\$1or\$1path 加载完整检查点。在此模式下，仅保存模型权重。

要导出 full\$1state\$1dict 模型，您可以设置以下参数。

**注意**  
目前，Amazon S3 检查点不支持完整检查点。如果您已启用完整检查点，则无法为 `exp_manager.checkpoint_dir` 设置 S3 路径。但是，在将 `exp_manager.checkpoint_dir` 设置为 Amazon S3 路径时，可以将 `exp_manager.export_full_model.final_export_dir` 设置为本地文件系统上的特定目录。

```
exp_manager:
  export_full_model:
    # Set every_n_train_steps = 0 to disable full checkpointing
    every_n_train_steps: 0
    save_last: True
    final_export_dir : null
```

## 模型
<a name="model"></a>

定义模型架构和训练过程的各个方面。这包括模型并行、精度和数据处理的相关设置。以下是可在模型部分中配置的关键组件：

### 模型并行
<a name="model-parallelism"></a>

指定配方后，可定义要训练的模型。也可以定义模型并行。例如，您可以定义 tensor\$1model\$1parallel\$1degree。您可以启用其他功能，例如 FP8 精确训练。例如，您可以使用张量并行和上下文并行来训练模型：

```
model:
  model_type: llama_v3
  # Base configs
  train_batch_size: 4
  val_batch_size: 1
  seed: 12345
  grad_clip: 1.0

  # Model parallelism
  tensor_model_parallel_degree: 4
  expert_model_parallel_degree: 1
  context_parallel_degree: 2
```

要更好地了解不同类型的模型并行技术，您可以参考以下方法：

1. [张量并行性](model-parallel-core-features-v2-tensor-parallelism.md)

1. [专家并行性](model-parallel-core-features-v2-expert-parallelism.md)

1. [上下文并行性](model-parallel-core-features-v2-context-parallelism.md)

1. [混合分片数据并行性](model-parallel-core-features-v2-sharded-data-parallelism.md)

### FP8
<a name="fp8"></a>

要启用 FP8 （8 位浮点精度），可以在以下示例中指定 FP8相关配置：

```
model:
  # FP8 config
  fp8: True
  fp8_amax_history_len: 1024
  fp8_amax_compute_algo: max
```

请务必注意，目前只有 P5 实例类型支持该 FP8 数据格式。如果您使用的是较旧的实例类型，例如 P4，请在模型训练过程中禁用该 FP8 功能。有关的更多信息 FP8，请参阅[混合精度训练](model-parallel-core-features-v2-mixed-precision.md)。

### 数据
<a name="data"></a>

您可以通过在数据下添加数据路径来为训练作业指定自定义数据集。我们系统中的数据模块支持以下数据格式：

1. JSON

1. JSONGZ（压缩 JSON）

1. ARROW

但是，您负责准备自己的预令牌化数据集。如果您是有特定要求的高级用户，也可以选择实施和集成自定义数据模块。有关 HuggingFace 数据集的更多信息，请参阅[数据集](https://huggingface.co/docs/datasets/v3.1.0/en/index)。

```
model:
  data:
    train_dir: /path/to/your/train/data
    val_dir: /path/to/your/val/data
    dataset_type: hf
    use_synthetic_data: False
```

您可以指定模型训练方式。默认情况下，配方使用预训练而不是微调。以下示例将配方配置为使用 LoRA（低秩适应）运行微调作业。

```
model:
  # Fine tuning config
  do_finetune: True
  # The path to resume from, needs to be HF compatible
  hf_model_name_or_path: null
  hf_access_token: null
  # PEFT config
  peft:
    peft_type: lora
    rank: 32
    alpha: 16
    dropout: 0.1
```

有关食谱的信息，请参阅[SageMaker HyperPod食谱](https://github.com/aws/sagemaker-hyperpod-recipes)。

# 特定于集群的配置
<a name="cluster-specific-configurations"></a>

SageMaker HyperPod 提供了在不同集群环境中运行训练作业的灵活性。每个环境均有自己的配置要求和设置过程。本节概述了在 SageMaker HyperPod Slurm、 SageMaker HyperPod k8s 中运行训练作业和训练作业所需的步骤和配置。 SageMaker 了解这些配置非常重要，有助于您在所选环境中高效利用分布式训练的能力。

可在以下集群环境中使用配方：
+ SageMaker HyperPod Slurm 编排
+ SageMaker HyperPod 亚马逊 Elastic Kubernetes Service 编排
+ SageMaker 培训工作

要在集群中启动训练作业，请设置并安装相应的集群配置和环境。

**Topics**
+ [

# 在 HyperPod Slurm 上运行训练作业
](cluster-specific-configurations-run-training-job-hyperpod-slurm.md)
+ [

# 在 HyperPod k8s 上运行训练作业
](cluster-specific-configurations-run-training-job-hyperpod-k8s.md)
+ [

# 运行 SageMaker 训练作业
](cluster-specific-configurations-run-sagemaker-training-job.md)

# 在 HyperPod Slurm 上运行训练作业
<a name="cluster-specific-configurations-run-training-job-hyperpod-slurm"></a>

SageMaker HyperPod Recipes 支持向 s GPU/Trainium lurm 集群提交训练作业。在提交训练作业之前，请更新集群配置。使用下列方法之一更新集群配置：
+ 修改 `slurm.yaml`
+ 通过命令行覆盖集群配置

更新集群配置后，安装环境。

## 配置集群
<a name="cluster-specific-configurations-configure-cluster-slurm-yaml"></a>

要向 Slurm 集群提交训练作业，请指定特定于 Slurm 的配置。修改 `slurm.yaml` 以配置 Slurm 集群。以下是 Slurm 集群配置示例。您可以根据自己的训练需求修改此文件：

```
job_name_prefix: 'sagemaker-'
slurm_create_submission_file_only: False 
stderr_to_stdout: True
srun_args:
  # - "--no-container-mount-home"
slurm_docker_cfg:
  docker_args:
    # - "--runtime=nvidia" 
  post_launch_commands: 
container_mounts: 
  - "/fsx:/fsx"
```

1. `job_name_prefix`：指定作业名称前缀，以轻松识别您向 Slurm 集群提交的内容。

1. `slurm_create_submission_file_only`：将此配置设置为 True 以进行试运行，帮助您进行调试。

1. `stderr_to_stdout`：指定是否将标准错误（stderr）重定向到标准输出（stdout）。

1. `srun_args`：自定义其他 srun 配置，例如排除特定的计算节点。有关更多信息，请参阅 srun 文档。

1. `slurm_docker_cfg`: SageMaker HyperPod 配方启动器启动一个 Docker 容器来运行你的训练作业。您可以在此参数中指定其他 Docker 参数。

1. `container_mounts`：为配方启动程序指定将挂载到容器中的卷，以便训练作业访问这些卷中的文件。

# 在 HyperPod k8s 上运行训练作业
<a name="cluster-specific-configurations-run-training-job-hyperpod-k8s"></a>

SageMaker HyperPod Recipes 支持向 GPU/Trainium Kubernetes 集群提交训练作业。在提交训练作业之前，请执行下列操作之一：
+ 修改 `k8s.yaml` 集群配置文件
+ 通过命令行覆盖集群配置

完成上述任一步骤后，安装相应的环境。

## 使用 `k8s.yaml` 配置集群
<a name="cluster-specific-configurations-configure-cluster-k8s-yaml"></a>

要向 Kubernetes 集群提交训练作业，请指定特定于 Kubernetes 的配置。这些配置包括集群命名空间或持久性卷的位置。

```
pullPolicy: Always
restartPolicy: Never
namespace: default
persistent_volume_claims:
  - null
```

1. `pullPolicy`：您可以在提交训练作业时指定提取策略。如果您指定“始终”，则 Kubernetes 集群始终从存储库中提取您的映像。有关更多信息，请参阅[映像提取策略](https://kubernetes.io/docs/concepts/containers/images/#image-pull-policy)。

1. `restartPolicy`：指定在训练作业失败时是否重启该作业。

1. `namespace`：可以指定提交训练作业时所使用的 Kubernetes 命名空间。

1. `persistent_volume_claims`：可以为训练作业指定共享卷，以便所有训练过程都能访问该卷中的文件。

# 运行 SageMaker 训练作业
<a name="cluster-specific-configurations-run-sagemaker-training-job"></a>

SageMaker HyperPod 食谱支持提交 SageMaker 训练作业。在提交训练作业之前，必须更新集群配置 `sm_job.yaml`，并安装相应的环境。

## 把你的食谱当作 SageMaker 训练工作
<a name="cluster-specific-configurations-cluster-config-sm-job-yaml"></a>

如果您没有托管集群，则可以将您的配方用作 SageMaker 训练作业。您必须修改 SageMaker 训练作业配置文件才能运行您的配方。`sm_job.yaml`

```
sm_jobs_config:
  output_path: null 
  tensorboard_config:
    output_path: null 
    container_logs_path: null
  wait: True 
  inputs: 
    s3: 
      train: null
      val: null
    file_system:  
      directory_path: null
  additional_estimator_kwargs: 
    max_run: 1800
```

1. `output_path`：可以指定将模型保存到 Amazon S3 URL 的路径。

1. `tensorboard_config`：您可以指定 TensorBoard 相关配置，例如输出路径或 TensorBoard 日志路径。

1. `wait`：可以在提交训练作业时指定是否等待作业完成。

1. `inputs`：可以为训练和验证数据指定路径。数据源可以来自共享文件系统，例如 Amazon FSx 或 Amazon S3 网址。

1. `additional_estimator_kwargs`：用于向培训作业平台提交培训作业的其他估算器参数。 SageMaker 有关更多信息，请参阅[算法估算器](https://sagemaker.readthedocs.io/en/stable/api/training/algorithm.html)。

# 注意事项
<a name="cluster-specific-configurations-special-considerations"></a>

当你使用 Amazon SageMaker HyperPod 食谱时，有一些因素会影响模型训练的过程。
+ 对于 Llama 3.2，`transformers` 版本必须为 `4.45.2` 版或更高版本。如果您使用的是 Slurm 或 K8s 工作流，则版本会自动更新。
+ Mixtral 不支持 8 位浮点精度 () FP8
+ 亚马逊 EC2 p4 实例不支持 FP8

# 高级设置
<a name="cluster-specific-configurations-advanced-settings"></a>

 SageMaker HyperPod 配方适配器建立在 Nvidia Nemo 和 Pytorch-Lightning 框架之上。如果您已经使用过这些框架，则将您的自定义模型或功能集成到 SageMaker HyperPod 配方适配器中的过程类似。除了修改配方适配器外，还可以更改您自己的预训练或微调脚本。有关编写自定义训练脚本的指南，请参阅[示例](https://github.com/aws/sagemaker-hyperpod-training-adapter-for-nemo/tree/main/examples)。

## 使用 SageMaker HyperPod 适配器创建自己的模型
<a name="cluster-specific-configurations-use-hyperpod-adapter-create-model"></a>

在配方适配器中，可以在以下位置自定义以下文件：

1. `collections/data`：包含一个负责加载数据集的模块。目前，它仅支持来自的数据集 HuggingFace。如果您有更高级的需求，可使用此代码结构在同一文件夹中添加自定义数据模块。

1. `collections/model`：包括各种语言模型的定义。目前，它支持常见的大语言模型，例如 Llama、Mixtral 和 Mistral。您可以灵活地在此文件夹中引入您自己的模型定义。

1. `collections/parts`：此文件夹包含以分布式方式训练模型的策略。一个示例是全分片数据并行（FSDP）策略，该策略允许跨多个加速器对大语言模型进行分片。此外，这些策略还支持各种形式的模型并行。您还可以选择为模型训练引入您自己的自定义训练策略。

1. `utils`：包含各种有助于进行训练作业管理的实用程序。它可以用作存储您自己的工具的存储库。您可以使用自己的工具执行故障排除或基准测试等任务。您还可以在此文件夹中添加自己的个性化 PyTorch Lightning 回传。您可以使用 PyTorch Lightning 回调将特定功能或操作无缝集成到训练生命周期中。

1. `conf`：包含用于验证训练作业中的特定参数的配置架构定义。如果您引入新的参数或配置，则可将自定义架构添加到此文件夹。可以使用自定义架构来定义验证规则。可以验证数据类型、范围或任何其他参数约束。也可以定义自己的自定义架构来验证参数。

# 附录
<a name="appendix"></a>

使用以下信息获取有关监控和分析训练结果的信息。

## 监控训练结果
<a name="monitor-training-results"></a>

监控和分析培训结果对于开发人员评估融合度和解决问题至关重要。 SageMaker HyperPod 食谱提供了 Tensorboard 集成，用于分析训练行为。为了应对分析大型分布式训练作业所面临的挑战，这些方法还包含在内 VizTracer。 VizTracer是一款用于跟踪和可视化 Python 代码执行的低开销工具。有关的更多信息 VizTracer，请参阅[VizTracer](https://viztracer.readthedocs.io/en/latest/installation.html)。

以下各节将指导您完成在 SageMaker HyperPod 食谱中实现这些功能的过程。

### Tensorboard
<a name="tensorboard"></a>

Tensorboard 是一款用于可视化和分析训练过程的强大工具。要启用 Tensorboard，请通过设置以下参数来修改您的配方：

```
exp_manager:
  exp_dir: null
  name: experiment
  create_tensorboard_logger: True
```

启用 Tensorboard 记录器后，系统将生成训练日志并将其存储在实验目录中。指定的实验是在 exp\$1manager.exp\$1dir 中定义的。要本地访问和分析这些日志，请按以下过程操作：

**访问和分析日志**

1. 从训练环境中将 Tensorboard 实验文件夹下载到本地计算机上。

1. 在本地计算机上打开终端或命令提示符。

1. 导航到包含已下载的实验文件夹的目录。

1. 通过以下命令启动 Tensorboard。

   ```
   tensorboard --port=<port> --bind_all --logdir experiment.
   ```

1. 打开 Web 浏览器并访问 http://localhost:8008。

现在，您可以在 Tensorboard 界面中查看训练作业的状态和可视化内容。查看状态和可视化内容有助于监控和分析训练过程。监控和分析训练过程有助于了解模型的行为和性能。有关如何使用 Tensorboard 监控和分析训练的更多信息，请参阅 [NVIDIA Framework 用户 NeMo 指南](https://docs.nvidia.com/nemo-framework/user-guide/latest/llms/index.html)。

### VizTracer
<a name="viztracer"></a>

要启用 VizTracer，你可以通过将 model.viztracer.enabled 参数设置为 true 来修改配方。例如，您可以 VizTracer 通过添加以下配置来更新您的美洲驼食谱以启用：

```
model:
  viztracer:
    enabled: true
```

训练完成后，您的 VizTracer 个人资料位于实验文件夹 exp\$1dir/result.json 中。要分析配置文件，可以下载配置文件并使用 vizviewer 工具将其打开：

```
vizviewer --port <port> result.json
```

此命令在端口 9001 上启动 vizviewer。你可以 VizTracer通过在<port>浏览器中指定 http://localhost: 来查看你的。打开后 VizTracer，开始分析训练。有关使用的更多信息 VizTracer，请参阅 VizTracer 文档。

## SageMaker JumpStart 对比 SageMaker HyperPod
<a name="sagemaker-jumpstart-vs-hyperpod"></a>

虽然 SageMaker JumpStart 提供了微调功能，但 SageMaker HyperPod 配方提供了以下内容：
+ 对训练循环的额外精细控制
+ 针对您自己的模型和数据的配方自定义
+ 支持模型并行

当您需要访问模型的超参数、多节点训练和训练循环的自定义选项时，请使用这些 SageMaker HyperPod 配方。

有关在中微调模型的更多信息 SageMaker JumpStart，请参阅 [使用 `JumpStartEstimator` 类微调公开可用的基础模型](jumpstart-foundation-models-use-python-sdk-estimator-class.md)