在 Cloud TPU 上训练 HuggingFace GPT2 (TF 2.x)


如果您不熟悉 Cloud TPU,建议您浏览quickstart,了解如何创建 TPU 虚拟机。

本教程介绍了如何在 Cloud TPU 上训练 HuggingFace GPT2 模型。

目标

  • 创建 Cloud TPU
  • 安装依赖项
  • 运行训练作业

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

  • Compute Engine
  • Cloud TPU

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

在开始学习本教程之前,请检查您的 Google Cloud 项目是否已正确设置。

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  5. 确保您的 Google Cloud 项目已启用结算功能

  6. 本演示使用 Google Cloud 的收费组件。请查看 Cloud TPU 价格页面估算您的费用。请务必在使用完您创建的资源以后清理这些资源,以免产生不必要的费用。

使用 Cloud TPU 训练 HuggingFace GPT2

  1. 打开一个 Cloud Shell 窗口。

    打开 Cloud Shell

  2. 为项目 ID 创建环境变量。

    export PROJECT_ID=your-project-id
    
  3. 配置 Google Cloud CLI,以使用要在其中创建 Cloud TPU 的 Google Cloud 项目。

    gcloud config set project ${PROJECT_ID}
    

    当您第一次在新的 Cloud Shell 虚拟机中运行此命令时,系统会显示 Authorize Cloud Shell 页面。点击页面底部的 Authorize,以允许 gcloud 使用您的凭据进行 Google Cloud API 调用。

  4. 为 Cloud TPU 项目创建服务账号。

    服务帐号允许 Cloud TPU 服务访问其他 Google Cloud 服务。

    $ gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
    

    该命令将返回以下格式的 Cloud TPU 服务账号:

    service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
    

创建 Cloud TPU

  1. 使用 gcloud 命令创建 Cloud TPU 虚拟机。以下命令会创建一个 v4-8 TPU。您还可以通过将 --accelerator-type 标志设置为 Podslice 类型(例如 v4-32)来创建 TPU PodSlice。

    $ gcloud compute tpus tpu-vm create hf-gpt2 \
      --zone=us-central2-b \
      --accelerator-type=v4-8 \
      --version=tpu-vm-tf-2.16.1-pjrt
    

    命令标志说明

    zone
    您计划在其中创建 Cloud TPU 的区域
    accelerator-type
    加速器类型指定要创建的 Cloud TPU 的版本和大小。如需详细了解每个 TPU 版本支持的加速器类型,请参阅 TPU 版本
    version
    Cloud TPU 软件版本
  2. 运行以下 ssh 命令以连接到 Cloud TPU 虚拟机。

    gcloud compute tpus tpu-vm ssh hf-gpt2 --zone=us-central2-b
    

安装依赖项

  1. 克隆 HuggingFace Transformers 代码库:

    (vm)$ cd /tmp
    (vm)$ git clone https://github.com/huggingface/transformers.git
    (vm)$ cd transformers
    
  2. 安装依赖项:

    (vm)$ pip install .
    (vm)$ pip install -r examples/tensorflow/_tests_requirements.txt
    (vm)$ cd /tmp/transformers/examples/tensorflow/language-modeling
    (vm)$ pip install -r requirements.txt
    
  3. 创建临时目录:

    (vm)$ mkdir /tmp/gpt2-wikitext
    
  4. 创建 TPU 时,如果将 --version 参数设置为以 -pjrt 结尾的版本,请设置以下环境变量以启用 PJRT 运行时:

      (vm)$ export NEXT_PLUGGABLE_DEVICE_USE_C_API=true
      (vm)$ export TF_PLUGGABLE_DEVICE_LIBRARY_PATH=/lib/libtpu.so
    

运行训练脚本

(vm)$ python3 run_clm.py \
  --model_name_or_path distilgpt2 \
  --max_train_samples 1000 \
  --max_eval_samples 100 \
  --num_train_epochs 1 \
  --output_dir /tmp/gpt2-wikitext \
  --dataset_name wikitext \
  --dataset_config_name wikitext-103-raw-v1

命令标志说明

model_name_or_path
要训练的模型的名称。
max_train_samples
用于训练的样本数量上限。
max_eval_samples
用于评估的样本数量上限。
num_train_epochs
训练模型的周期数。
output_dir
训练脚本的输出目录。
dataset_name
要使用的数据集的名称。
dataset_config_name
数据集配置名称

训练完成后,系统会显示类似以下内容的消息:

  125/125 [============================] - ETA: 0s - loss: 3.61762023-07-07 21:38:17.902850: W tensorflow/core/framework/dataset.cc:956] Input of GeneratorDatasetOp::Dataset will not be optimized because the dataset does not implement the AsGraphDefInternal() method needed to apply optimizations.
  125/125 [============================] - 763s 6s/step - loss: 3.6176 - val_loss: 3.4233
  Configuration saved in /tmp/gpt2-wikitext/config.json
  Configuration saved in /tmp/gpt2-wikitext/generation_config.json
  Model weights saved in /tmp/gpt2-wikitext/tf_model.h5
  D0707 21:38:45.640973681   12027 init.cc:191]                          grpc_shutdown starts clean-up now
  

清理

  1. 断开与 TPU 虚拟机实例的连接:

    (vm)$ exit
    

    您的提示符现在应为 username@projectname,表明您位于 Cloud Shell 中。

  2. 删除 TPU 资源。

    $ gcloud compute tpus tpu-vm delete hf-gpt2 \
    --zone=us-central2-b
    

后续步骤

请尝试使用其他受支持的参考模型