基准测试
Hugging Face 的基准测试工具已弃用,建议使用外部基准测试库来衡量 Transformer 模型的速度和内存复杂度。
让我们看看如何对 🤗 Transformers 模型进行基准测试,最佳实践以及现有的基准测试。
一个更详细地解释如何对 🤗 Transformers 模型进行基准测试的笔记本可以在这里找到 这里。
如何对 🤗 Transformers 模型进行基准测试
类 PyTorchBenchmark
和 TensorFlowBenchmark
允许灵活地对 🤗 Transformers 模型进行基准测试。基准测试类允许我们测量峰值内存使用量和推理和训练所需的时间。
这里,推理定义为单个前向传递,训练定义为单个前向传递和后向传递。
基准测试类 PyTorchBenchmark
和 TensorFlowBenchmark
分别期望一个 PyTorchBenchmarkArguments
和 TensorFlowBenchmarkArguments
类型的对象进行实例化。PyTorchBenchmarkArguments
和 TensorFlowBenchmarkArguments
是数据类,包含其对应基准测试类所有相关的配置。在下面的示例中,展示了如何对类型为bert-base-cased的 BERT 模型进行基准测试。
>>> 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)
>>> 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)
这里,向基准测试参数数据类提供了三个参数,即 models
、batch_sizes
和 sequence_lengths
。参数 models
是必需的,并期望来自 模型中心 的模型标识符的 list
。list
参数 batch_sizes
和 sequence_lengths
定义了模型进行基准测试的 input_ids
的大小。可以通过基准测试参数数据类配置更多参数。有关这些参数的更多详细信息,可以参考文件 src/transformers/benchmark/benchmark_args_utils.py
、src/transformers/benchmark/benchmark_args.py
(对于 PyTorch)和 src/transformers/benchmark/benchmark_args_tf.py
(对于 Tensorflow)。或者,从根目录运行以下 shell 命令将分别打印出 PyTorch 和 Tensorflow 所有可配置参数的描述性列表。
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
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 类型、系统、库版本等……都打印在第三部分的环境信息下。当分别向 PyTorchBenchmarkArguments
和 TensorFlowBenchmarkArguments
添加参数 save_to_csv=True
时,可以选择将这些信息保存到.csv 文件中。在这种情况下,每个部分都保存在一个单独的.csv 文件中。每个.csv 文件的路径可以通过参数数据类可选地定义。
用户可以使用模型标识符(例如 google-bert/bert-base-uncased
)对预训练模型进行基准测试,也可以对任何可用模型类的任意配置进行基准测试。在这种情况下,必须使用以下基准测试参数插入一个 list
配置。
>>> 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
>>> 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 上进行。
该方法在 以下博文中 进行了详细说明,结果可 在此处 获得。
使用新的基准测试工具,与社区共享您的基准测试结果比以往任何时候都更容易。
< > 在 GitHub 上更新