一、说明

   除了 Transformers 笔记本之外,还有一些示例脚本演示如何使用 PyTorch、TensorFlow 或 JAX/Flax 为任务训练模型。

   您还可以找到我们在研究项目中使用的脚本和遗留示例,这些示例大多是社区贡献的。这些脚本不会主动维护,并且需要特定版本的Transformers,而这些版本很可能与最新版本的库不兼容。

   示例脚本不应开箱即用地处理每个问题,您可能需要根据要解决的问题调整脚本。为了帮助您实现此目的,大多数脚本都完全公开了数据的预处理方式,允许您根据用例的需要对其进行编辑。

   对于您想在示例脚本中实现的任何功能,请在提交拉取请求之前在论坛或问题中讨论。虽然我们欢迎错误修复,但我们不太可能合并以牺牲可读性为代价添加更多功能的拉取请求。

   本指南将向您展示如何在 PyTorch 和 TensorFlow 中运行示例摘要训练脚本。除非另有说明,否则所有示例都应同时适用于这两个框架。

二、设置

   要成功运行最新版本的示例脚本,您必须在新的虚拟环境中从源代码安装 🤗 Transformers:

git clone https://github.com/huggingface/transformers
cd transformers
pip install .

   对于旧版本的示例脚本,请单击下面的切换开关:

   旧版本的Transformer 示例
然后将您当前的 Transformer 克隆切换到特定版本,例如 v3.5.1:

git checkout tags/v3.5.1

   设置正确的库版本后,导航到所选的示例文件夹并安装示例特定要求:

pip install -r requirements.txt

三、运行脚本

3.1 torch脚本

   该示例脚本从数据集库下载并预处理数据集。然后,脚本在支持汇总的架构上使用 Trainer 微调数据集。以下示例展示了如何在 CNN/DailyMail 数据集上微调 T5-small。由于训练方式的原因,T5 模型需要额外的 source_prefix 参数。这个提示让T5知道这是一个总结任务。

python examples/pytorch/summarization/run_summarization.py \
    --model_name_or_path t5-small \
    --do_train \
    --do_eval \
    --dataset_name cnn_dailymail \
    --dataset_config "3.0.0" \
    --source_prefix "summarize: " \
    --output_dir /tmp/tst-summarization \
    --per_device_train_batch_size=4 \
    --per_device_eval_batch_size=4 \
    --overwrite_output_dir \
    --predict_with_generate

3.2 tensorflow脚本

   示例脚本从Datasets 库下载并预处理数据集。然后,该脚本在支持摘要的体系结构上使用 Keras 微调数据集。以下示例演示如何在 CNN/DailyMail 数据集上微调 T5-small。由于 T5 模型的训练方式,它需要额外的参数。此提示让 T5 知道这是一个摘要任务。source_prefix

 python examples/tensorflow/summarization/run_summarization.py  \
    --model_name_or_path t5-small \
    --dataset_name cnn_dailymail \
    --dataset_config "3.0.0" \
    --output_dir /tmp/tst-summarization  \
    --per_device_train_batch_size 8 \
    --per_device_eval_batch_size 16 \
    --num_train_epochs 3 \
    --do_train \
    --do_eval

四、分布式训练和混合精度

   Trainer 支持分布式训练和混合精度,这意味着您也可以在脚本中使用它。要启用这两个功能:

   添加 fp16 参数以启用混合精度。通过 nproc_per_node 参数设置要使用的 GPU 数量。

 torchrun \
    --nproc_per_node 8 pytorch/summarization/run_summarization.py \
    --fp16 \
    --model_name_or_path t5-small \
    --do_train \
    --do_eval \
    --dataset_name cnn_dailymail \
    --dataset_config "3.0.0" \
    --source_prefix "summarize: " \
    --output_dir /tmp/tst-summarization \
    --per_device_train_batch_size=4 \
    --per_device_eval_batch_size=4 \
    --overwrite_output_dir \
    --predict_with_generate

   TensorFlow 脚本利用 MirroredStrategy 进行分布式训练,您无需向训练脚本添加任何其他参数。默认情况下,TensorFlow 脚本将使用多个 GPU(如果可用)。

五、在 TPU 上运行脚本

1)torch上
   张量处理单元 (TPU) 专为提高性能而设计。 PyTorch 通过 XLA 深度学习编译器支持 TPU(请参阅此处了解更多详细信息)。要使用 TPU,请启动 xla_spawn.py 脚本并使用 num_cores 参数设置要使用的 TPU 核心数量。

python xla_spawn.py --num_cores 8 \
    summarization/run_summarization.py \
    --model_name_or_path t5-small \
    --do_train \
    --do_eval \
    --dataset_name cnn_dailymail \
    --dataset_config "3.0.0" \
    --source_prefix "summarize: " \
    --output_dir /tmp/tst-summarization \
    --per_device_train_batch_size=4 \
    --per_device_eval_batch_size=4 \
    --overwrite_output_dir \
    --predict_with_generate

2)TensorFlow
   张量处理单元 (TPU) 专为提高性能而设计。 TensorFlow 脚本利用 TPUStrategy 在 TPU 上进行训练。要使用 TPU,请将 TPU 资源的名称传递给 tpu 参数。

python run_summarization.py  \
    --tpu name_of_tpu_resource \
    --model_name_or_path t5-small \
    --dataset_name cnn_dailymail \
    --dataset_config "3.0.0" \
    --output_dir /tmp/tst-summarization  \
    --per_device_train_batch_size 8 \
    --per_device_eval_batch_size 16 \
    --num_train_epochs 3 \
    --do_train \
    --do_eval

3)使用 Accelerate 运行脚本
   Accelerate 是一个仅限 PyTorch 的库,它提供了一种统一的方法,用于在多种类型的设置(仅 CPU、多个 GPU、TPU)上训练模型,同时保持对 PyTorch 训练循环的完全可见性。如果尚未安装 Accelerate,请确保已安装它:

   注意:由于 Accelerate 正在快速开发,因此必须安装 git 版本的 accelerate 才能运行脚本

pip install git+https://github.com/huggingface/accelerate

   您需要使用 run_summarization_no_trainer.py 脚本,而不是 run_summarization.py 脚本。 Accelerate 支持的脚本在文件夹中会有一个 task_no_trainer.py 文件。首先运行以下命令来创建并保存配置文件:

accelerate config

测试您的设置,确保其配置正确:

accelerate test

现在,你已准备好启动训练:

accelerate launch run_summarization_no_trainer.py \
    --model_name_or_path t5-small \
    --dataset_name cnn_dailymail \
    --dataset_config "3.0.0" \
    --source_prefix "summarize: " \
    --output_dir ~/tmp/tst-summarization

4)使用自定义数据集
摘要脚本支持自定义数据集,只要它们是 CSV 或 JSON 行文件即可。使用自己的数据集时,需要指定几个其他参数:

train_file并指定训练和验证文件的路径。validation_file
text_column是要汇总的输入文本。
summary_column是要输出的目标文本。
使用自定义数据集的摘要脚本如下所示:

python examples/pytorch/summarization/run_summarization.py \
    --model_name_or_path t5-small \
    --do_train \
    --do_eval \
    --train_file path_to_csv_or_jsonlines_file \
    --validation_file path_to_csv_or_jsonlines_file \
    --text_column text_column_name \
    --summary_column summary_column_name \
    --source_prefix "summarize: " \
    --output_dir /tmp/tst-summarization \
    --overwrite_output_dir \
    --per_device_train_batch_size=4 \
    --per_device_eval_batch_size=4 \
    --predict_with_generate

六、测试脚本

在提交整个数据集之前,最好在较少数量的数据集示例上运行脚本,以确保一切按预期工作,这可能需要数小时才能完成。使用以下参数将数据集截断为最大样本数:

max_train_samples
max_eval_samples
max_predict_samples
python examples/pytorch/summarization/run_summarization.py \
    --model_name_or_path t5-small \
    --max_train_samples 50 \
    --max_eval_samples 50 \
    --max_predict_samples 50 \
    --do_train \
    --do_eval \
    --dataset_name cnn_dailymail \
    --dataset_config "3.0.0" \
    --source_prefix "summarize: " \
    --output_dir /tmp/tst-summarization \
    --per_device_train_batch_size=4 \
    --per_device_eval_batch_size=4 \
    --overwrite_output_dir \
    --predict_with_generate

并非所有示例脚本都支持该参数。如果不确定脚本是否支持此参数,请添加要检查的参数:

max_predict_samples-h
examples/pytorch/summarization/run_summarization.py -h

七、从检查点恢复训练

另一个有用的选项是从之前的检查点恢复训练。这将确保您在训练中断时可以从上次停下的地方继续,而无需重新开始。有两种方法可以从检查点恢复训练。

第一种方法使用output_dir previous_output_dir参数从output_dir中存储的最新检查点恢复训练。在这种情况下,您应该删除 overwrite_output_dir:

python examples/pytorch/summarization/run_summarization.py
    --model_name_or_path t5-small \
    --do_train \
    --do_eval \
    --dataset_name cnn_dailymail \
    --dataset_config "3.0.0" \
    --source_prefix "summarize: " \
    --output_dir /tmp/tst-summarization \
    --per_device_train_batch_size=4 \
    --per_device_eval_batch_size=4 \
    --output_dir previous_output_dir \
    --predict_with_generate

第二种方法使用resume_from_checkpoint path_to_specific_checkpoint 参数从特定检查点文件夹恢复训练。

python examples/pytorch/summarization/run_summarization.py
    --model_name_or_path t5-small \
    --do_train \
    --do_eval \
    --dataset_name cnn_dailymail \
    --dataset_config "3.0.0" \
    --source_prefix "summarize: " \
    --output_dir /tmp/tst-summarization \
    --per_device_train_batch_size=4 \
    --per_device_eval_batch_size=4 \
    --overwrite_output_dir \
    --resume_from_checkpoint path_to_specific_checkpoint \
    --predict_with_generate

八、分享您的模型

所有脚本都可以将您的最终模型上传到模型中心。在开始之前,请确保您已登录 Hugging Face:

huggingface-cli login

然后将push_to_hub参数添加到脚本中。此参数将使用您的 Hugging Face 用户名和 output_dir 中指定的文件夹名称创建一个存储库。

要为您的存储库指定特定名称,请使用 push_to_hub_model_id 参数添加它。该存储库将自动列在您的命名空间下。

以下示例展示了如何上传具有特定存储库名称的模型:

python examples/pytorch/summarization/run_summarization.py
    --model_name_or_path t5-small \
    --do_train \
    --do_eval \
    --dataset_name cnn_dailymail \
    --dataset_config "3.0.0" \
    --source_prefix "summarize: " \
    --push_to_hub \
    --push_to_hub_model_id finetuned-t5-cnn_dailymail \
    --output_dir /tmp/tst-summarization \
    --per_device_train_batch_size=4 \
    --per_device_eval_batch_size=4 \
    --overwrite_output_dir \
    --predict_with_generate
02-09 02:00