使用脚本进行训练
原文链接:
huggingface.co/docs/transformers/v4.37.2/en/run_scripts
除了🤗 Transformers 的 notebooks 之外,还有示例脚本演示如何使用PyTorch、TensorFlow或JAX/Flax训练模型的方法。
您还会发现我们在研究项目和遗留示例中使用的脚本,这些脚本大多是社区贡献的。这些脚本目前没有得到积极维护,并且需要特定版本的🤗 Transformers,这很可能与库的最新版本不兼容。
示例脚本不是期望在每个问题上立即运行,您可能需要调整脚本以适应您要解决的问题。为了帮助您,大多数脚本完全暴露了数据预处理的方式,允许您根据需要进行编辑以适应您的用例。
对于您想在示例脚本中实现的任何功能,请在提交拉取请求之前在论坛或问题中讨论。虽然我们欢迎错误修复,但是我们不太可能合并增加更多功能但牺牲可读性的拉取请求。
本指南将向您展示如何在PyTorch和TensorFlow中运行一个示例摘要训练脚本。除非另有说明,所有示例都预计能够在两个框架中运行。
设置
要成功运行示例脚本的最新版本,您必须在新的虚拟环境中从源代码安装🤗 Transformers:
git clone https://github.com/huggingface/transformers cd transformers pip install .
对于旧版本的示例脚本,请点击下面的切换:
旧版本🤗 Transformers 的示例
- v4.5.1
- v4.4.2
- v4.3.3
- v4.2.2
- v4.1.1
- v4.0.1
- v3.5.1
- v3.4.0
- v3.3.1
- v3.2.0
- v3.1.0
- v3.0.2
- v2.11.0
- v2.10.0
- v2.9.1
- v2.8.0
- v2.7.0
- v2.6.0
- v2.5.1
- v2.4.0
- v2.3.0
- v2.2.0
- v2.1.1
- v2.0.0
- v1.2.0
- v1.1.0
- v1.0.0
Then switch your current clone of 🤗 Transformers to a specific version, like v3.5.1 for example:
git checkout tags/v3.5.1
After you’ve setup the correct library version, navigate to the example folder of your choice and install the example specific requirements:
pip install -r requirements.txt
Run a script
PytorchHide Pytorch content
The example script downloads and preprocesses a dataset from the 🤗 Datasets library. Then the script fine-tunes a dataset with the Trainer on an architecture that supports summarization. The following example shows how to fine-tune T5-small on the CNN/DailyMail dataset. The T5 model requires an additional source_prefix
argument due to how it was trained. This prompt lets T5 know this is a summarization task.
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
TensorFlowHide TensorFlow content
The example script downloads and preprocesses a dataset from the 🤗 Datasets library. Then the script fine-tunes a dataset using Keras on an architecture that supports summarization. The following example shows how to fine-tune T5-small on the CNN/DailyMail dataset. The T5 model requires an additional source_prefix
argument due to how it was trained. This prompt lets T5 know this is a summarization task.
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
Distributed training and mixed precision
The Trainer supports distributed training and mixed precision, which means you can also use it in a script. To enable both of these features:
- Add the
fp16
argument to enable mixed precision. - Set the number of GPUs to use with the
nproc_per_node
argument.
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 scripts utilize a MirroredStrategy
for distributed training, and you don’t need to add any additional arguments to the training script. The TensorFlow script will use multiple GPUs by default if they are available.
Run a script on a TPU
PytorchHide Pytorch content
Tensor Processing Units (TPUs) are specifically designed to accelerate performance. PyTorch supports TPUs with the XLA deep learning compiler (see here for more details). To use a TPU, launch the xla_spawn.py
script and use the num_cores
argument to set the number of TPU cores you want to use.
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
TensorFlowHide TensorFlow content
Tensor Processing Units (TPUs) are specifically designed to accelerate performance. TensorFlow scripts utilize a TPUStrategy
for training on TPUs. To use a TPU, pass the name of the TPU resource to the tpu
argument.
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
Run a script with 🤗 Accelerate
🤗 Accelerate is a PyTorch-only library that offers a unified method for training a model on several types of setups (CPU-only, multiple GPUs, TPUs) while maintaining complete visibility into the PyTorch training loop. Make sure you have 🤗 Accelerate installed if you don’t already have it:
Note: As Accelerate is rapidly developing, the git version of accelerate must be installed to run the scripts
pip install git+https://github.com/huggingface/accelerate
你需要使用run_summarization_no_trainer.py
脚本,而不是run_summarization.py
脚本。🤗 加速支持的脚本将在文件夹中有一个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_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
使用🤗 Accelerate 进行分布式训练
随着模型变得更大,并行性已经成为在有限硬件上训练更大模型并通过几个数量级加速训练速度的策略。在 Hugging Face,我们创建了🤗 Accelerate库,以帮助用户轻松地在任何类型的分布式设置上训练🤗 Transformers 模型,无论是在一台机器上的多个 GPU 还是跨多台机器的多个 GPU。在本教程中,了解如何自定义您的本地 PyTorch 训练循环以在分布式环境中进行训练。
设置
通过安装🤗 Accelerate 开始:
pip install accelerate
然后导入并创建一个Accelerator对象。Accelerator将自动检测您的分布式设置类型,并初始化所有必要的组件进行训练。您不需要明确将模型放在设备上。
>>> from accelerate import Accelerator >>> accelerator = Accelerator()
准备加速
下一步是将所有相关的训练对象传递给prepare方法。这包括您的训练和评估 DataLoaders,一个模型和一个优化器:
>>> train_dataloader, eval_dataloader, model, optimizer = accelerator.prepare( ... train_dataloader, eval_dataloader, model, optimizer ... )
向后
最后一个补充是用🤗 Accelerate 的backward方法替换训练循环中典型的loss.backward()
:
>>> for epoch in range(num_epochs): ... for batch in train_dataloader: ... outputs = model(**batch) ... loss = outputs.loss ... accelerator.backward(loss) ... optimizer.step() ... lr_scheduler.step() ... optimizer.zero_grad() ... progress_bar.update(1)
如下面的代码所示,您只需要向训练循环中添加四行额外的代码即可启用分布式训练!
+ from accelerate import Accelerator from transformers import AdamW, AutoModelForSequenceClassification, get_scheduler + accelerator = Accelerator() model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) optimizer = AdamW(model.parameters(), lr=3e-5) - device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") - model.to(device) + train_dataloader, eval_dataloader, model, optimizer = accelerator.prepare( + train_dataloader, eval_dataloader, model, optimizer + ) num_epochs = 3 num_training_steps = num_epochs * len(train_dataloader) lr_scheduler = get_scheduler( "linear", optimizer=optimizer, num_warmup_steps=0, num_training_steps=num_training_steps ) progress_bar = tqdm(range(num_training_steps)) model.train() for epoch in range(num_epochs): for batch in train_dataloader: - batch = {k: v.to(device) for k, v in batch.items()} outputs = model(**batch) loss = outputs.loss - loss.backward() + accelerator.backward(loss) optimizer.step() lr_scheduler.step() optimizer.zero_grad() progress_bar.update(1)
训练
添加了相关代码行后,可以在脚本或类似 Colaboratory 的笔记本中启动训练。
使用脚本进行训练
如果您从脚本中运行训练,请运行以下命令以创建并保存配置文件:
accelerate config
然后启动您的训练:
accelerate launch train.py
使用笔记本进行训练
🤗 Accelerate 也可以在笔记本中运行,如果您计划使用 Colaboratory 的 TPU。将负责训练的所有代码包装在一个函数中,并将其传递给notebook_launcher:
>>> from accelerate import notebook_launcher >>> notebook_launcher(training_function)
有关🤗 Accelerate 及其丰富功能的更多信息,请参考文档。
使用🤗 PEFT 加载适配器
参数高效微调(PEFT)方法在微调期间冻结预训练模型参数,并在其上添加少量可训练参数(适配器)。适配器被训练以学习特定任务的信息。这种方法已被证明在使用更低的计算资源的同时产生与完全微调模型相媲美的结果时非常节省内存。
使用 PEFT 训练的适配器通常比完整模型小一个数量级,这样方便分享、存储和加载。
存储在 Hub 上的 OPTForCausalLM 模型的适配器权重仅约为 6MB,而模型权重的完整大小可能约为 700MB。
如果您想了解更多关于🤗 PEFT 库的信息,请查看文档。
设置
通过安装🤗 PEFT 来开始:
pip install peft
如果您想尝试全新的功能,您可能会对从源代码安装库感兴趣:
pip install git+https://github.com/huggingface/peft.git
支持的 PEFT 模型
🤗 Transformers 原生支持一些 PEFT 方法,这意味着您可以加载本地或 Hub 上存储的适配器权重,并使用几行代码轻松运行或训练它们。支持以下方法:
如果您想使用其他 PEFT 方法,如提示学习或提示调整,或者了解🤗 PEFT 库的一般信息,请参考文档。
加载 PEFT 适配器
加载和使用🤗 Transformers 中的 PEFT 适配器模型时,请确保 Hub 存储库或本地目录包含一个adapter_config.json
文件和适配器权重,如上面的示例图所示。然后,您可以使用AutoModelFor
类加载 PEFT 适配器模型。例如,要加载用于因果语言建模的 PEFT 适配器模型:
- 指定 PEFT 模型 ID
- 将其传递给 AutoModelForCausalLM 类
from transformers import AutoModelForCausalLM, AutoTokenizer peft_model_id = "ybelkada/opt-350m-lora" model = AutoModelForCausalLM.from_pretrained(peft_model_id)
您可以使用AutoModelFor
类或基本模型类(如OPTForCausalLM
或LlamaForCausalLM
)加载 PEFT 适配器。
您还可以通过调用load_adapter
方法加载 PEFT 适配器:
from transformers import AutoModelForCausalLM, AutoTokenizer model_id = "facebook/opt-350m" peft_model_id = "ybelkada/opt-350m-lora" model = AutoModelForCausalLM.from_pretrained(model_id) model.load_adapter(peft_model_id)
Transformers 4.37 中文文档(二)(2)https://developer.aliyun.com/article/1563282