Transformers 文档

基准测试

基准测试

Hugging Face 的基准测试工具已被弃用,建议使用外部的基准测试库来测量 Transformer 模型的速度和内存复杂度。

让我们来看看如何对🤗 Transformers模型进行基准测试、最佳实践以及已经可用的基准测试。

一个更详细解释如何对🤗 Transformers模型进行基准测试的笔记本可以在这里找到 here.

如何对🤗 Transformers模型进行基准测试

PyTorchBenchmarkTensorFlowBenchmark 允许灵活地对 🤗 Transformers 模型进行基准测试。基准测试类允许我们测量 峰值内存使用量所需时间,无论是 推理 还是 训练

在这里,推理由一次前向传播定义,而训练由一次前向传播和一次反向传播定义。

基准测试类 PyTorchBenchmarkTensorFlowBenchmark 分别需要一个类型为 PyTorchBenchmarkArgumentsTensorFlowBenchmarkArguments 的对象进行实例化。PyTorchBenchmarkArgumentsTensorFlowBenchmarkArguments 是数据类,包含了其对应基准测试类的所有相关配置。在下面的示例中,展示了如何对类型为 bert-base-cased 的 BERT 模型进行基准测试。

Pytorch
Hide Pytorch content
>>> from transformers import PyTorchBenchmark, PyTorchBenchmarkArguments

>>> args = PyTorchBenchmarkArguments(models=["google-bert/bert-base-uncased"], batch_sizes=[8], sequence_lengths=[8, 32, 128, 512])
>>> benchmark = PyTorchBenchmark(args)
TensorFlow
Hide TensorFlow content
>>> from transformers import TensorFlowBenchmark, TensorFlowBenchmarkArguments

>>> args = TensorFlowBenchmarkArguments(
...     models=["google-bert/bert-base-uncased"], batch_sizes=[8], sequence_lengths=[8, 32, 128, 512]
... )
>>> benchmark = TensorFlowBenchmark(args)

在这里,基准测试参数数据类接收了三个参数,分别是 modelsbatch_sizessequence_lengths。参数 models 是必需的,并且期望从 模型中心 获取模型标识符的 list。参数 batch_sizessequence_lengths 定义了模型基准测试的 input_ids 的大小。还有许多其他参数可以通过基准测试参数数据类进行配置。有关这些参数的更多详细信息,可以直接查阅文件 src/transformers/benchmark/benchmark_args_utils.pysrc/transformers/benchmark/benchmark_args.py(用于 PyTorch)和 src/transformers/benchmark/benchmark_args_tf.py(用于 Tensorflow)。或者,从根目录运行以下 shell 命令将分别打印出 PyTorch 和 Tensorflow 的所有可配置参数的描述性列表。

Pytorch
Hide Pytorch content
python examples/pytorch/benchmarking/run_benchmark.py --help

实例化的基准对象可以通过调用 benchmark.run() 来简单地运行。

>>> results = benchmark.run()
>>> print(results)
====================       INFERENCE - SPEED - RESULT       ====================
--------------------------------------------------------------------------------
Model Name             Batch Size     Seq Length     Time in s                  
--------------------------------------------------------------------------------
google-bert/bert-base-uncased          8               8             0.006     
google-bert/bert-base-uncased          8               32            0.006     
google-bert/bert-base-uncased          8              128            0.018     
google-bert/bert-base-uncased          8              512            0.088     
--------------------------------------------------------------------------------

====================      INFERENCE - MEMORY - RESULT       ====================
--------------------------------------------------------------------------------
Model Name             Batch Size     Seq Length    Memory in MB 
--------------------------------------------------------------------------------
google-bert/bert-base-uncased          8               8             1227
google-bert/bert-base-uncased          8               32            1281
google-bert/bert-base-uncased          8              128            1307
google-bert/bert-base-uncased          8              512            1539
--------------------------------------------------------------------------------

====================        ENVIRONMENT INFORMATION         ====================

- transformers_version: 2.11.0
- framework: PyTorch
- use_torchscript: False
- framework_version: 1.4.0
- python_version: 3.6.10
- system: Linux
- cpu: x86_64
- architecture: 64bit
- date: 2020-06-29
- time: 08:58:43.371351
- fp16: False
- use_multiprocessing: True
- only_pretrain_model: False
- cpu_ram_mb: 32088
- use_gpu: True
- num_gpus: 1
- gpu: TITAN RTX
- gpu_ram_mb: 24217
- gpu_power_watts: 280.0
- gpu_performance_state: 2
- use_tpu: False
TensorFlow
Hide TensorFlow content
python examples/tensorflow/benchmarking/run_benchmark_tf.py --help

实例化的基准对象可以通过调用 benchmark.run() 来简单地运行。

>>> results = benchmark.run()
>>> print(results)
>>> results = benchmark.run()
>>> print(results)
====================       INFERENCE - SPEED - RESULT       ====================
--------------------------------------------------------------------------------
Model Name             Batch Size     Seq Length     Time in s                  
--------------------------------------------------------------------------------
google-bert/bert-base-uncased          8               8             0.005
google-bert/bert-base-uncased          8               32            0.008
google-bert/bert-base-uncased          8              128            0.022
google-bert/bert-base-uncased          8              512            0.105
--------------------------------------------------------------------------------

====================      INFERENCE - MEMORY - RESULT       ====================
--------------------------------------------------------------------------------
Model Name             Batch Size     Seq Length    Memory in MB 
--------------------------------------------------------------------------------
google-bert/bert-base-uncased          8               8             1330
google-bert/bert-base-uncased          8               32            1330
google-bert/bert-base-uncased          8              128            1330
google-bert/bert-base-uncased          8              512            1770
--------------------------------------------------------------------------------

====================        ENVIRONMENT INFORMATION         ====================

- transformers_version: 2.11.0
- framework: Tensorflow
- use_xla: False
- framework_version: 2.2.0
- python_version: 3.6.10
- system: Linux
- cpu: x86_64
- architecture: 64bit
- date: 2020-06-29
- time: 09:26:35.617317
- fp16: False
- use_multiprocessing: True
- only_pretrain_model: False
- cpu_ram_mb: 32088
- use_gpu: True
- num_gpus: 1
- gpu: TITAN RTX
- gpu_ram_mb: 24217
- gpu_power_watts: 280.0
- gpu_performance_state: 2
- use_tpu: False

默认情况下,会对推理时间所需内存进行基准测试。在上面的示例输出中,前两部分显示了与推理时间推理内存对应的结果。此外,所有关于计算环境的相关信息,例如 GPU类型、系统、库版本等,都会在第三部分环境信息中打印出来。当将参数save_to_csv=True分别添加到PyTorchBenchmarkArgumentsTensorFlowBenchmarkArguments时,这些信息可以选择性地保存到.csv文件中。在这种情况下,每个部分都会保存到一个单独的.csv文件中。每个.csv文件的路径可以通过参数数据类进行定义。

用户可以通过模型标识符(例如google-bert/bert-base-uncased)对预训练模型进行基准测试,也可以选择对任何可用模型类的任意配置进行基准测试。在这种情况下,必须将配置的list插入到基准测试参数中,如下所示。

Pytorch
Hide Pytorch content
>>> from transformers import PyTorchBenchmark, PyTorchBenchmarkArguments, BertConfig

>>> args = PyTorchBenchmarkArguments(
...     models=["bert-base", "bert-384-hid", "bert-6-lay"], batch_sizes=[8], sequence_lengths=[8, 32, 128, 512]
... )
>>> config_base = BertConfig()
>>> config_384_hid = BertConfig(hidden_size=384)
>>> config_6_lay = BertConfig(num_hidden_layers=6)

>>> benchmark = PyTorchBenchmark(args, configs=[config_base, config_384_hid, config_6_lay])
>>> benchmark.run()
====================       INFERENCE - SPEED - RESULT       ====================
--------------------------------------------------------------------------------
Model Name             Batch Size     Seq Length       Time in s                  
--------------------------------------------------------------------------------
bert-base                  8              128            0.006
bert-base                  8              512            0.006
bert-base                  8              128            0.018     
bert-base                  8              512            0.088     
bert-384-hid              8               8             0.006     
bert-384-hid              8               32            0.006     
bert-384-hid              8              128            0.011     
bert-384-hid              8              512            0.054     
bert-6-lay                 8               8             0.003     
bert-6-lay                 8               32            0.004     
bert-6-lay                 8              128            0.009     
bert-6-lay                 8              512            0.044
--------------------------------------------------------------------------------

====================      INFERENCE - MEMORY - RESULT       ====================
--------------------------------------------------------------------------------
Model Name             Batch Size     Seq Length      Memory in MB 
--------------------------------------------------------------------------------
bert-base                  8               8             1277
bert-base                  8               32            1281
bert-base                  8              128            1307     
bert-base                  8              512            1539     
bert-384-hid              8               8             1005     
bert-384-hid              8               32            1027     
bert-384-hid              8              128            1035     
bert-384-hid              8              512            1255     
bert-6-lay                 8               8             1097     
bert-6-lay                 8               32            1101     
bert-6-lay                 8              128            1127     
bert-6-lay                 8              512            1359
--------------------------------------------------------------------------------

====================        ENVIRONMENT INFORMATION         ====================

- transformers_version: 2.11.0
- framework: PyTorch
- use_torchscript: False
- framework_version: 1.4.0
- python_version: 3.6.10
- system: Linux
- cpu: x86_64
- architecture: 64bit
- date: 2020-06-29
- time: 09:35:25.143267
- fp16: False
- use_multiprocessing: True
- only_pretrain_model: False
- cpu_ram_mb: 32088
- use_gpu: True
- num_gpus: 1
- gpu: TITAN RTX
- gpu_ram_mb: 24217
- gpu_power_watts: 280.0
- gpu_performance_state: 2
- use_tpu: False
TensorFlow
Hide TensorFlow content
>>> from transformers import TensorFlowBenchmark, TensorFlowBenchmarkArguments, BertConfig

>>> args = TensorFlowBenchmarkArguments(
...     models=["bert-base", "bert-384-hid", "bert-6-lay"], batch_sizes=[8], sequence_lengths=[8, 32, 128, 512]
... )
>>> config_base = BertConfig()
>>> config_384_hid = BertConfig(hidden_size=384)
>>> config_6_lay = BertConfig(num_hidden_layers=6)

>>> benchmark = TensorFlowBenchmark(args, configs=[config_base, config_384_hid, config_6_lay])
>>> benchmark.run()
====================       INFERENCE - SPEED - RESULT       ====================
--------------------------------------------------------------------------------
Model Name             Batch Size     Seq Length       Time in s                  
--------------------------------------------------------------------------------
bert-base                  8               8             0.005
bert-base                  8               32            0.008
bert-base                  8              128            0.022
bert-base                  8              512            0.106
bert-384-hid              8               8             0.005
bert-384-hid              8               32            0.007
bert-384-hid              8              128            0.018
bert-384-hid              8              512            0.064
bert-6-lay                 8               8             0.002
bert-6-lay                 8               32            0.003
bert-6-lay                 8              128            0.0011
bert-6-lay                 8              512            0.074
--------------------------------------------------------------------------------

====================      INFERENCE - MEMORY - RESULT       ====================
--------------------------------------------------------------------------------
Model Name             Batch Size     Seq Length      Memory in MB 
--------------------------------------------------------------------------------
bert-base                  8               8             1330
bert-base                  8               32            1330
bert-base                  8              128            1330
bert-base                  8              512            1770
bert-384-hid              8               8             1330
bert-384-hid              8               32            1330
bert-384-hid              8              128            1330
bert-384-hid              8              512            1540
bert-6-lay                 8               8             1330
bert-6-lay                 8               32            1330
bert-6-lay                 8              128            1330
bert-6-lay                 8              512            1540
--------------------------------------------------------------------------------

====================        ENVIRONMENT INFORMATION         ====================

- transformers_version: 2.11.0
- framework: Tensorflow
- use_xla: False
- framework_version: 2.2.0
- python_version: 3.6.10
- system: Linux
- cpu: x86_64
- architecture: 64bit
- date: 2020-06-29
- time: 09:38:15.487125
- fp16: False
- use_multiprocessing: True
- only_pretrain_model: False
- cpu_ram_mb: 32088
- use_gpu: True
- num_gpus: 1
- gpu: TITAN RTX
- gpu_ram_mb: 24217
- gpu_power_watts: 280.0
- gpu_performance_state: 2
- use_tpu: False

再次,测量了推理时间推理所需内存,但这次是针对BertModel类的自定义配置。这个功能在决定模型应该为哪种配置进行训练时尤其有用。

基准测试最佳实践

本节列出了在模型基准测试时应注意的一些最佳实践。

  • 目前,仅支持单设备基准测试。在GPU上进行基准测试时,建议用户通过在shell中设置CUDA_VISIBLE_DEVICES环境变量来指定代码应在哪个设备上运行,例如在运行代码之前设置export CUDA_VISIBLE_DEVICES=0
  • 选项 no_multi_processing 应仅在测试和调试时设置为 True。为了确保准确的内存测量,建议通过确保 no_multi_processing 设置为 True 来在单独的进程中运行每个内存基准测试。
  • 在分享模型基准测试结果时,应始终说明环境信息。由于不同GPU设备、库版本等因素,结果可能会有很大差异,因此,基准测试结果本身对社区来说并不是非常有用。

分享你的基准测试

之前所有可用的核心模型(当时有10个)已经在许多不同的设置下进行了推理时间的基准测试:使用PyTorch,有和没有TorchScript,使用TensorFlow,有和没有XLA。所有这些测试都是在CPU(除了TensorFlow XLA)和GPU上进行的。

该方法在以下博客文章中有详细说明,结果可在此处查看。

使用新的基准测试工具,比以往任何时候都更容易与社区分享您的基准测试结果

< > Update on GitHub