微调篇--基于PyTorch微调T5模型

前言

本次分享如何在PyTorch和中运行示例摘要训练脚本

设置

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

bash 复制代码
git clone https://github.com/huggingface/transformers
cd transformers
pip install .

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

git checkout tags/v3.5.1

在安装了正确的库版本后,进入您选择的版本的example文件夹并安装例子要求的环境:

pip install -r requirements.txt

运行脚本

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

lua 复制代码
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 知道这是一个摘要任务。

css 复制代码
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 参数以启用混合精度。

  • 使用 nproc_per_node 参数设置使用的GPU数量。

lua 复制代码
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深度学习编译器支持TPU(更多细节请参见这里)。要使用TPU,请启动xla_spawn.py脚本并使用num_cores参数设置要使用的TPU核心数量。

lua 复制代码
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在TPU上进行训练。要使用TPU,请将TPU资源的名称传递给tpu参数。

css 复制代码
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_no_trainer.py脚本,而不是run_summarization.py脚本。🤗 Accelerate支持的脚本需要在文件夹中有一个task_no_trainer.py文件。首先运行以下命令以创建并保存配置文件:

accelerate config

检测您的设置以确保配置正确:

accelerate test

现在您可以开始训练模型了:

lua 复制代码
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_filevalidation_file 分别指定您的训练和验证文件的路径。
  • text_column 是输入要进行摘要的文本。
  • summary_column 是目标输出的文本。

使用自定义数据集的摘要脚本看起来是这样的:

lua 复制代码
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
lua 复制代码
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

从checkpoint恢复训练

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

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

lua 复制代码
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参数从特定的checkpoint文件夹恢复训练。

lua 复制代码
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

分享模型

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

huggingface-cli login

然后,在脚本中添加push_to_hub参数。这个参数会创建一个带有您Hugging Face用户名和output_dir中指定的文件夹名称的仓库。

为了给您的仓库指定一个特定的名称,使用push_to_hub_model_id参数来添加它。该仓库将自动列出在您的命名空间下。

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

lua 复制代码
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
相关推荐
只有左边一个小酒窝7 分钟前
(十七)深度学习之线性代数:核心概念与应用解析
人工智能·深度学习·线性代数
Codebee1 小时前
OneCode核心概念解析——View(视图)
前端·人工智能
坚毅不拔的柠檬柠檬2 小时前
AI办公提效,Deepseek + wps生成ppt
人工智能·ai·wps·deepseek
张较瘦_2 小时前
[论文阅读] 人工智能+软件工程 | 用大语言模型架起软件需求形式化的桥梁
论文阅读·人工智能·软件工程
张较瘦_2 小时前
[论文阅读] 人工智能 + 软件工程 | USEagent:迈向统一的AI软件工程师
论文阅读·人工智能·软件工程
楼台的春风2 小时前
【Linux驱动开发 ---- 4.1_sysfs 详解】
linux·运维·c语言·数据库·人工智能·驱动开发·嵌入式硬件
Blossom.1182 小时前
基于深度学习的智能视频行为识别系统:技术与实践
人工智能·深度学习·神经网络·目标检测·机器学习·音视频·sklearn
苹果企业签名分发2 小时前
火山引擎豆包大模型系列新品发布
人工智能·火山引擎
硅谷秋水2 小时前
EfficientVLA:面向视觉-语言-动作模型无训练的加速与压缩
人工智能·深度学习·机器学习·机器人
qq_397752933 小时前
革新仓储新纪元:海格里斯HEGERLS四向穿梭车智领未来
大数据·人工智能