Overview#
This document summarizes performance measurements of TensorRT-LLM on a number of GPUs across a set of key models.
The data in the following tables is provided as a reference point to help users validate observed performance. It should not be considered as the peak performance that can be delivered by TensorRT-LLM.
Not all configurations were tested for all GPUs.
Commands are kept as simple as possible to ease reproducibility, with many options left at their default settings. Tune batch sizes, parallelism configurations, and other options to improve performance for your specific situation.
For DeepSeek R1 performance, see the performance guide.
For more information on benchmarking with trtllm-bench, see this NVIDIA blog post.
For NUMA systems, consult the “CPU Affinity configuration in TensorRT LLM” guide to achieve best performance. These options were enabled for relevant tests.
Throughput Measurements#
The tables below show performance data where a local inference client sends requests at a high rate with no delay between requests,
representing the throughput scenario under maximum load. The reported metric is Output Throughput per GPU (tokens/sec/GPU).
The performance numbers below were collected using the steps described in Reproducing Benchmarked Results.
All tested models use weights quantized with ModelOpt and published by NVIDIA on the Model Optimizer HuggingFace Collection.
Hardware#
The following GPU variants were used for testing:
H100 SXM 80GB (DGX H100)
H200 SXM 141GB (DGX H200)
B200 180GB (DGX B200)
GB200 192GB (GB200 NVL72)
RTX 6000 Pro Blackwell Server Edition
Note: As of release/1.2, support for B300 and GB300 is in beta, and performance data should not be considered finalized.
B300 288GB (DGX B300) (beta)
GB300 288 GB (GB300 NVL72) (beta)
Other hardware variants may have different TDP, memory bandwidth, core count, or other features leading to performance differences on these workloads.
FP4 Models#
nvidia/DeepSeek-R1-0528-NVFP4-v2
nvidia/Qwen3-235B-A22B-FP4
nvidia/Qwen3-30B-A3B-FP4
nvidia/Llama-3.3-70B-Instruct-FP4
FP8 Models#
deepseek-ai/DeepSeek-R1-0528
nvidia/Qwen3-235B-A22B-FP8
nvidia/Llama-3.3-70B-Instruct-FP8
Performance Summary - All Networks#
All performance values are measured in output tokens per second per GPU, where output tokens refers to all generated tokens (excluding input/prompt tokens).
Data in these tables is taken from the Per GPU Output Throughput (tps/gpu) metric reported by trtllm-bench.
The metric calculations are defined in reporting.py and statistics.py.
RTX 6000 systems can benefit from enabling pipeline parallelism (PP) in LLM workloads. Results for various TP x PP combinations on this GPU are presented in a separate table for each network.
Units#
All performance values are measured in output tokens per second per GPU.
Table of Contents#
Deepseek R1 0528#
Sequence Length (ISL/OSL) |
B200 |
B300* (beta) |
GB200 |
GB300* (beta) |
H200 |
|---|---|---|---|---|---|
1024/1024 |
5,757 |
6,046 |
4,989 |
4,981 |
1,724 |
1024/8192 |
4,228 |
6,235 |
4,474 |
6,842 |
1,335 |
1024/32768 |
1,472 |
2,177 |
1,582 |
2,904 |
|
8192/1024 |
1,176 |
1,489 |
1,276 |
1,599 |
|
32768/1024 |
335 |
Unit: output tokens per second per GPU
GPT-OSS 120B#
Sequence Length (ISL/OSL) |
B200 |
B300* (beta) |
GB200 |
GB300* (beta) |
H200 |
|---|---|---|---|---|---|
1024/1024 |
29,061 |
34,737 |
29,056 |
38,702 |
6,391 |
1024/8192 |
16,434 |
18,338 |
17,079 |
19,866 |
4,260 |
1024/32768 |
7,020 |
7,284 |
6,313 |
7,958 |
|
8192/1024 |
6,938 |
8,361 |
7,874 |
9,407 |
1,881 |
32768/1024 |
1,623 |
2,052 |
1,929 |
2,307 |
500 |
Unit: output tokens per second per GPU
GPT-OSS 20B#
Sequence Length (ISL/OSL) |
B200 |
B300* (beta) |
GB200 |
GB300* (beta) |
H200 |
|---|---|---|---|---|---|
1024/1024 |
59,084 |
60,925 |
51,870 |
53,604 |
14,719 |
1024/8192 |
37,824 |
42,986 |
35,280 |
44,998 |
12,441 |
1024/32768 |
15,799 |
17,461 |
17,414 |
19,147 |
4,240 |
8192/1024 |
13,439 |
14,955 |
15,466 |
16,880 |
4,196 |
32768/1024 |
2,970 |
3,408 |
3,331 |
3,833 |
965 |
Unit: output tokens per second per GPU
LLaMA v3.3 70B#
Sequence Length (ISL/OSL) |
B200 |
B300* (beta) |
GB200 |
GB300* (beta) |
H200 |
|---|---|---|---|---|---|
1024/1024 |
6,943 |
8,196 |
7,576 |
8,910 |
2,637 |
1024/8192 |
3,270 |
3,926 |
3,856 |
4,739 |
1,995 |
8192/1024 |
1,347 |
1,597 |
1,593 |
1,900 |
544 |
32768/1024 |
279 |
351 |
315 |
418 |
120 |
Unit: output tokens per second per GPU
LLaMA v3.3 70B - RTX 6000 Pro Blackwell Server Edition#
Shows Tensor Parallel (TP) and Pipeline Parallel (PP) configurations
Sequence Length (ISL/OSL) |
1 GPUs |
2 GPUs |
4 GPUs |
8 GPUs |
|---|---|---|---|---|
1024/1024 |
1,724 |
1,881 |
1,798 |
1,545 |
1024/8192 |
675 |
630 |
||
8192/1024 |
306 |
329 |
323 |
307 |
32768/1024 |
66 |
66 |
64 |
Unit: output tokens per second per GPU
Qwen3 235B A22B#
Sequence Length (ISL/OSL) |
B200 |
B300* (beta) |
GB200 |
GB300* (beta) |
H200 |
|---|---|---|---|---|---|
1024/1024 |
6,423 |
8,143 |
6,777 |
8,430 |
3,494 |
1024/8192 |
3,881 |
4,938 |
3,955 |
5,110 |
1,677 |
1024/32768 |
1,216 |
1,922 |
1,240 |
1,841 |
|
8192/1024 |
1,518 |
1,730 |
1,575 |
1,791 |
679 |
32768/1024 |
326 |
383 |
342 |
398 |
143 |
Unit: output tokens per second per GPU
Qwen3 235B A22B - RTX 6000 Pro Blackwell Server Edition#
Shows Tensor Parallel (TP) and Pipeline Parallel (PP) configurations
Sequence Length (ISL/OSL) |
4 GPUs |
8 GPUs |
|---|---|---|
1024/1024 |
1,529 |
1,185 |
1024/8192 |
495 |
495 |
8192/1024 |
343 |
337 |
32768/1024 |
81 |
83 |
Unit: output tokens per second per GPU
Qwen3 30B A3B#
Sequence Length (ISL/OSL) |
B200 |
B300* (beta) |
GB200 |
GB300* (beta) |
|---|---|---|---|---|
1024/1024 |
26,431 |
30,714 |
19,682 |
22,536 |
1024/8192 |
13,940 |
15,182 |
14,916 |
16,920 |
1024/32768 |
4,570 |
5,209 |
||
8192/1024 |
5,945 |
6,374 |
6,450 |
6,947 |
32768/1024 |
1,284 |
1,452 |
1,398 |
1,575 |
Unit: output tokens per second per GPU
Qwen3 30B A3B - RTX 6000 Pro Blackwell Server Edition#
Shows Tensor Parallel (TP) and Pipeline Parallel (PP) configurations
Sequence Length (ISL/OSL) |
1 GPUs |
2 GPUs |
4 GPUs |
8 GPUs |
|---|---|---|---|---|
1024/1024 |
9,908 |
8,187 |
6,931 |
3,065 |
1024/8192 |
3,628 |
3,281 |
3,024 |
1,968 |
1024/32768 |
918 |
|||
8192/1024 |
1,925 |
1,805 |
1,656 |
1,193 |
32768/1024 |
372 |
356 |
349 |
318 |
Unit: output tokens per second per GPU
Reproducing Benchmarked Results#
The following tables provide reference commands used in the benchmarking process. For a more detailed description, see the benchmarking suite documentation.
Command Overview#
This workflow uses the PyTorch backend and does not require building an engine.
Stage |
Description |
Command |
|---|---|---|
Create a synthetic dataset |
|
|
Run a benchmark with a dataset |
|
Variables#
Name |
Description |
|---|---|
|
Benchmark input sequence length. |
|
Benchmark output sequence length. |
|
Tensor parallel mapping degree to run the benchmark with |
|
Pipeline parallel mapping degree to run the benchmark with |
|
Expert parallel mapping degree to run the benchmark with |
|
HuggingFace model name eg. meta-llama/Llama-2-7b-hf or use the path to a local weights directory |
|
Location of the dataset file generated by |
|
The number of requests to generate for dataset generation |
|
A sequence length of ISL + OSL |
|
(optional) A yaml file containing additional options for the LLM API |
Preparing a Dataset#
Use the provided script to generate a synthetic dataset. Run the following command:
python benchmarks/cpp/prepare_dataset.py --tokenizer=$model_name --stdout token-norm-dist --num-requests=$num_requests --input-mean=$isl --output-mean=$osl --input-stdev=0 --output-stdev=0 > $dataset_file
This generates a text file at the path specified by $dataset_file where all requests share the same
input/output sequence length combination. The script uses the tokenizer to retrieve the vocabulary size and
randomly samples token IDs to create entirely random sequences. All requests are uniform
because the standard deviations for both input and output sequences are set to 0.
The table below lists the $num_requests used for each input/output sequence length combination. Shorter sequences cycle through faster and need more requests to reach steady state; longer sequences need fewer.
Input Length |
Output Length |
Number of Requests |
|---|---|---|
1024 |
1024 |
3000 |
8192 |
1024 |
1500 |
1024 |
8192 |
1500 |
32768 |
1024 |
1000 |
1024 |
32768 |
1000 |
Running the Benchmark#
Run the benchmark using the trtllm-bench throughput subcommand. This runs an offline maximum throughput scenario where all requests are queued in rapid succession. Provide a model name (HuggingFace reference or path to a local model), a generated dataset, and a YAML config file with additional LLM options (see tensorrt_llm/llmapi/llm_args.py:LlmArgs).
For dense / non-MoE models:
trtllm-bench --tp $tp_size --pp $pp_size --model $model_name throughput --dataset $dataset_file --backend pytorch --config $llm_options --concurrency -1
Llama 3.3
llm_options.yml
cuda_graph_config:
enable_padding: true
batch_sizes: [1, 2, 4, 8, 16, 32, 64, 128, 256, 384, 512, 1024, 2048, 4096, 8192]
For MoE models:
trtllm-bench --tp $tp_size --pp $pp_size --ep $ep_size --model $model_name throughput --dataset $dataset_file --backend pytorch --config $llm_options --concurrency -1
GPT-OSS:
llm_options.yml
cuda_graph_config:
enable_padding: true
batch_sizes: [1, 2, 4, 8, 16, 32, 64, 128, 256, 384, 512, 1024, 2048, 4096, 8192]
enable_attention_dp: true
kv_cache_config:
dtype: fp8
# Hopper: use auto
moe_config:
backend: TRTLLM
# Hopper: use TRITON
DeepSeek R1:
llm_options.yml
attention_dp_config:
batching_wait_iters: 0
enable_balance: true
timeout_iters: 60
enable_attention_dp: true
cuda_graph_config:
enable_padding: true
batch_sizes: [1, 2, 4, 8, 16, 32, 64, 128, 256, 384, 512, 1024, 2048, 4096, 8192]
moe_config:
backend: CUTLASS
kv_cache_config:
dtype: fp8
Kimi K2:
llm_options.yml
enable_attention_dp: true
cuda_graph_config:
enable_padding: true
batch_sizes: [1, 2, 4, 8, 16, 32, 64, 128, 256, 384]
moe_config:
backend: CUTLASS
kv_cache_config:
dtype: auto
Qwen3 MoE, Llama4 Maverick:
llm_options.yml
enable_attention_dp: true
cuda_graph_config:
enable_padding: true
batch_sizes: [1, 2, 4, 8, 16, 32, 64, 128, 256, 384, 512, 1024, 2048, 4096, 8192]
Results are printed to the terminal upon benchmark completion. For example:
===========================================================
= PERFORMANCE OVERVIEW
===========================================================
Request Throughput (req/sec): 43.2089
Total Output Throughput (tokens/sec): 5530.7382
Per User Output Throughput (tokens/sec/user): 2.0563
Per GPU Output Throughput (tokens/sec/gpu): 5530.7382
Total Token Throughput (tokens/sec): 94022.5497
Total Latency (ms): 115716.9214
Average request latency (ms): 75903.4456
Per User Output Speed [1/TPOT] (tokens/sec/user): 5.4656
Average time-to-first-token [TTFT] (ms): 52667.0339
Average time-per-output-token [TPOT] (ms): 182.9639
-- Per-Request Time-per-Output-Token [TPOT] Breakdown (ms)
[TPOT] MINIMUM: 32.8005
[TPOT] MAXIMUM: 208.4667
[TPOT] AVERAGE: 182.9639
[TPOT] P50 : 204.0463
[TPOT] P90 : 206.3863
[TPOT] P95 : 206.5064
[TPOT] P99 : 206.5821
-- Per-Request Time-to-First-Token [TTFT] Breakdown (ms)
[TTFT] MINIMUM: 3914.7621
[TTFT] MAXIMUM: 107501.2487
[TTFT] AVERAGE: 52667.0339
[TTFT] P50 : 52269.7072
[TTFT] P90 : 96583.7187
[TTFT] P95 : 101978.4566
[TTFT] P99 : 106563.4497
-- Request Latency Breakdown (ms) -----------------------
[Latency] P50 : 78509.2102
[Latency] P90 : 110804.0017
[Latency] P95 : 111302.9101
[Latency] P99 : 111618.2158
[Latency] MINIMUM: 24189.0838
[Latency] MAXIMUM: 111668.0964
[Latency] AVERAGE: 75903.4456
[!WARNING] If the benchmarker does not print any output, this typically indicates an out-of-memory issue. Reduce the KV cache percentage using the
--kv_cache_free_gpu_mem_fractionoption to lower memory usage.