编写脚本进行训练教程

除了🤗 Transformers的 notebooks 之外,还有示例脚本展示了如何使用 PyTorchTensorFlowJAX/Flax 训练模型。

您还可以在我们的 研究项目旧示例 中找到我们在其中使用的脚本,其中大部分由社区贡献。这些脚本没有得到积极维护,并且需要使用特定版本的🤗 Transformers,该版本很可能与库的最新版本不兼容。

示例脚本不是期望在每个问题上直接可用的,您可能需要根据您要解决的问题来调整脚本。为了帮助您,大多数脚本完全公开了数据预处理的过程,允许您根据需要进行编辑以适应您的用例。

如果您想在示例脚本中实现任何功能,请在提交拉取请求之前在 论坛问题 中讨论。尽管我们欢迎修复错误,但是我们不太可能合并损失可读性的新功能 PR。

本指南将展示如何在 PyTorchTensorFlow 中运行示例摘要训练脚本。除非另有说明,所有示例都预期在两个框架中都有效。

初始化

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

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

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

Examples for older versions of 🤗 Transformers

然后将您当前的🤗 Transformers 切换到特定版本,例如 v3.5.1:

git checkout tags/v3.5.1

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

pip install -r requirements.txt

运行脚本

Pytorch
Hide Pytorch content

示例脚本会从🤗 Datasets 库下载和预处理数据集,然后使用支持摘要的架构在 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
TensorFlow
Hide TensorFlow content

示例脚本会从🤗 Datasets 库下载和预处理数据集,然后使用Keras在支持摘要的架构上微调数据集。以下示例展示了如何在 CNN/DailyMail 数据集上微调 T5-small 。T5模型需要额外的source_prefix参数,该提示让T5知道这是一个摘要任务。

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数量。
python -m torch.distributed.launch \
    --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 进行分布式训练,您不需要向训练脚本添加任何其他参数。如果有多个可用的GPU,默认情况下,TensorFlow脚本将使用多个GPU。

在 TPU 上运行脚本

Pytorch
Hide Pytorch content

Tensor Processing Units (TPUs) 是专门设计用于加速性能的。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
TensorFlow
Hide TensorFlow content

Tensor Processing Units (TPUs) 是专门设计用于加速性能的。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

使用 🤗 Accelerate 运行脚本

🤗 Accelerate 是一个仅适用于 PyTorch 的库,提供了一种统一的方法,在多种环境设置(仅 CPU、多个 GPU、TPU)上训练模型。如果您还没有安装 🤗 Accelerate,请确保安装它:

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

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

训练时,不再使用 run_summarization.py 脚本,而是使用 run_summarization_no_trainer.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

使用自定义数据集

摘要脚本支持自定义数据集,只要它们是 CSV 或 JSON Line 文件即可。当使用自己的数据集时,您需要指定几个额外的参数:

  • train_filevalidation_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