强大高效的LLM:微调Flan-T5 XXL
面对越来越多的大型语言模型(LLM),用户不得不问自己一个重要的问题——哪种模型能在性能和效率之间取得适当的平衡?
超大型模型(如ChatGPT)通常较大,因为它们承载了更多的世界知识,并能在自由文本生成方面提供更强的性能。这在人工智能助手或聊天机器人中很有用,但并不能使它们成为每项任务的最高效解决方案。
我们可以使用Flan-T5等更小巧、更具成本效益的模型,在各种自然语言处理应用中实现最先进(SOTA)的性能。
我们在Paperspace上推出推理notebooks时,曾介绍过Flan-T5的Large和XL版本的优势。
现在,我们很高兴推出针对Graphcore(拟未) IPU的Flan-T5 XXL(和XL)微调。通过对这一110亿参数版本的Flan-T5进行微调,开发人员和企业可以针对其特定的自然语言处理工作负载进行性能优化。
由于Flan-T5 XXL及其预训练的权重是开源的,可以免费下载,因此可以修改后用于商业用途,而不受许可限制。
利用Paperspace Gradient Notebooks,Flan-T5 XXL及其相对较小的30亿参数Flan-T5 XL可以在IPU Pod16以上的任何Graphcore系统上微调和运行。
我们也为这两种尺寸的Flan-T5提供了推理notebooks。
Flan-T5 XXL最低可在IPU-Pod16上运行,而Flan-T5 XL推理可在IPU-Pod4上运行(Paperspace提供六小时免费试用)。
https://ipu.dev/JKcoSs
https://ipu.dev/UOonLS
https://ipu.dev/vyODS3
性能
Flan-T5[1]是一个编码器-解码器transformer模型,可将所有自然语言处理任务重构为文本到文本格式。与T5相比,Flan-T5在1000多个额外任务上进行了微调。
通过观察它在多任务语言理解(MMLU)基准测试中的表现,我们可以发现它与更大的模型相比具有很强的竞争力。
部分MMLU leaderboard来自Papers With Code[2]
如欲了解对Flan-T5及其在各种自然语言处理任务中性能的深入分析,敬请查看我们的往期文章:
微调Flan-T5 XXL
语言模型之所以强大,是因为大量任务都可以表述为文本到文本问题,从而适应生成设置,即要求模型预测未来的标记(token)。更多详情,请参阅T5论文[3]和Flan-T5论文[4]。
在本文和随附的notebook[5]中,我们将应用T5论文中的观点,并使用GLUE MNLI[6]数据集在文本蕴涵任务中对Flan-T5进行微调。我们还将介绍如何轻松调整此示例,从而对多个下游任务进行自定义微调。
注:该notebook同时支持Flan-T5 XXL和Flan-T5 XL,但本文中的代码片段针对的是XXL模型。
MNLI数据集由成对的句子组成,一个前提,一个假设。任务是预测前提和假设之间的关系,这种关系可以是:
蕴涵:假设从前提中引申出来
矛盾:假设与前提相矛盾
中性:假设和前提无关
MNLI数据集的数据拆分如下:
训练拆分:392'702个例子
验证匹配拆分:9'815个例子
验证不匹配拆分:9'832个例子
匹配拆分的样本与训练集中的样本来源相同,而不匹配拆分的样本与训练集中的样本来源不同,因此与训练时看到的样本并不相似。在验证时,我们将使用后者。
您可以在Hugging Face上探索MNLI数据集[7]。
如前所述,T5采用编码器-解码器结构,因此需要两个输入序列:一个用于编码器,另一个用于解码器。编码器的输入提示格式为:
mnli hypothesis: {hypothesis} premise: {premise}
我们向解码器提供相应的标签,标签向右移动并以标记作为前缀:
<pad>{label}
例如,编码器序列为:
mnli hypothesis: Product and geography are what make cream skimming work. premise: Conceptually cream skimming has two basic dimensions - product and geography.
同样,解码器序列示例为:
<pad>neutral
填充标记作为T5模型的decoder_start_token_id。
然后,编码器和解码器序列被标记化并填充到模型序列长度512。
由于训练模型是为了预测MNLI类别,因此标签只是将解码器输入序列向左移动一个标记,这意味着标签仅为MNLI类别,而不包括开头的填充标记。
如果需要,我们可以自定义一些微调和验证的参数。
在微调方面,我们可以更改训练步数、学习率、优化器参数以及与定期检查点相关的参数。
如果您有足够的IPU可用,您可以通过使用数据并行来加快训练速度。T5-XXL需要16个IPU,因此如果有64个IPU,可以将数据并行性设为4;同样,XL变体需要8个IPU,因此如果有16个IPU,可以将数据并行性设为2。
对于验证,您可以控制模型生成的最大标记数。您可以根据验证数据集中遇到的句子的最大长度来减少序列长度,这样我们就可以增加批处理量。
我们使用Google在Hugging Face上提供的Flan-T5检查点。这些权重是我们进行微调的起点。
pretrained = T5ForConditionalGeneration.from_pretrained("google/flan-t5-xxl")
在T5Trainer类的帮助下,我们可以创建训练了。
trainer = T5Trainer(
config,
pretrained,
dataset,
eval_dataset,
eval_config,
tokenizer,
accuracy_metric,
postprocess_mnli_predictions,
)
现在,我们可以用下面一行运行微调:
trainer.train()
最后,我们在MNLI数据集的validation_mismatched拆分上验证我们的模型。微调500步后,模型的准确率应达到87%。
trainer.evaluate()
您可以保存微调后的权重,以便将其上传到Hugging Face。
finetuned = trainer.save_hf_checkpoint(hf_checkpoint_path, ckpt_path)
您之后可以以标准的Hugging Face流水线在任何硬件上使用与之相同的模型。
from transformers import pipeline
tokenizer = AutoTokenizer.from_pretrained("google/flan-t5-xxl")
hf_model = T5ForConditionalGeneration.from_pretrained(hf_checkpoint_path)
generator = pipeline("text2text-generation", model=hf_model, tokenizer=tokenizer)
prompt = (
"mnli hypothesis: Your contributions were of no help with our students' education. "
"premise: Your contribution helped make it possible for us to provide our students with a quality education."
)
out = generator(prompt)
输出:
[{'generated_text': ' contradiction'}]
结论
使用Paperspace中的IPU可以轻松对Flan-T5 XXL进行微调,该模型适用于大量的自然语言处理应用。在各种自然语言处理任务中,该模型都能够以非常低的成本达到大模型的性能。Flan-T5 XXL可以进一步微调,以在特定应用中实现SOTA。因此,在大型语言模型的性能和成本权衡方面,它表现出色。
随附的notebook[8]在Graphcore Pod16上运行,这是一个低成本的云实例,也是一个不错的探索Flan-T5的出发点。
[1]https://huggingface.co/docs/transformers/model_doc/flan-t5
[2]https://paperswithcode.com/sota/multi-task-language-understanding-on-mmlu
[3]https://arxiv.org/pdf/1910.10683.pdf
[4]https://arxiv.org/pdf/2210.11416.pdf
[5]https://ipu.dev/JKcoSs
[6]https://huggingface.co/datasets/glue#mnli
[7]https://huggingface.co/datasets/glue/viewer/mnli/train
[8]https://ipu.dev/JKcoSs
获取更多Graphcore资讯,阅读深度技术文章,并与其他创新者们一起交流,请至中国官网graphcore.cn,以及关注Graphcore微信、微博和知乎创新社区。
Graphcore中国官网
Graphcore官方微信
Graphcore微博创新社区
Graphcore知乎创新社区
点击阅读原文,查看英文blog。
微信扫码关注该文公众号作者