BERT is a method of pre-training language representations which obtains state-of-the-art results on a wide array of NLP tasks.
The performance measurements in this document were conducted at the time of publication and may not reflect the performance achieved from NVIDIA's latest software release. For the most up-to-date performance measurements, go to NVIDIA Data Center Deep Learning Product Performance.
Benchmarking
The following section shows how to run benchmarks measuring the model performance in training and inference modes.
Both of these benchmarking scripts enable you to run a number of epochs, extract performance numbers, and run the BERT model for fine tuning.
Training performance benchmark
Training benchmarking can be performed by running the script:
scripts/finetune_train_benchmark.sh <bert_model> <num_gpu> <batch_size> <precision> <use_xla>
This script runs 800 steps by default on the SQuAD v1.1 dataset and extracts performance numbers for the given configuration. These numbers are saved at /results/squad_train_benchmark_<bert_model>_gpu<num_gpu>_bs<batch_size>.log.
Inference performance benchmark
Inference benchmarking can be performed by running the script:
scripts/finetune_inference_benchmark.sh <bert_model> <batch_size> <precision> <use_xla>
This script runs 1000 eval iterations by default on the SQuAD v1.1 dataset and extracts performance and latency numbers for the given configuration. These numbers are saved at /results/squad_inference_benchmark_<bert_model>_<precision>_bs<batch_size>.log.
Results
The following sections provide details on how we achieved our performance and accuracy in training and inference for fine tuning Question Answering. All results are on BERT-Large model unless otherwise mentioned. All fine tuning results are on SQuAD v1.1 using a sequence length of 384 unless otherwise mentioned.
Training accuracy results
Pre-training accuracy
Our results were obtained by running the scripts/run_pretraining_lamb.sh training script in the TensorFlow 21.02-py3 NGC container on NVIDIA DGX-2 and NVIDIA DGX A100.
| DGX System | Nodes x GPUs | Precision | Batch Size/GPU: Phase1, Phase2 | Accumulation Steps: Phase1, Phase2 | Time to Train (Hrs) | Final Loss |
|---|---|---|---|---|---|---|
| DGX2H | 32 x 16 | FP16 | 56, 10 | 2, 6 | 2.67 | 1.69 |
| DGX2H | 32 x 16 | FP32 | 32, 4 | 4, 16 | 8.02 | 1.71 |
| DGXA100 | 32 x 8 | FP16 | 312, 40 | 1, 3 | 2.02 | 1.68 |
| DGXA100 | 32 x 8 | TF32 | 176, 22 | 2, 6 | 3.57 | 1.67 |
Fine-tuning accuracy for SQuAD v1.1: NVIDIA DGX A100 (8x A100 40GB)
Our results were obtained by running the scripts/run_squad.sh training script in the TensorFlow 20.12-py3 NGC container on NVIDIA DGX A100 with 8x A100 80GB GPUs.
| GPUs | **Batch size / GPU: TF32, FP16 ** | Accuracy - TF32 | Accuracy - mixed precision | Time to Train - TF32 (Hrs) | Time to Train - mixed precision (Hrs) |
|---|---|---|---|---|---|
| 8 | 38, 76 | 90.88 | 91.12 | 0.16 | 0.11 |
Pre-training SQuAD v1.1 stability test: NVIDIA DGX A100 (256x A100 80GB)
The following tables compare Final Loss scores across 3 different training runs with different seeds, for both FP16 and TF32. The runs showcase consistent convergence on all 3 seeds with very little deviation.
| FP16, 256x GPUs | seed 1 | seed 2 | seed 3 | mean | std |
|---|---|---|---|---|---|
| Final Loss | 1.657 | 1.661 | 1.683 | 1.667 | 0.014 |
| TF32, 256x GPUs | seed 1 | seed 2 | seed 3 | mean | std |
|---|---|---|---|---|---|
| Final Loss | 1.67 | 1.654 | 1.636 | 1.653 | 0.017 |
Fine-tuning SQuAD v1.1 stability test: NVIDIA DGX A100 (8x A100 80GB)
The following tables compare F1 scores across 5 different training runs with different seeds, for both FP16 and TF32 respectively using the (NVIDIA Pretrained Checkpoint)[https://ngc.nvidia.com/catalog/models]. The runs showcase consistent convergence on all 5 seeds with very little deviation.
| FP16, 8x GPUs | seed 1 | seed 2 | seed 3 | seed 4 | seed 5 | mean | std |
|---|---|---|---|---|---|---|---|
| F1 | 91.12 | 90.80 | 90.94 | 90.90 | 90.94 | 90.94 | 0.11 |
| TF32, 8x GPUs | seed 1 | seed 2 | seed 3 | seed 4 | seed 5 | mean | std |
|---|---|---|---|---|---|---|---|
| F1 | 90.79 | 90.88 | 90.80 | 90.88 | 90.83 | 90.84 | 0.04 |
Training performance results
Pre-training training performance: Single-node on NVIDIA DGX-2 V100 (16x V100 32GB)
Our results were obtained by running the scripts/run_pretraining_lamb.sh training script in the TensorFlow 21.02-py3 NGC container on NVIDIA DGX-2 with 16x V100 32GB GPUs. Performance (in sequences per second) is the steady state throughput.
| GPUs | Sequence Length | Batch size / GPU: mixed precision, FP32 | Gradient Accumulation: mixed precision, FP32 | Global Batch Size: mixed precision, FP32 | Throughput - mixed precision | Throughput - FP32 | Throughput speedup (FP32 - mixed precision) | Weak scaling - mixed precision | Weak scaling - FP32 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 128 | 60 , 32 | 1024 , 2048 | 61440 , 65536 | 206.5 | 49.97 | 4.13 | 1.00 | 1.00 |
| 4 | 128 | 60 , 32 | 256 , 512 | 61440 , 65536 | 789.75 | 194.02 | 4.07 | 3.82 | 3.88 |
| 8 | 128 | 60 , 32 | 128 , 256 | 61440 , 65536 | 1561.77 | 367.9 | 4.25 | 7.56 | 7.36 |
| 16 | 128 | 60 , 32 | 64 , 128 | 61440 , 65536 | 3077.99 | 762.22 | 4.04 | 14.9 | 15.25 |
| 1 | 512 | 10 , 6 | 3072 , 5120 | 30720 , 30720 | 40.95 | 11.06 | 3.70 | 1.00 | 1.00 |
| 4 | 512 | 10 , 6 | 768 , 1280 | 30720 , 30720 | 158.5 | 43.05 | 3.68 | 3.87 | 3.89 |
| 8 | 512 | 10 , 6 | 384 , 640 | 30720 , 30720 | 312.03 | 85.51 | 3.65 | 7.62 | 7.73 |
| 16 | 512 | 10 , 4 | 192 , 512 | 30720 , 32768 | 614.94 | 161.38 | 3.81 | 15.02 | 14.59 |
Note: The respective values for FP32 runs that use a batch size of 60 and 10 in sequence lengths 128 and 512 are not available due to out of memory errors that arise.
Pre-training training performance: Multi-node on NVIDIA DGX-2H V100 (16x V100 32GB)
Our results were obtained by running the run.sub training script in the TensorFlow 21.02-py3 NGC container using multiple NVIDIA DGX-2 with 16x V100 32GB GPUs. Performance (in sequences per second) is the steady state throughput.
| Num Nodes | Sequence Length | Batch size / GPU: mixed precision, FP32 | Gradient Accumulation: mixed precision, FP32 | Global Batch Size: mixed precision, FP32 | Throughput - mixed precision | Throughput - FP32 | Throughput speedup (FP32 - mixed precision) | Weak scaling - mixed precision | Weak scaling - FP32 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 128 | 60 , 32 | 64 , 128 | 61440 , 65536 | 3528.51 | 841.72 | 4.19 | 1.00 | 1.00 |
| 4 | 128 | 60 , 32 | 16 , 32 | 61440 , 65536 | 13370.21 | 3060.49 | 4.37 | 3.79 | 3.64 |
| 16 | 128 | 60 , 32 | 4 , 8 | 61440 , 65536 | 42697.42 | 10383.57 | 4.11 | 12.1 | 12.34 |
| 32 | 128 | 60 , 32 | 2 , 4 | 61440 , 65536 | 84223.16 | 20094.14 | 4.19 | 23.87 | 23.87 |
| 1 | 512 | 10 , 4 | 192 , 256 | 30720 , 32768 | 678.35 | 180 | 3.77 | 1.00 | 1.00 |
| 4 | 512 | 10 , 4 | 96 , 64 | 30720 , 32768 | 2678.29 | 646.76 | 4.14 | 3.95 | 3.59 |
| 16 | 512 | 10 , 4 | 24 , 32 | 30720 , 32768 | 7834.72 | 2204.72 | 3.55 | 11.55 | 12.25 |
| 32 | 512 | 10 , 4 | 6 , 16 | 30720 , 32768 | 18786.93 | 4196.15 | 4.48 | 27.70 | 23.31 |
Note: The respective values for FP32 runs that use a batch size of 60 and 10 in sequence lengths 128 and 512 are not available due to out of memory errors that arise.
Pre-training training performance: Single-node on NVIDIA DGX A100 (8x A100 80GB)
Our results were obtained by running the scripts/run_pretraining_lamb.sh training script in the TensorFlow 21.02-py3 NGC container on NVIDIA DGX A100 with 8x A100 80GB GPUs. Performance (in sequences per second) is the steady state throughput.
| GPUs | Sequence Length | Batch size / GPU: mixed precision, TF32 | Gradient Accumulation: mixed precision, TF32 | Global Batch Size: mixed precision, FP32 | Throughput - mixed precision | Throughput - TF32 | Throughput speedup (TF32 - mixed precision) | Weak scaling - mixed precision | Weak scaling -TF32 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 128 | 312 , 176 | 256 , 512 | 79872 , 90112 | 485.59 | 282.98 | 1.72 | 1.00 | 1.00 |
| 8 | 128 | 312 , 176 | 32 , 64 | 79872 , 90112 | 3799.24 | 1944.77 | 1.95 | 7.82 | 6.87 |
| 1 | 512 | 40 , 22 | 768 , 1536 | 30720 , 33792 | 96.52 | 54.92 | 1.76 | 1.00 | 1.00 |
| 8 | 512 | 40 , 22 | 96 , 192 | 30720 , 33792 | 649.69 | 427.39 | 1.52 | 6.73 | 7.78 |
Note: The respective values for TF32 runs that use a batch size of 312 and 40 in sequence lengths 128 and 512 are not available due to out of memory errors that arise.
Pre-training training performance: Multi-node on NVIDIA DGX A100 (8x A100 80GB)
Our results were obtained by running the scripts/run_pretraining_lamb.sh training script in the TensorFlow 21.02-py3 NGC container on NVIDIA DGX A100 with 8x A100 40GB GPUs. Performance (in sequences per second) is the steady state throughput.
| Num Nodes | Sequence Length | Batch size / GPU: mixed precision, TF32 | Gradient Accumulation: mixed precision, TF32 | Global Batch Size: mixed precision, FP32 | Throughput - mixed precision | Throughput - TF32 | Throughput speedup (TF32 - mixed precision) | Weak scaling - mixed precision | Weak scaling -TF32 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 128 | 312 , 176 | 32 , 64 | 79872 , 90112 | 3803.82 | 2062.98 | 1.84 | 1.00 | 1.00 |
| 2 | 128 | 312 , 176 | 16 , 32 | 79872 , 90112 | 7551.37 | 4084.76 | 1.85 | 1.99 | 1.98 |
| 8 | 128 | 312 , 176 | 4 , 8 | 79872 , 90112 | 29711.11 | 16134.02 | 1.84 | 7.81 | 7.82 |
| 32 | 128 | 312 , 176 | 1 , 2 | 79872 , 90112 | 110280.73 | 59569.77 | 1.85 | 28.99 | 28.88 |
| 1 | 512 | 40 , 22 | 96 , 192 | 30720 , 33792 | 749.73 | 431.89 | 1.74 | 1.00 | 1.00 |
| 2 | 512 | 40 , 22 | 48 , 96 | 30720 , 33792 | 1491.87 | 739.14 | 2.02 | 1.99 | 1.71 |
| 8 | 512 | 40 , 22 | 12 , 24 | 30720 , 33792 | 5870.83 | 2926.58 | 2.01 | 7.83 | 6.78 |
| 32 | 512 | 40 , 22 | 3 , 6 | 30720 , 33792 | 22506.23 | 11240.5 | 2.00 | 30.02 | 26.03 |
Note: The respective values for TF32 runs that use a batch size of 312 and 40 in sequence lengths 128 and 512 are not available due to out of memory errors that arise.
Fine-tuning training performance for SQuAD v1.1 on NVIDIA DGX-1 V100 (8x V100 16GB)
Our results were obtained by running the scripts/run_squad.sh training script in the TensorFlow 21.02-py3 NGC container on NVIDIA DGX-1 with 8x V100 16GB GPUs. Performance (in sequences per second) is the mean throughput from 2 epochs.
| GPUs | Batch size / GPU: mixed precision, FP32 | Throughput - mixed precision | Throughput - FP32 | Throughput speedup (FP32 to mixed precision) | Weak scaling - FP32 | Weak scaling - mixed precision |
|---|---|---|---|---|---|---|
| 1 | 6,3 | 39.10 | 9.85 | 3.97 | 1.00 | 1.00 |
| 4 | 6,3 | 128.48 | 36.52 | 3.52 | 3.29 | 3.71 |
| 8 | 6,3 | 255.36 | 73.03 | 3.5 | 6.53 | 7.41 |
Note: The respective values for FP32 runs that use a batch size of 6 are not available due to out of memory errors that arise. Batch size of 6 is only available on using FP16.
To achieve these same results, follow the Quick Start Guide outlined above.
Fine-tuning training performance for SQuAD v1.1 on NVIDIA DGX-1 V100 (8x V100 32GB)
Our results were obtained by running the scripts/run_squad.sh training script in the TensorFlow 21.02-py3 NGC container on NVIDIA DGX-1 with 8x V100 32GB GPUs. Performance (in sequences per second) is the mean throughput from 2 epochs.
| GPUs | Batch size / GPU: mixed precision, FP32 | Throughput - mixed precision | Throughput - FP32 | Throughput speedup (FP32 to mixed precision) | Weak scaling - FP32 | Weak scaling - mixed precision |
|---|---|---|---|---|---|---|
| 1 | 12,8 | 47.06 | 11.11 | 4.24 | 1.00 | 1.00 |
| 4 | 12,8 | 165.26 | 42.84 | 3.86 | 3.51 | 3.86 |
| 8 | 12,8 | 330.29 | 85.91 | 3.84 | 7.02 | 7.73 |
Note: The respective values for FP32 runs that use a batch size of 12 are not available due to out of memory errors that arise. Batch size of 12 is only available on using FP16.
To achieve these same results, follow the Quick Start Guide outlined above.
Fine-tuning training performance for SQuAD v1.1 on NVIDIA DGX A100 (8x A100 80GB)
Our results were obtained by running the scripts/run_squad.sh training script in the TensorFlow 21.02-py3 NGC container on NVIDIA DGX-2 with 16x V100 32GB GPUs. Performance (in sequences per second) is the mean throughput from 2 epochs.
| GPUs | Batch size / GPU: mixed precision, TF32 | Throughput - mixed precision | Throughput - FP32 | Throughput speedup (FP32 to mixed precision) | Weak scaling - FP32 | Weak scaling - mixed precision |
|---|---|---|---|---|---|---|
| 1 | 76,38 | 134.22 | 43.9 | 3.057 | 1.00 | 1.00 |
| 8 | 76,38 | 1048.23 | 341.31 | 3.071 | 7.81 | 7.77 |
Note: The respective values for TF32 runs that use a batch size of 76 are not available due to out of memory errors that arise. Batch size of 12 is only available on using FP16.
To achieve these same results, follow the Quick Start Guide outlined above.
Inference performance results
Fine-tuning inference performance for SQuAD v1.1 on NVIDIA DGX-1 V100 (1x V100 16GB)
Our results were obtained by running the scripts/finetune_inference_benchmark.sh training script in the TensorFlow 21.02-py3 NGC container on NVIDIA DGX-1 with 1x V100 16GB GPUs. Performance numbers (throughput in sequences per second and latency in milliseconds) were averaged from 1000 iterations. Latency is computed as the time taken for a batch to process as they are fed in one after another in the model ie no pipelining.
BERT-LARGE FP16
| Sequence Length | Batch Size | Throughput-Average(seq/sec) | Throughput speedup (FP32 to mixed precision) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) |
|---|---|---|---|---|---|---|---|
| 128 | 1 | 105.04 | 1.277237354 | 9.52 | 9.67 | 9.77 | 10.16 |
| 128 | 2 | 184.9 | 1.671487977 | 10.82 | 11.15 | 11.27 | 11.8 |
| 128 | 4 | 301.9 | 2.448102498 | 13.25 | 13.38 | 13.45 | 13.96 |
| 128 | 8 | 421.98 | 3.149809659 | 18.96 | 19.12 | 19.2 | 19.82 |
| 384 | 1 | 74.99 | 2.15055922 | 13.34 | 13.5 | 13.58 | 14.53 |
| 384 | 2 | 109.84 | 2.709422792 | 18.21 | 18.4 | 18.6 | 19.39 |
| 384 | 4 | 142.58 | 3.313502208 | 28.05 | 28.28 | 28.48 | 28.85 |
| 384 | 8 | 168.34 | 3.823302294 | 47.52 | 47.74 | 47.86 | 48.52 |
BERT-Large FP32
| Sequence Length | Batch Size | Throughput-Average(seq/sec) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) |
|---|---|---|---|---|---|---|
| 128 | 1 | 82.24 | 12.16 | 12.28 | 12.33 | 12.92 |
| 128 | 2 | 110.62 | 18.08 | 18.22 | 18.28 | 18.88 |
| 128 | 4 | 123.32 | 32.44 | 32.72 | 32.82 | 32.98 |
| 128 | 8 | 133.97 | 59.71 | 60.29 | 60.49 | 60.69 |
| 384 | 1 | 34.87 | 28.67 | 28.92 | 29.02 | 29.33 |
| 384 | 2 | 40.54 | 49.34 | 49.74 | 49.86 | 50.05 |
| 384 | 4 | 43.03 | 92.97 | 93.59 | 93.75 | 94.57 |
| 384 | 8 | 44.03 | 181.71 | 182.34 | 182.48 | 183.03 |
BERT-Base FP16
| Sequence Length | Batch Size | Throughput-Average(seq/sec) | Throughput speedup (FP32 to mixed precision) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) |
|---|---|---|---|---|---|---|---|
| 128 | 1 | 236.26 | 1.179589595 | 4.23 | 4.37 | 4.49 | 4.59 |
| 128 | 2 | 425.1 | 1.441554478 | 4.7 | 4.84 | 4.97 | 5.26 |
| 128 | 4 | 710.48 | 1.911691107 | 5.63 | 5.78 | 5.93 | 6.4 |
| 128 | 8 | 1081.17 | 2.523032764 | 7.4 | 7.5 | 7.54 | 7.73 |
| 384 | 1 | 190.53 | 1.757170525 | 5.25 | 5.35 | 5.42 | 5.8 |
| 384 | 2 | 289.67 | 2.248292456 | 6.9 | 7.08 | 7.24 | 7.57 |
| 384 | 4 | 404.03 | 2.946328302 | 9.9 | 10 | 10.03 | 10.13 |
| 384 | 8 | 504.24 | 3.450153951 | 15.87 | 15.96 | 16.01 | 16.3 |
BERT-Base FP32
| Sequence Length | Batch Size | Throughput-Average(seq/sec) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) |
|---|---|---|---|---|---|---|
| 128 | 1 | 200.29 | 4.99 | 5.08 | 5.16 | 5.53 |
| 128 | 2 | 294.89 | 6.78 | 6.89 | 6.93 | 7.37 |
| 128 | 4 | 371.65 | 10.76 | 10.89 | 10.96 | 11.92 |
| 128 | 8 | 428.52 | 18.67 | 18.89 | 18.98 | 19.17 |
| 384 | 1 | 108.43 | 9.22 | 9.26 | 9.31 | 10.24 |
| 384 | 2 | 128.84 | 15.52 | 15.6 | 15.71 | 16.49 |
| 384 | 4 | 137.13 | 29.17 | 29.4 | 29.48 | 29.64 |
| 384 | 8 | 146.15 | 54.74 | 55.19 | 55.3 | 55.54 |
To achieve these same results, follow the Quick Start Guide outlined above.
Fine-tuning inference performance for SQuAD v1.1 on NVIIDA DGX-1 V100 (1x V100 32GB)
Our results were obtained by running the scripts/finetune_inference_benchmark.sh training script in the TensorFlow 21.02-py3 NGC container on NVIDIA DGX-1 with 1x V100 32GB GPUs. Performance numbers (throughput in sequences per second and latency in milliseconds) were averaged from 1000 iterations. Latency is computed as the time taken for a batch to process as they are fed in one after another in the model ie no pipelining.
BERTLarge FP16
| Sequence Length | Batch Size | Throughput-Average(seq/sec) | Throughput speedup (FP32 to mixed precision) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) |
|---|---|---|---|---|---|---|---|
| 128 | 1 | 101.58 | 1.242112986 | 9.84 | 9.99 | 10.06 | 10.39 |
| 128 | 2 | 181.89 | 1.651593571 | 11 | 11.14 | 11.2 | 11.87 |
| 128 | 4 | 295.86 | 2.348840902 | 13.52 | 13.67 | 13.75 | 14.5 |
| 128 | 8 | 411.29 | 3.010246652 | 19.45 | 19.62 | 19.69 | 20.4 |
| 384 | 1 | 72.95 | 2.083690374 | 13.71 | 13.93 | 14.08 | 14.81 |
| 384 | 2 | 107.02 | 2.583775954 | 18.69 | 18.8 | 18.88 | 19.57 |
| 384 | 4 | 139.8 | 3.14652262 | 28.61 | 28.75 | 28.88 | 29.6 |
| 384 | 8 | 163.68 | 3.595782074 | 48.88 | 49.09 | 49.18 | 49.77 |
BERT-Large FP32
| Sequence Length | Batch Size | Throughput-Average(seq/sec) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) |
|---|---|---|---|---|---|---|
| 128 | 1 | 81.78 | 12.23 | 12.37 | 12.43 | 13.2 |
| 128 | 2 | 110.13 | 18.16 | 18.29 | 18.37 | 19.27 |
| 128 | 4 | 125.96 | 31.76 | 32.09 | 32.21 | 32.42 |
| 128 | 8 | 136.63 | 58.55 | 58.93 | 59.05 | 59.4 |
| 384 | 1 | 35.01 | 28.56 | 28.81 | 28.94 | 29.16 |
| 384 | 2 | 41.42 | 48.29 | 48.57 | 48.67 | 49.02 |
| 384 | 4 | 44.43 | 90.03 | 90.43 | 90.59 | 90.89 |
| 384 | 8 | 45.52 | 175.76 | 176.66 | 176.89 | 177.33 |
BERT-Base FP16
| Sequence Length | Batch Size | Throughput-Average(seq/sec) | Throughput speedup (FP32 to mixed precision) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) |
|---|---|---|---|---|---|---|---|
| 128 | 1 | 234.85 | 1.217533309 | 4.26 | 4.33 | 4.37 | 4.62 |
| 128 | 2 | 415.86 | 1.435782351 | 4.81 | 4.92 | 5.06 | 5.55 |
| 128 | 4 | 680.09 | 1.84912586 | 5.88 | 6.1 | 6.2 | 6.53 |
| 128 | 8 | 1030.03 | 2.264548752 | 7.77 | 7.87 | 7.95 | 8.53 |
| 384 | 1 | 183.18 | 1.700993593 | 5.46 | 5.56 | 5.61 | 5.93 |
| 384 | 2 | 275.77 | 2.175528558 | 7.25 | 7.38 | 7.44 | 7.89 |
| 384 | 4 | 385.61 | 2.778570399 | 10.37 | 10.56 | 10.63 | 11.1 |
| 384 | 8 | 488.45 | 3.292329469 | 16.38 | 16.48 | 16.52 | 16.64 |
BERT-Base FP32
| Sequence Length | Batch Size | Throughput-Average(seq/sec) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) |
|---|---|---|---|---|---|---|
| 128 | 1 | 192.89 | 5.18 | 5.3 | 5.36 | 5.65 |
| 128 | 2 | 289.64 | 6.91 | 7 | 7.22 | 7.83 |
| 128 | 4 | 367.79 | 10.88 | 10.98 | 11.02 | 11.59 |
| 128 | 8 | 454.85 | 17.59 | 17.76 | 17.81 | 17.92 |
| 384 | 1 | 107.69 | 9.29 | 9.37 | 9.42 | 9.88 |
| 384 | 2 | 126.76 | 15.78 | 15.89 | 15.97 | 16.72 |
| 384 | 4 | 138.78 | 28.82 | 28.98 | 29.06 | 29.88 |
| 384 | 8 | 148.36 | 53.92 | 54.16 | 54.26 | 54.58 |
To achieve these same results, follow the Quick Start Guide outlined above.
Fine-tuning inference performance for SQuAD v1.1 on NVIDIA DGX A100 (1x A100 80GB)
Our results were obtained by running the scripts/finetune_inference_benchmark.sh training script in the TensorFlow 21.02-py3 NGC container on NVIDIA DGX-2 with 1x V100 32GB GPUs. Performance numbers (throughput in sequences per second and latency in milliseconds) were averaged from 1000 iterations. Latency is computed as the time taken for a batch to process as they are fed in one after another in the model ie no pipelining.
BERT-Large FP16
| Sequence Length | Batch Size | Throughput-Average(seq/sec) | Throughput speedup (FP32 to mixed precision) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) |
|---|---|---|---|---|---|---|---|
| 128 | 1 | 145.21 | 0.9435347628 | 6.89 | 7.14 | 7.4 | 8.35 |
| 128 | 2 | 272.81 | 1.093953003 | 7.33 | 7.61 | 7.77 | 8.35 |
| 128 | 4 | 468.98 | 1.273087573 | 8.53 | 8.71 | 8.83 | 9.85 |
| 128 | 8 | 705.67 | 1.191627687 | 11.34 | 11.64 | 11.9 | 13.1 |
| 384 | 1 | 118.34 | 1.042459479 | 8.45 | 8.82 | 8.99 | 9.52 |
| 384 | 2 | 197.8 | 1.231478023 | 10.11 | 10.48 | 10.62 | 11.4 |
| 384 | 4 | 275.19 | 1.268332027 | 14.54 | 14.73 | 14.8 | 16.8 |
| 384 | 8 | 342.22 | 1.416004634 | 23.38 | 23.64 | 23.75 | 24.1 |
BERT-Large TF32
| Sequence Length | Batch Size | Throughput-Average(seq/sec) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) |
|---|---|---|---|---|---|---|
| 128 | 1 | 153.9 | 6.5 | 6.76 | 6.86 | 7.4 |
| 128 | 2 | 249.38 | 8.02 | 8.22 | 8.34 | 9.45 |
| 128 | 4 | 368.38 | 10.86 | 11.11 | 11.24 | 12.76 |
| 128 | 8 | 592.19 | 13.51 | 13.64 | 13.77 | 15.85 |
| 384 | 1 | 113.52 | 8.81 | 9.02 | 9.16 | 10.19 |
| 384 | 2 | 160.62 | 12.45 | 12.61 | 12.68 | 14.47 |
| 384 | 4 | 216.97 | 18.44 | 18.6 | 18.7 | 18.84 |
| 384 | 8 | 241.68 | 33.1 | 33.29 | 33.36 | 33.5 |
BERT-Base FP16
| Sequence Length | Batch Size | Throughput-Average(seq/sec) | Throughput speedup (FP32 to mixed precision) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) |
|---|---|---|---|---|---|---|---|
| 128 | 1 | 295.01 | 1.014023992 | 3.39 | 3.59 | 3.65 | 3.73 |
| 128 | 2 | 594.81 | 1.048455898 | 3.36 | 3.59 | 3.68 | 4.19 |
| 128 | 4 | 1043.12 | 1.005145599 | 3.83 | 3.97 | 4.2 | 4.44 |
| 128 | 8 | 1786.25 | 1.198278638 | 4.48 | 4.73 | 4.8 | 5.19 |
| 384 | 1 | 278.85 | 1.103395062 | 3.59 | 3.67 | 3.99 | 4.15 |
| 384 | 2 | 464.77 | 1.252006896 | 4.3 | 4.59 | 4.87 | 5.29 |
| 384 | 4 | 675.82 | 1.264822578 | 5.92 | 6.15 | 6.27 | 6.94 |
| 384 | 8 | 846.81 | 1.31109494 | 9.45 | 9.65 | 9.74 | 11.03 |
BERT-Base TF32
| Sequence Length | Batch Size | Throughput-Average(seq/sec) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) |
|---|---|---|---|---|---|---|
| 128 | 1 | 290.93 | 3.44 | 3.61 | 3.73 | 4.69 |
| 128 | 2 | 567.32 | 3.53 | 3.64 | 3.96 | 5.01 |
| 128 | 4 | 1037.78 | 3.85 | 3.95 | 4.06 | 4.58 |
| 128 | 8 | 1490.68 | 5.37 | 5.61 | 5.66 | 6.19 |
| 384 | 1 | 252.72 | 3.96 | 3.96 | 4.52 | 4.66 |
| 384 | 2 | 371.22 | 5.39 | 5.64 | 5.71 | 6.38 |
| 384 | 4 | 534.32 | 7.49 | 7.69 | 7.76 | 8.56 |
| 384 | 8 | 645.88 | 12.39 | 12.61 | 12.67 | 12.77 |
To achieve these same results, follow the Quick Start Guide outlined above.
Fine-tuning inference performance for SQuAD v1.1 on NVIDIA Tesla T4 (1x T4 16GB)
Our results were obtained by running the scripts/finetune_inference_benchmark.sh training script in the TensorFlow 21.02-py3 NGC container on NVIDIA Tesla T4 with 1x T4 16GB GPUs. Performance numbers (throughput in sequences per second and latency in milliseconds) were averaged from 1000 iterations. Latency is computed as the time taken for a batch to process as they are fed in one after another in the model ie no pipelining.
BERT-Large FP16
| Sequence Length | Batch Size | Throughput-Average(seq/sec) | Throughput speedup (FP32 to mixed precision) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) |
|---|---|---|---|---|---|---|---|
| 128 | 1 | 57.6 | 1.364605544 | 17.36 | 18.16 | 19.02 | 21.67 |
| 128 | 2 | 102.76 | 2.17988969 | 19.46 | 20.68 | 21.27 | 22.2 |
| 128 | 4 | 151.11 | 3.146813828 | 26.47 | 26.9 | 27.06 | 27.45 |
| 128 | 8 | 186.99 | 3.733080455 | 42.78 | 43.87 | 44.18 | 44.78 |
| 384 | 1 | 38.88 | 2.590273151 | 25.72 | 26.06 | 26.16 | 26.38 |
| 384 | 2 | 50.53 | 3.202154626 | 39.58 | 39.93 | 40.35 | 40.95 |
| 384 | 4 | 57.69 | 3.721935484 | 69.34 | 70.5 | 70.77 | 71.09 |
| 384 | 8 | 62.99 | 3.927057357 | 127 | 129.18 | 130.07 | 131.86 |
BERT-Large FP32
| Sequence Length | Batch Size | Throughput-Average(seq/sec) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) |
|---|---|---|---|---|---|---|
| 128 | 1 | 42.21 | 23.69 | 24.8 | 25.02 | 25.48 |
| 128 | 2 | 47.14 | 42.42 | 43.48 | 43.63 | 44.32 |
| 128 | 4 | 48.02 | 83.29 | 84.37 | 84.68 | 85.14 |
| 128 | 8 | 50.09 | 159.72 | 161.66 | 161.97 | 162.52 |
| 384 | 1 | 15.01 | 66.63 | 67.76 | 68.08 | 68.66 |
| 384 | 2 | 15.78 | 126.78 | 128.21 | 128.58 | 129.08 |
| 384 | 4 | 15.5 | 258.1 | 261.01 | 261.66 | 262.55 |
| 384 | 8 | 16.04 | 498.61 | 504.29 | 504.74 | 505.55 |
BERT-Base FP16
| Sequence Length | Batch Size | Throughput-Average(seq/sec) | Throughput speedup (FP32 to mixed precision) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) |
|---|---|---|---|---|---|---|---|
| 128 | 1 | 116.56 | 1.039878669 | 8.58 | 9.53 | 10.84 | 11.74 |
| 128 | 2 | 238.62 | 1.675937632 | 8.38 | 9.09 | 9.27 | 12.33 |
| 128 | 4 | 402.93 | 2.440964439 | 9.93 | 10.07 | 10.13 | 12.17 |
| 128 | 8 | 532.56 | 3.052619512 | 15.02 | 15.43 | 15.6 | 16.52 |
| 384 | 1 | 102.12 | 2.035073735 | 9.79 | 11.06 | 11.18 | 12.07 |
| 384 | 2 | 149.3 | 2.910898811 | 13.4 | 13.54 | 13.62 | 14.36 |
| 384 | 4 | 177.78 | 3.563439567 | 22.5 | 23.11 | 23.27 | 23.59 |
| 384 | 8 | 192.61 | 3.752386519 | 41.53 | 42.67 | 42.81 | 43.31 |
BERT-Base FP32
| Sequence Length | Batch Size | Throughput-Average(seq/sec) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) |
|---|---|---|---|---|---|---|
| 128 | 1 | 112.09 | 8.92 | 9.12 | 9.49 | 10.93 |
| 128 | 2 | 142.38 | 14.05 | 14.34 | 14.48 | 15.03 |
| 128 | 4 | 165.07 | 24.23 | 24.86 | 24.92 | 25.05 |
| 128 | 8 | 174.46 | 45.86 | 46.71 | 46.8 | 47.2 |
| 384 | 1 | 50.18 | 19.93 | 20.53 | 21.04 | 21.73 |
| 384 | 2 | 51.29 | 38.99 | 39.68 | 39.93 | 40.2 |
| 384 | 4 | 49.89 | 80.18 | 81.54 | 82 | 82.65 |
| 384 | 8 | 51.33 | 155.85 | 158.11 | 158.5 | 159.17 |
To achieve these same results, follow the Quick Start Guide outlined above.