

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

# 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)。