transformers/docs/source/ja/benchmarks.md

19 KiB
Raw Permalink Blame History

Benchmarks

Hugging Faceのベンチマークツールは非推奨であり、Transformerモデルの速度とメモリの複雑さを測定するために外部のベンチマークライブラリを使用することをお勧めします。

open-in-colab

🤗 Transformersモデルをベンチマークし、ベストプラクティス、すでに利用可能なベンチマークについて見てみましょう。

🤗 Transformersモデルをベンチマークする方法について詳しく説明したートブックはこちらで利用できます。

How to benchmark 🤗 Transformers models

[PyTorchBenchmark]クラスと[TensorFlowBenchmark]クラスを使用すると、🤗 Transformersモデルを柔軟にベンチマークできます。 ベンチマーククラスを使用すると、ピークメモリ使用量 および 必要な時間推論 および トレーニング の両方について測定できます。

ここでの 推論 は、単一のフォワードパスによって定義され、 トレーニング は単一のフォワードパスと バックワードパスによって定義されます。

ベンチマーククラス[PyTorchBenchmark]と[TensorFlowBenchmark]は、それぞれのベンチマーククラスに対する適切な設定を含む [PyTorchBenchmarkArguments] および [TensorFlowBenchmarkArguments] タイプのオブジェクトを必要とします。 [PyTorchBenchmarkArguments] および [TensorFlowBenchmarkArguments] はデータクラスであり、それぞれのベンチマーククラスに対するすべての関連する設定を含んでいます。 次の例では、タイプ bert-base-cased のBERTモデルをベンチマークする方法が示されています。

```py >>> 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)

</pt>
<tf>
```py
>>> 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_sizes およびsequence_lengthsの3つの引数が指定されています。引数modelsは必須で、 モデルハブからのモデル識別子のリストを期待し ます。batch_sizessequence_lengthsの2つのリスト引数は モデルのベンチマーク対象となるinput_idsのサイズを定義します。 ベンチマーク引数データクラスを介して設定できる他の多くのパラメータがあります。これらの詳細については、直接ファイル src/transformers/benchmark/benchmark_args_utils.pysrc/transformers/benchmark/benchmark_args.pyPyTorch用、およびsrc/transformers/benchmark/benchmark_args_tf.pyTensorflow用 を参照するか、次のシェルコマンドをルートから実行すると、PyTorchとTensorflowのそれぞれに対して設定可能なすべてのパラメータの記述的なリストが表示されます。

```bash 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
```bash 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

デフォルトでは、推論時間必要なメモリ がベンチマークされます。 上記の例の出力では、最初の2つのセクションが 推論時間推論メモリ に対応する結果を示しています。さらに、計算環境に関するすべての関連情報、 例えば GPU タイプ、システム、ライブラリのバージョンなどが、ENVIRONMENT INFORMATION の下に表示されます。この情報は、[PyTorchBenchmarkArguments] および [TensorFlowBenchmarkArguments] に引数 save_to_csv=True を追加することで、オプションで .csv ファイルに保存することができます。この場合、各セクションは別々の .csv ファイルに保存されます。.csv ファイルへのパスは、データクラスの引数を使用してオプションで定義できます。

モデル識別子、例えば google-bert/bert-base-uncased を使用して事前学習済みモデルをベンチマークする代わりに、利用可能な任意のモデルクラスの任意の設定をベンチマークすることもできます。この場合、ベンチマーク引数と共に設定の list を挿入する必要があります。

```py >>> 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
</pt>
<tf>
```py
>>> 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クラスの構成に対する推論時間と必要なメモリのベンチマーク

この機能は、モデルをトレーニングする際にどの構成を選択すべきかを決定する際に特に役立つことがあります。

Benchmark best practices

このセクションでは、モデルをベンチマークする際に注意すべきいくつかのベストプラクティスをリストアップしています。

  • 現在、単一デバイスのベンチマークしかサポートされていません。GPUでベンチマークを実行する場合、コードを実行するデバイスをユーザーが指定することを推奨します。 これはシェルでCUDA_VISIBLE_DEVICES環境変数を設定することで行えます。例:export CUDA_VISIBLE_DEVICES=0を実行してからコードを実行します。
  • no_multi_processingオプションは、テストおよびデバッグ用にのみTrueに設定すべきです。正確なメモリ計測を確保するために、各メモリベンチマークを別々のプロセスで実行することをお勧めします。これにより、no_multi_processingTrueに設定されます。
  • モデルのベンチマーク結果を共有する際には、常に環境情報を記述するべきです。異なるGPUデバイス、ライブラリバージョンなどでベンチマーク結果が大きく異なる可能性があるため、ベンチマーク結果単体ではコミュニティにとってあまり有用ではありません。

Sharing your benchmark

以前、すべての利用可能なコアモデル当時10モデルに対して、多くの異なる設定で推論時間のベンチマークが行われましたPyTorchを使用し、TorchScriptの有無、TensorFlowを使用し、XLAの有無などです。これらのテストはすべてCPUで行われましたTensorFlow XLAを除く

このアプローチの詳細については、次のブログポストに詳しく説明されており、結果はこちらで利用できます。

新しいベンチマークツールを使用すると、コミュニティとベンチマーク結果を共有することがこれまで以上に簡単になります。