AWS Trainium & Inferentia 文档

在 SageMaker Hyperpod 上使用预构建容器对 Llama 3.2 1B 进行持续预训练

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

在 SageMaker Hyperpod 上使用预构建容器对 Llama 3.2 1B 进行持续预训练

本教程演示了如何使用 Hugging Face Optimum Neuron 库在 Amazon SageMaker Hyperpod 上持续预训练 Llama 3.2 1B 模型。我们利用了张量并行、序列并行和 ZeRO-1 等多种性能优化技术,在由 Trainium 驱动的实例上高效地训练大型语言模型。

使用 SageMaker Hyperpod 的一个主要好处是能够利用 Hugging Face 提供的预构建 Optimum Neuron 容器。这些容器预装了所有必需的库和依赖项,使得在 AWS Trainium 实例上开始训练变得非常容易。

通过使用 SageMaker 预构建的容器,您可以避免手动设置环境的麻烦,专注于核心的训练和微调任务。这些容器针对性能进行了优化,并包含了各种优化技术,例如张量并行和选择性检查点,以高效地训练像 Llama 3.2 1B 这样的大型语言模型。

您将学习如何

1. 设置 AWS 环境

在开始本教程之前,您需要设置您的 AWS 环境。

  1. 创建一个包含至少一个 `trn1.32xlarge` 实例的 AWS SageMaker Hyperpod 集群。您可以按照 Hyperpod EKS 研讨会 的步骤来设置集群。
  2. 由于 Llama 3.2 是一个受限访问模型,用户在运行此示例前必须在 Hugging Face 注册并获取一个访问令牌。您还需要在 meta-llama/Llama-3.2-1B 模型页面上审阅并接受许可协议。
  3. 配置您的 AWS 凭证。如果您还没有设置 AWS 凭证,可以通过安装 AWS CLI 并运行 aws configure 来完成。您需要输入您的 AWS Access Key ID、Secret Access Key、默认区域和输出格式。
    aws configure
    AWS Access Key ID [None]: YOUR_ACCESS_KEY
    AWS Secret Access Key [None]: YOUR_SECRET_KEY
    Default region name [None]: YOUR_REGION
    Default output format [None]: json

2. 准备训练环境

使用必要的依赖项设置您的训练环境。

git clone https://github.com/huggingface/optimum-neuron.git
mkdir ~/pre-training
cd pre-training

cp -r ../optimum-neuron/docs/source/training_tutorials/amazon_eks .
cd amazon_eks

登录到 ECR 并拉取 `huggingface-pytorch-training-neuronx` 镜像。

region=us-east-1
dlc_account_id=************
aws ecr get-login-password --region $region | docker login --username AWS --password-stdin $dlc_account_id.dkr.ecr.$region.amazonaws.com

docker pull ${dlc_account_id}.dkr.ecr.${region}.amazonaws.com/huggingface-pytorch-training-neuronx:2.1.2-transformers4.43.2-neuronx-py310-sdk2.20.0-ubuntu20.04-v1.0

构建 Docker 镜像并将其推送到您的 ECR 注册表。

export AWS_REGION=$(aws ec2 describe-availability-zones --output text --query 'AvailabilityZones[0].[RegionName]')
export ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
export REGISTRY=${ACCOUNT}.dkr.ecr.${AWS_REGION}.amazonaws.com/
export IMAGE=optimum-neuron-llama-pretraining
export TAG=:latest

docker build -t ${REGISTRY}${IMAGE}${TAG} .

将镜像推送到您的私有注册表。

# Create registry if needed
export REGISTRY_COUNT=$(aws ecr describe-repositories | grep \"${IMAGE}\" | wc -l)
if [ "${REGISTRY_COUNT//[!0-9]/}" == "0" ]; then
   echo "Creating repository ${REGISTRY}${IMAGE} ..."
   aws ecr create-repository --repository-name ${IMAGE}
else
   echo "Repository ${REGISTRY}${IMAGE} already exists"
fi

# Login to registry
echo "Logging in to $REGISTRY ..."
aws ecr get-login-password | docker login --username AWS --password-stdin $REGISTRY

# Push image to registry
docker image push ${REGISTRY}${IMAGE}${TAG}

3. 配置训练作业

接下来,您将生成预训练作业要使用的脚本。首先,使用您在先决条件步骤中提到的访问令牌登录 Hugging Face。在运行之前,修改 `generate-jobspec.sh` 脚本以包含 Hugging Face 访问令牌。

export HF_ACCESS_TOKEN="<your_HF_token_here>"

通过执行 `generate-jobspec.sh` 生成 Kubernetes 作业规范。这将为 Amazon SageMaker Hyperpod EKS 集群创建一个名为 `llama_train.yaml` 的部署清单。

./generate-jobspec.sh

4. 在 SageMaker Hyperpod 上启动训练

将训练作业部署到您的 Kubernetes 集群。

kubectl apply -f llama_train.yaml

该清单使用 torchrun 在集群上运行训练脚本以进行分布式训练。您可以在 run_clm.py 查看完整的训练脚本。

您将在此脚本中使用以下分布式训练技术:

  • 分布式训练:每个节点使用 8 个进程的 torchrun,以实现高效的多设备训练。
  • 模型并行:同时实现张量并行 (TP=8) 和流水线并行 (PP=1)。
  • 混合精度:利用 BFloat16 提高训练效率。
  • 梯度检查点:实现内存高效的训练。

该清单在集群上运行以下命令。环境变量是在 `generate-jobspec.sh` 中创建清单时设置的。

torchrun --nproc_per_node=8 --nnodes=${NUM_NODES} run_clm.py \
    --model_name_or_path=${HF_MODEL_NAME}
    --token=${HF_ACCESS_TOKEN}
    --dataset_name=${DATASET_NAME}
    --dataset_config_name=${DATASET_CONFIG_NAME}
    --streaming=True
    --cache_dir=${TOKENIZED_DATA_PATH}
    --num_train_epochs=1
    --do_train
    --learning_rate=1e-4
    --max_steps=${MAX_STEPS}
    --per_device_train_batch_size=${BATCH_SIZE}
    --per_device_eval_batch_size=4
    --gradient_accumulation_steps=1
    --gradient_checkpointing
    --block_size=4096
    --bf16
    --max_grad_norm=1.0
    --lr_scheduler_type=linear
    --tensor_parallel_size=8
    --pipeline_parallel_size=1
    --logging_steps=1
    --save_total_limit=1
    --output_dir=${CHECKPOINT_DIR}
    --overwrite_output_dir

训练作业现在将开始在 SageMaker Hyperpod 集群上运行。

这使用了来自 Optimum-neuron 的预构建脚本。该脚本使用 Optimum Neuron 库中的 Trainer 类,这是 Hugging Face Trainer 的一个专门版本,专为在 AWS Trainium 实例上训练而优化。

以下是脚本中主要组件的概述:

  • 模型加载:使用 `AutoModelForCausalLM.from_pretrained()` 加载模型,并采用延迟加载以实现并行处理。

  • 数据处理:将数据集分词并处理成适合语言建模的块。

  • 训练参数:脚本使用 `NeuronTrainingArguments` 来配置训练超参数,包括张量并行和流水线并行的选项。

  • Trainer 设置:使用模型、训练参数、数据集和其他必要组件创建一个 `[optimum.neuron.NeuronTrainer]` 的 Trainer 实例。

  • 训练循环:调用 `trainer.train()` 方法以开始持续的预训练过程。

5. 监控和验证训练

您可以通过 Kubernetes 日志监控进度。

# Monitor training logs
kubectl logs -f -n kubeflow llama-training-eks-worker-0

# Validate saved checkpoints
kubectl exec -it llama-training-eks-worker-0 -- ls -l /fsx/output

预训练完成后,您可以使用先前教程中介绍的技术,针对特定任务对模型进行微调。恭喜您在 AWS Trainium 上完成了 Llama 的预训练!