英文

long-t5-tglobal-xl + BookSum

简要概述长文本,并获得类似SparkNotes的主题摘要!

使用 the base model 上的ASR进行的一个简单示例/用例是 here

调皮的概念验证

infamous navy seals copypasta 的摘要:

在这一章中,怪物解释了他打算如何对那个侮辱他的"小婊子"实施报复。他告诉这个孩子,他是一个训练有素、经验丰富的杀手,他将利用他的武器库——包括他对互联网的访问权限——对这个小坏蛋进行正义的伸张。

虽然这只是一个粗略的例子,但你可以尝试将这段文本复制到其他摘要模型中,看到它们与理解程度的区别(即使它还不算是一个"长"文本!)。

目录

  • 描述
  • Python中的操作指南
    • 超越基础
      • 调整参数
      • LLM.int8量化
  • 关于
    • 预期的用途和限制
    • 培训和评估数据
    • 评估结果
  • 常见问题
    • 如何在CPU上运行推理?
    • 如何在批处理中运行超长(30k+标记)的文档的推理?
    • 如何进行进一步的微调?
    • 有什么更简单的运行方法吗?
  • 培训过程
    • 更新
    • 培训超参数
    • 应用版本

描述

在kmfoda/booksum数据集上对 google/long-t5-tglobal-xl 进行了微调。

在这里阅读顾恩等人的论文: LongT5: Efficient Text-To-Text Transformer for Long Sequences

Python操作指南

安装/更新transformers:pip install -U transformers

使用流水线对文本进行摘要:

import torch
from transformers import pipeline

summarizer = pipeline(
    "summarization",
    "pszemraj/long-t5-tglobal-xl-16384-book-summary",
    device=0 if torch.cuda.is_available() else -1,
)
long_text = "Here is a lot of text I don't want to read. Replace me"

result = summarizer(long_text)
print(result[0]["summary_text"])

超越基础

除了简单的推理之外,还要考虑两个附加点:调整解码参数以提高性能,以及量化以减少内存消耗。

调整参数

调用summarizer时传递 other parameters related to beam search textgen 以获得更高质量的结果。

LLM.int8量化

替代标题:如何让该模型在免费的协作运行时中运行推理。

通过 this PR ,现在支持在long-t5模型上使用LLM.int8。
  • 在初步测试中,尽管使用的内存较少,但摘要质量似乎保持不变!*
  • 该模型的8位版本是 already on the hub here ,因此如果您只使用8位版本,则可以从中开始下载,只需占用3.5 GB的空间!

首先确保您拥有相关软件包的最新版本:

pip install -U transformers bitsandbytes accelerate

加载为8位(由后台的bitsandbytes完成的黑魔法)

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

tokenizer = AutoTokenizer.from_pretrained(
    "pszemraj/long-t5-tglobal-xl-16384-book-summary"
)

model = AutoModelForSeq2SeqLM.from_pretrained(
    "pszemraj/long-t5-tglobal-xl-16384-book-summary",
    load_in_8bit=True,
    device_map="auto",
)

上述内容已经在顶部链接的Colab演示中提供。

*随时间推移,将进行更严格的基于指标的比较研究,比较具有和不具有LLM.int8的波束搜索摘要。

关于

预期的用途和限制

虽然该模型似乎提高了事实的一致性,但不要把摘要当作绝对可靠的依据,而是检查那些看起来奇怪的事情。

具体来说:否定性陈述(即,该模型说:这个东西没(属性),而实际上它应该说这个东西有很多(属性))。

  • 我相信有一天会有人写一篇论文(如果还没有的话),但通常您可以通过比较特定陈述与周围句子的含义来进行检查。

培训和评估数据

阅读HuggingFace上的kmfoda/booksum数据集的 the original paper here

  • 对于初始微调,仅使用了输入标记少于12288个和输出标记少于1024个的输入文本(即,在训练之前放弃了更长的行)出于内存原因。 经过快速分析,12288-16384范围内的摘要在该数据集中占少数。
    • 此外,这次训练的初始阶段将训练和验证集合并在一起,并以聚合方式对其进行训练,以增加功能数据集的大小。 因此,请保持对验证集结果的怀疑态度;主要指标应为测试集。
  • 最后的微调阶段使用了标准的16384输入/1024输出约定,保留了标准的输入/输出长度(并截断了更长的序列)。 这似乎没有改变损失/性能太多。

评估结果

使用 model evaluator 将计算并在此处发布的官方结果。

请阅读上面的说明,由于训练方法,验证集上的性能看起来比测试集上的结果更好。

  • eval_loss: 1.2756≈/li>
  • eval_rouge1: 41.8013≈/li>
  • eval_rouge2: 12.0895≈/li>
  • eval_rougeL: 21.6007≈/li>
  • eval_rougeLsum: 39.5382≈/li>
  • eval_gen_len: 387.2945≈/li>
  • eval_runtime: 13908.4995≈/li>
  • eval_samples_per_second: 0.107≈/li>
  • eval_steps_per_second: 0.027≈/li>
  • *****预测/测试指标(初始)*****    predict_gen_len = 506.4368    predict_loss = 2.028    predict_rouge1 = 36.8815    predict_rouge2 = 8.0625    predict_rougeL = 17.6161    predict_rougeLsum = 34.9068    predict_runtime = 2:04:14.37    predict_samples = 1431    predict_samples_per_second = 0.192    predict_steps_per_second = 0.048 

*评估大模型并不像看起来那么容易。正在进行更多研究。

常见问题

如何在CPU上运行推理?

笑。

如何批处理地对超长(30k+标记)的文档进行推理?

参见 the code for my hf space Document Summarization 中的summarize.py :)

您还可以使用相同的代码将文档分割成4096等批次,并使用模型迭代处理它们。这在CUDA内存有限的情况下非常有用。

更新:请参见下面关于textsum软件包的部分。

如何进一步微调?

请参阅 train with a script the summarization scripts

有什么更简单的运行方法吗?

出于这个原因,我创建了一个Python软件包工具。它叫做 textsum ,您可以使用它来加载模型并用几行代码对东西进行摘要。

pip install textsum

在Python中使用此模型的textsum包:

from textsum.summarize import Summarizer

summarizer = Summarizer(
    model_name_or_path="pszemraj/long-t5-tglobal-xl-16384-book-summary"
)

long_string = "This is a long string of text that will be summarized."
out_str = summarizer.summarize_string(long_string)
print(f"summary: {out_str}")

该软件包提供了易于使用的接口,用于将摘要模型应用于任意长度的文本文档。当前实现的接口包括Python API、CLI和可共享的演示应用程序。

有关详细信息、解释和文档,请参阅README(上面链接的)或 wiki

培训程序

更新

相关的模型/模型卡资料将在此处发布。

培训超参数

在培训期间使用了以下超参数:

  • 学习率:0.0006
  • train_batch_size:1
  • eval_batch_size:1
  • 种子:10350
  • 分布式类型:多GPU
  • 设备数量:4
  • 梯度累积步数:32
  • 总训练批次大小:128
  • 总评估批次大小:4
  • 优化器:Adam,betas=(0.9、0.999),epsilon=1e-08
  • lr_scheduler_type:constant
  • num_epochs:1.0

*以前的训练会话使用的参数大致相似(学习率更高),由于训练时间很长,需要多次训练。

框架版本

  • Transformers 4.25.0.dev0
  • Pytorch 1.13.0+cu117
  • Datasets 2.6.1
  • Tokenizers 0.13.1