使用脚本训练
除了🤗 Transformers的笔记本外,还有一些示例脚本展示了如何使用PyTorch、TensorFlow或JAX/Flax为任务训练模型。
您还可以找到我们在研究项目和遗留示例中使用的脚本,这些脚本大多由社区贡献。这些脚本没有积极维护,并且需要一个特定版本的🤗 Transformers,很可能与库的最新版本不兼容。
示例脚本并不期望在每个问题上都能直接使用,您可能需要根据您要解决的问题调整脚本。为了帮助您完成这一过程,大多数脚本完全公开了数据是如何预处理的,允许您根据您的用例进行必要的编辑。
对于您希望在示例脚本中实现的任何功能,请在提交拉取请求之前在论坛或问题中进行讨论。虽然我们欢迎错误修复,但我们不太可能合并以牺牲可读性为代价添加更多功能的拉取请求。
本指南将向您展示如何在PyTorch和TensorFlow中运行一个示例摘要训练脚本。除非另有说明,所有示例都应与这两个框架兼容。
设置
要成功运行最新版本的示例脚本,您必须在一个新的虚拟环境中从源代码安装 🤗 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
运行脚本
示例脚本从🤗 Datasets 库下载并预处理一个数据集。然后,脚本在支持摘要的架构上使用Trainer对数据集进行微调。以下示例展示了如何在CNN/DailyMail数据集上微调T5-small。由于T5模型的训练方式,它需要一个额外的source_prefix
参数。这个提示让T5知道这是一个摘要任务。
python examples/pytorch/summarization/run_summarization.py \
--model_name_or_path google-t5/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
示例脚本从🤗 Datasets 库下载并预处理一个数据集。然后,脚本在支持摘要生成的架构上使用Keras对数据集进行微调。以下示例展示了如何在CNN/DailyMail数据集上微调T5-small。由于T5模型的训练方式,它需要一个额外的source_prefix
参数。这个提示让T5知道这是一个摘要生成任务。
python examples/tensorflow/summarization/run_summarization.py \
--model_name_or_path google-t5/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
或bf16
参数以启用混合精度。XPU设备仅支持bf16
用于混合精度训练。 - 使用
nproc_per_node
参数设置要使用的GPU数量。
torchrun \
--nproc_per_node 8 pytorch/summarization/run_summarization.py \
--fp16 \
--model_name_or_path google-t5/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上运行脚本
张量处理单元(TPUs)是专门设计用于加速性能的。PyTorch 通过 XLA 深度学习编译器支持 TPUs(更多详情请参见 这里)。要使用 TPU,请启动 xla_spawn.py
脚本,并使用 num_cores
参数设置你想要使用的 TPU 核心数量。
python xla_spawn.py --num_cores 8 \
summarization/run_summarization.py \
--model_name_or_path google-t5/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
张量处理单元(TPUs)是专门设计用于加速性能的。TensorFlow脚本使用TPUStrategy
在TPUs上进行训练。要使用TPU,请将TPU资源的名称传递给tpu
参数。
python run_summarization.py \
--tpu name_of_tpu_resource \
--model_name_or_path google-t5/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)上训练模型,同时保持对 PyTorch 训练循环的完全可见性。如果你还没有安装 🤗 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 google-t5/t5-small \
--dataset_name cnn_dailymail \
--dataset_config "3.0.0" \
--source_prefix "summarize: " \
--output_dir ~/tmp/tst-summarization
使用自定义数据集
摘要脚本支持自定义数据集,只要它们是CSV或JSON Line文件。当您使用自己的数据集时,您需要指定几个额外的参数:
train_file
和validation_file
指定了训练和验证文件的路径。text_column
是要总结的输入文本。summary_column
是要输出的目标文本。
使用自定义数据集的摘要脚本如下所示:
python examples/pytorch/summarization/run_summarization.py \
--model_name_or_path google-t5/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 google-t5/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 google-t5/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 google-t5/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 google-t5/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