Transoformer实战------Transformer模型性能评估
0. 前言
在自然语言处理 (Natural Language Processing
, NLP
) 领域,Transformer 架构的崛起彻底改变了模型的训练范式。通过迁移学习 (Transfer Learning
, TL
) 和多任务学习 (Multitask Learning
, MTL
),模型能够从海量通用语言知识中提炼出可跨任务复用的表征能力,显著降低了特定任务的训练成本。然而,随着模型复杂度的提升,仅关注分类准确率已无法满足实际需求------推理速度、内存效率以及跨语言泛化能力成为衡量模型综合性能的关键指标。在本节中,将介绍多任务和跨语言基准测试,学习如何评估特定模型在内存使用和速度方面的计算成本,对 TensorFlow
和 PyTorch
模型进行基准测试。
1. 多任务和跨语言基准测试
得益于 Transformer
架构和 transformer
库,我们能够非常方便的将从某个特定任务中学到的知识转移到其他任务上,这称为迁移学习 (Transfer Learning
, TL
)。通过在相关问题之间转移表示,我们能够训练具有通用语言知识的模型,这些模型在不同任务中共享所学到的知识。随着当前深度学习方法的发展,可以同时或按顺序解决多个任务,前者称为多任务学习 (Multitask Learning
, MTL
),后者称为顺序迁移学习 (Sequential Transfer Learning
, STL
)。基准测试机制用于测试语言模型 (Language Model
, LM
) 在这些能力上的性能表现。
接下来,我们介绍一些重要的基准测试,如通用语言理解评估(General Language Understanding Evaluation
, GLUE
)、跨语言多语种编码器迁移评估 (Cross-lingual Transfer Evaluation of Multilingual Encoders
, XTREME
) 和斯坦福问答数据集 (Stanford Question Answering Dataset
, SQuAD
)。基准测试对于评估在多任务和多语言环境中的迁移学习至关重要。在机器学习 (Machine Learning
, ML
) 中,我们通常会关注特定指标,即在某个任务或数据集上的表现得分。通过这些基准测试,我们可以衡量语言模型在同时解决多个任务时的迁移学习能力。
2. 重要基准测试
接下来,我们将介绍广泛用于基于 Transformer
架构的关键基准测试。这些基准对多任务学习 (Multitask Learning
, MTL
)以及多语言和零样本学习做出了重要贡献,并涵盖了许多具有挑战性的任务。
2.1 GLUE 基准
最近研究表明,当使用特定模型处理某个任务时,多任务训练方法往往能比单任务学习取得更好的结果。为此,GLUE
基准测试被引入用于多任务学习 (Multitask Learning
, MTL
),它是一个用于评估多任务学习模型在一系列任务中表现的工具和数据集集合。GLUE
提供了一个公开的排行榜,用于监控使用基准测试进行提交的表现,并提供一个总结 11
项任务的指标。GLUE
基准测试涵盖了多种句子理解任务,涵盖了不同规模、文本类型和难度级别的数据集。任务可以分为以下三种类型:
- 单句任务:
- 语言接受度语料库 (
Corpus of Linguistic Acceptability
,CoLA
) 数据集:该任务包含来自语言学理论文章的英语接受度判断 - 斯坦福情感树库 (
Stanford Sentiment Treebank
,SST-2
) 数据集:该任务包含来自电影评论的句子,并由人工标注其情感,分为正面或负面标签
- 语言接受度语料库 (
- 相似性与释义任务:
- 微软研究释义语料库 (
Microsoft Research Paraphrase Corpus
,MRPC
) 数据集:该任务评估一对句子是否在语义上等价 Quora
问题对 (Quora Question Pairs
,QQP
) 数据集:该任务检查一对问题是否在语义上相同- 语义文本相似性基准 (
Semantic Textual Similarity Benchmark
,STS-B
) 数据集:该任务包含一组来自新闻标题的句子对,每对句子的相似度评分范围从1
到5
- 微软研究释义语料库 (
- 推理任务:
- 多领域自然语言推理 (
Multi-Genre Natural Language Inference
,MNLI
) 语料库:该语料库包含一组句子对集合,任务是预测前提与假设之间的关系(蕴涵、矛盾或无关) - 问题自然语言推理 (
Question Natural Language Inference
,QNLI
) 数据集:这是对SQuAD
数据集的转换版本,任务是检查句子中是否包含对某个问题的答案 - 识别文本蕴涵 (
Recognizing Textual Entailment
,RTE
) 数据集:这是一个文本蕴涵任务,需要组合来自各种来源的数据。这个数据集与QNLI
数据集相似,其任务是检查一个文本是否蕴含另一个文本 Winograd
自然语言推理 (Winograd Natural Language Inference
,WNLI
)模式挑战:最初是一个代词解析任务,旨在链接句子中的代词和短语,GLUE
将该问题转换为句子对分类任务。
- 多领域自然语言推理 (
2.2 SuperGLUE 基准
与 GLUE
类似,SuperGLUE
设计了更具挑战性的语言理解任务,并且提供了一个公开排行榜展示提交模型的表现指标。创建 SuperGLUE
的动机是,当前的 GLUE
最佳成绩 (91.3
) 已经超越了人类表现 (87.1
),需要更复杂的基准测试衡量模型性能。因此,SuperGLUE
提供了一个更加具有挑战性和多样化的任务集,旨在推动通用语言理解技术的发展。但目前的模型同样已经超越了 SuperGLUE
,SuperGLUE
的人类表现是 89.8
,当前最好的模型表现已达到 91.4
,可以访问GLUE 和 SuperGLUE 基准进行查看。

2.3 XTREME 基准
近年来,NLP
研究者越来越专注于学习通用表示,而不仅仅针对单一任务进行学习,这种表示可以应用于多个相关任务。另一种构建通用语言模型的方法是使用多语言任务。研究表明,多语言模型,如mBERT
(Multilingual BERT
) 和 XLM-R
,这些模型在大规模多语言语料库上进行预训练,在迁移到其他语言时表现更好。因此,跨语言泛化的主要优势在于,通过零样本跨语言迁移,能够在语料库匮乏的语言上构建成功的 NLP
应用。
基于此,XTREME 基准测试应运而生。该基准目前包含大约 40
种不同语言,属于 12
个语言系统,涵盖了九个不同任务,这些任务要求进行不同层次的语法或语义推理。然而,要将一个模型扩展到涵盖超过 7000
种世界语言仍然具有挑战性,并且需要在语言覆盖和模型能力之间进行权衡。
2.4 XGLUE 基准
XGLUE
是另一个跨语言基准,旨在评估和提高跨语言预训练模型在自然语言理解 (Natural Language Understanding
, NLU
) 和自然语言生成 (Natural Language Generation
, NLG
) 任务中的表现。最初,XGLUE
包括 11
个任务,覆盖 19
种语言。与 XTREME
的主要区别在于,每个任务的训练数据仅以英语提供。这迫使语言模型仅从英语文本数据中学习,并将这种知识迁移到其他语言,这称为样本跨语言迁移能力。第二个区别在于,XGLUE
同时涵盖了 NLU
和 NLG
任务。可以通过查看XGLUE 基准网站了解更多详情。
2.5 SQuAD 基准
SQuAD
(Stanford Question Answering Dataset
) 是 NLP
领域广泛使用的问答数据集。它提供了一组问答对,用于评估NLP模型的阅读理解能力。数据集包括一系列问题、阅读材料以及人工标注的答案,问题的答案是从阅读材料中提取的一段文本。初版数据集 SQuAD1.1
没有提供无法回答的选项,因为数据集在收集时没有此类问题,因此每个问题在阅读材料中都有答案。因此,即使问题看似无法回答,NLP
模型也必须给出问题回答。
SQuAD2.0
是一个改进版,不仅要求 NLP
模型在可能的情况下回答问题,还要求模型在无法回答时避免给出答案。SQuAD2.0
包含 50000
个人工针对性设计的不可回答问题,这些问题看起来与可回答问题类似。此外,SQuAD2.0
还包含 100000
个来自 SQuAD1.1
数据集中的问题。
3. 速度和内存基准测试
接下来,我们将重点讨论如何评估计算性能,侧重于速度和内存,而不是分类性能。
仅仅比较大模型在特定任务或基准测试上的分类性能已经不能满足需求,我们可能需要更快的推理速度和更好的内存性能。因此,我们还必须考虑在特定环境 (RAM
、CPU
和 GPU
) 下,某个模型的计算成本,具体包括内存使用和速度。训练和部署到生产环境中进行推理的计算成本是需要衡量的两个主要指标。Transformer
库提供了两个类------PyTorchBenchmark
和 TensorFlowBenchmark
,分别用于对 TensorFlow
和 PyTorch
模型进行基准测试。
(1) 在开始基准测试之前,需要执行以下命令检查 GPU
能力,并安装 py3nvml
库:
shell
$ nvidia-smi
$ pip install py3nvml
当我们在 GPU
上进行基准测试时,需要指明 Python
代码在哪个 GPU
设备上运行,这通过设置 CUDA_VISIBLE_DEVICES
环境变量来完成。例如,export CUDA_VISIBLE_DEVICES=0
表示使用第一个 CUDA
设备。
(2) 接下来,我们将比较四个随机选择的预训练 BERT
模型,如 models
数组中所列。通过 sequence_lengths
参数来尝试不同的序列长度,将批大小设置为 4
。如果计算机拥有更强的 GPU
能力,可以将批大小设置为 4-64
范围内的值,并调整其他参数,来扩展参数的搜索空间:
python
from transformers import PyTorchBenchmark, PyTorchBenchmarkArguments
models= ["bert-base-uncased","distilbert-base-uncased","distilroberta-base", "distilbert-base-german-cased"]
batch_sizes=[4]
sequence_lengths=[32,64, 128, 256,512]
args = PyTorchBenchmarkArguments(models=models, batch_sizes=batch_sizes, sequence_lengths=sequence_lengths, multi_process=False)
benchmark = PyTorchBenchmark(args)
需要注意的是,本节的代码是针对 PyTorch
基准测试的。对于 TensorFlow
基准测试,只需使用 TensorFlowBenchmarkArguments
和 TensorFlowBenchmark
类替代即可。
(3) 运行以下代码来进行基准测试实验:
python
results = benchmark.run()
所需的时间取决于计算机的 CPU/GPU
能力和参数选择。如果遇到内存不足的问题,可以采取以下措施来解决:
- 重启程序或操作系统
- 在运行开始之前删除所有不必要的内存对象
- 设置较小的批大小,例如
2
或1
以下输出表示推理速度性能。由于我们的搜索空间包含四个不同的模型和五种不同的序列长度,因此会在结果中看到 20
行数据:

同样,我们可以看到 20
种不同场景下的推理的内存使用情况:

(4) 为了观察不同参数下的推理速度,使用存储统计信息的 results
对象来绘制图表,绘制不同模型和序列长度下的推理速度性能:
python
import matplotlib.pyplot as plt
plt.figure(figsize=(8,8))
t=sequence_lengths
models_perf=[list(results.time_inference_result[m]['result'][batch_sizes[0]].values()) for m in models]
plt.xlabel('Seq Length')
plt.ylabel('Time in Second')
plt.title('Inference Speed Result')
plt.plot(t, models_perf[0], 'rs--', t, models_perf[1], 'g--.', t, models_perf[2], 'b--^', t, models_perf[3], 'c--o')
plt.legend(models)
plt.show()
如下图所示,两个 DistilBERT
模型的结果接近,并且性能优于其他两个模型。与其他模型相比,基于 BERT
的 uncased
模型表现较差,特别是在序列长度增加时。

为了绘制内存性能图表,需要使用 results
对象中的 memory_inference_result
结果。
小结
本文探讨了 NLP
领域模型评估的两个关键维度:任务性能与计算效率。在任务性能方面,系统分析了主流基准测试的发展脉络,包括 GLUE/SuperGLUE
、XTREME/XGLUE
和 SQuAD
,这些基准构成了衡量模型语义理解能力的完整体系。在计算效率方面,重点介绍了如何评估特定模型在内存使用和速度方面的计算成本。
系列链接
Transformer实战------词嵌入技术详解
Transformer实战------循环神经网络详解
Transformer实战------从词袋模型到Transformer:NLP技术演进
Transformer实战------Hugging Face环境配置与应用详解