使用 Hugging Face Transformers、TensorFlow 和 TPU 训练语言模型

Hugging Face 详细介绍了一套可扩展的工作流,使用 TensorFlow 和张量处理单元(TPU)从头训练掩码语言模型(MLM)。通过利用 XLA(加速线性代数)和 TPUStrategy,开发者可以训练从几百万参数到大规模模型,例如 Google 的 PaLM 模型,该模型使用 TPU pod 训练了 5000 亿参数。

XLA 兼容性与 TPU 可访问性

在 TPU 上训练 TensorFlow 模型历来困难重重,原因是 XLA 不兼容以及数据整理器依赖非原生 TensorFlow 操作。Hugging Face 已更新其代码库,确保大多数 TensorFlow 模型兼容 XLA,消除这些障碍,使 TPU 训练更加易于使用。

鉴于高端 GPU 持续短缺,这一转变尤为关键。TPU 提供了一种高性能的替代方案,可访问超高性能计算硬件,为在不完全依赖 GPU 可用性的情况下训练大规模生成式 AI 和大语言模型(LLM)提供了可扩展的路径。

端到端训练工作流

为了展示该方法的可扩展性,Hugging Face 使用 WikiText (v1) 数据集从头训练了一个 RoBERTa-base 模型。该过程遵循特定的流水线,以确保在 TPU 硬件上的高效运行:

1. 分词器训练与数据准备

由于模型是从头训练的,需要自定义分词器。工作流包括:

  • 加载 WikiText 数据集的 train 切分,通过 ‚datasets。
  • 使用 ‚tokenizers 训练 Unigram 模型。
  • 将生成的分词器上传至 Hugging Face Hub。

2. 创建 TFRecord 分片

为了实现大规模并行处理,数据被转换为 TFRecord 分片,而不是单个文件。分词策略包括将样本拼接后拆分为固定大小的块(128 个 token),以防止截断导致的文本内容大量丢失。

这些分片随后上传至 Google Cloud Storage(GCS)桶。这对于 TPU 节点是必需的,因为它们的主机内存有限,必须直接从 GCS 流式读取数据。(注意:TPU VM 可以使用本地数据集或持久存储)。

3. 模型初始化与分布式训练

为了使用数据并行在 TPU 工作节点之间分布训练,模型和优化器必须在 TPUStrategy 范围内初始化:

import tensorflow as tf

tpu = tf.distribute.cluster_resolver.TPUClusterResolver(...)
strategy = tf.distribute.TPUStrategy(tpu)

with strategy.scope():
    # Model and tokenizer initialization happens here
    model = TFAutoModelForMaskedLM.from_config(config)

TPU 训练的关键技术要求

成功的 TPU 集成需要在数据管道和模型设置中进行特定配置:

  • TensorFlow 原生数据整理器DataCollatorForLanguageModeling 必须配置为 return_tensor="tf"。这确保整理器返回 TensorFlow 张量而非 NumPy 数组,对 TPU 兼容性至关重要。
  • GCS 集成:TensorFlow 的 tf.io.gfile.glob 可使用 gs:// 标识符无缝读取 GCS 桶中的 TFRecord 分片。
  • 模型检查点PushToHubCallback 用于在训练期间将模型检查点直接同步至 Hugging Face Hub。

推理与结果

训练完成后,可使用标准的 Hugging Face pipeline API 并传入 framework="tf" 参数进行推理部署。训练得到的 RoBERTa-base 模型使用 1e-4 的学习率进行更长时间的训练,其权重已在 Hugging Face Hub 上提供。

Sources