#
Benchmarks

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

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

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

##
How to benchmark 🤗 Transformers models

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

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

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

Pytorch
Hide Pytorch content

    >>> from transformers import PyTorchBenchmark, PyTorchBenchmarkArguments

    >>> args = PyTorchBenchmarkArguments(models=["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=["bert-base-uncased"], batch_sizes=[8], sequence_lengths=[8, 32, 128, 512]
    ... )
    >>> benchmark = TensorFlowBenchmark(args)

ここでは、ベンチマーク引数のデータクラスに対して、`models`、`batch_sizes` および`sequence_lengths`の3つの引数が指定されています。引数`models`は必須で、 モデルハブからのモデル識別子の`リスト`を期待し ます。`batch_sizes`と`sequence_lengths`の2つの`リスト`引数は モデルのベンチマーク対象となる`input_ids`のサイズを定義します。 ベンチマーク引数データクラスを介して設定できる他の多くのパラメータがあります。これらの詳細については、直接ファイル `src/transformers/benchmark/benchmark_args_utils.py`、 `src/transformers/benchmark/benchmark_args.py`（PyTorch用）、および`src/transformers/benchmark/benchmark_args_tf.py`（Tensorflow用） を参照するか、次のシェルコマンドをルートから実行すると、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
    --------------------------------------------------------------------------------
    bert-base-uncased          8               8             0.006
    bert-base-uncased          8               32            0.006
    bert-base-uncased          8              128            0.018
    bert-base-uncased          8              512            0.088
    --------------------------------------------------------------------------------

    ====================      INFERENCE - MEMORY - RESULT       ====================
    --------------------------------------------------------------------------------
    Model Name             Batch Size     Seq Length    Memory in MB
    --------------------------------------------------------------------------------
    bert-base-uncased          8               8             1227
    bert-base-uncased          8               32            1281
    bert-base-uncased          8              128            1307
    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
    --------------------------------------------------------------------------------
    bert-base-uncased          8               8             0.005
    bert-base-uncased          8               32            0.008
    bert-base-uncased          8              128            0.022
    bert-base-uncased          8              512            0.105
    --------------------------------------------------------------------------------

    ====================      INFERENCE - MEMORY - RESULT       ====================
    --------------------------------------------------------------------------------
    Model Name             Batch Size     Seq Length    Memory in MB
    --------------------------------------------------------------------------------
    bert-base-uncased          8               8             1330
    bert-base-uncased          8               32            1330
    bert-base-uncased          8              128            1330
    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 ファイルへのパスは、データクラスの引数を使用してオプションで定義できます。

モデル識別子、例えば `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クラスの構成に対する推論時間と必要なメモリのベンチマーク

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

##
Benchmark best practices

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

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

##
Sharing your benchmark

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

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

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

- PyTorchベンチマーク結果。
- TensorFlowベンチマーク結果。