[!IMPORTANT] 从 TensorRT-LLM v0.10 开始,这些性能基准测试已更改方法以利用飞行中批处理,不再使用静态基准测试。 这些数字是初步测量,预计在未来版本中会有所改进。

概述#

本文档总结了 TensorRT-LLM 在一组关键模型中跨多个 GPU 的性能测量。

下表中的数据作为参考点提供,以帮助用户验证观察到的性能。 不应将其视为 TensorRT-LLM 可以提供的峰值性能。

已知问题#

正在解决以下问题以提高 TensorRT-LLM 的效率。

AMD CPU 平台上已知的 AllReduce 性能问题#

我们观察到 NCCL 2.23.4 存在性能问题,可以通过将 NCCL_P2P_LEVEL 设置为 SYS 来解决

export NCCL_P2P_LEVEL=SYS

多 GPU 情况可能会受到此问题的影响,该问题正在解决。

融合 Matmul + Gated-SiLU (LLaMA)#

当前实现将两个 Matmul 操作组合成一个 Matmul,后跟一个单独的 SwiGLU 内核(当启用 --use_fused_mlp=enable 时)。 还有一种更高效的实现,可在 Hopper 上为 FP8 运行单个 Matmul + SwiGLU 融合内核(当启用 --use_fused_mlp=enable --gemm_swiglu_plugin fp8 时)。 gemm_swiglu_plugin 将在未来版本中支持更多数据类型和 GPU 架构。

使用 gptManagerBenchmark 用于 GH200#

对于版本 v0.17,在 GH200 系统上,我们建议使用基于 gptManagerBenchmark 的传统流程来衡量性能。

吞吐量测量#

下表显示了本地推理客户端以无限速率(消息之间没有延迟)提供请求的性能数据,并显示了最大负载下客户端-服务器场景的吞吐量。

以下性能数字是使用本文档中描述的步骤收集的。

下表中的所有数据均使用版本 0.17 生成,并以令牌/秒为单位显示令牌吞吐量。

吞吐量(令牌/秒)

GPU

H200 141GB HBM3

H100 80GB HBM3

GH200 480GB

L40S

A100-SXM4-80GB

精度

FP8

FP8

FP8

FP8

FP16

模型

张量模型并行大小

运行时输入/输出长度

LLaMA v3.1 8B

1

128, 128

29526.04

28836.77

29852.96

9104.61

6627.27

128, 2048

25398.86

21109.38

21769.55

5365.81

5255.99

128, 4096

17370.8

13593.65

14189.89

3025.92

3453.79

500, 2000

21020.81

16500.69

17137.29

4273.75

4276.58

1000, 1000

17537.96

15244.78

16482.77

4054.71

3786.83

2048, 128

3794.14

3556.73

3843.95

1066.52

799.61

2048, 2048

11968.5

9488.42

10265.9

2225.27

2424.16

5000, 500

3987.79

3559.36

3932.58

981.2

825.13

20000, 2000

1804.1

1401.31

1560.2

327.97

330.04

LLaMA v3.1 70B

1

128, 128

4020.75

3378.03

3636.91

128, 2048

4165.68

911.62

2082.74

128, 4096

2651.75

426.32

1263.98

500, 2000

3018.39

775.57

1973.86

1000, 1000

2823.45

839.97

1746.12

2048, 128

465.99

343.29

424.96

2048, 2048

1913.8

1086.93

5000, 500

560.16

245.34

422.36

20000, 2000

279.52

2

128, 128

6823.01

6645.12

1313.96

128, 2048

8290.35

6169.58

531.26

128, 4096

6526.67

3897.06

500, 2000

6848.02

4972.57

439.41

1000, 1000

5164.76

4390.53

472.94

2048, 128

809

772.66

148.96

2048, 2048

4183.88

2898.16

261.1

5000, 500

1025.38

919.73

121.47

20000, 2000

640.62

443.01

4

128, 128

11098.63

11127.53

1523.52

2733.48

128, 2048

14156

11511.93

1942.66

2811.27

128, 4096

10574.06

7439.41

1440.23

1976.49

500, 2000

12452.79

9836.7

1634.72

2275.79

1000, 1000

8911.29

7430.99

1209.25

1921.77

2048, 128

1358.06

1302.6

177.72

325.15

2048, 2048

7130.44

5480.03

969.68

1393.64

5000, 500

1811.55

1602.78

249.52

392.62

20000, 2000

1199.68

920.19

162.25

212.08

8

128, 128

15355.84

14730.69

1464.03

4717.62

128, 2048

21195.88

17061.82

2303.31

5241.5

128, 4096

16941.52

14171.43

2018.22

3724.67

500, 2000

17278.4

14679.33

1971.96

4445.37

1000, 1000

13181.24

11451.16

1333.62

3320.41

2048, 128

1983.03

1923.41

176.16

542.38

2048, 2048

11142.47

8801.95

1200.16

2553.71

5000, 500

2717.83

2457.42

259.71

696.34

20000, 2000

1920.45

1512.6

209.87

413.38

LLaMA v3.1 405B

8

128, 128

3874.19

128, 2048

5938.09

128, 4096

5168.37

500, 2000

5084.29

1000, 1000

3399.69

2048, 128

463.42

2048, 2048

2940.62

5000, 500

669.13

20000, 2000

535.31

Mistral 7B

1

128, 128

31938.12

31674.49

32498.47

9664.13

6982.53

128, 2048

27409.3

23496.42

23337.29

5720.65

5630.62

128, 4096

18505.03

14350.99

15017.88

3136.33

3591.22

500, 2000

22354.67

18026.27

18556

4521.77

4400.48

1000, 1000

18426.16

16035.66

17252.11

4177.76

3896.58

2048, 128

3834.43

3642.48

3813.13

1076.74

808.58

2048, 2048

12347.37

9958.17

10755.94

2286.71

2489.77

5000, 500

4041.59

3591.33

3949.66

1001.02

844.64

20000, 2000

1822.69

1373.24

1601.28

337.83

332.3

Mixtral 8x7B

1

128, 128

17157.72

15962.49

16859.18

128, 2048

15095.21

8290.13

11120.16

128, 4096

9534.62

4784.86

6610.47

500, 2000

12105.27

6800.6

9192.86

1000, 1000

10371.36

6868.52

8849.18

2048, 128

2009.67

1892.81

1994.31

2048, 2048

6940.32

3983.1

5545.46

5000, 500

2309.1

1764.7

2078.27

20000, 2000

1151.78

673.7

860.68

2

128, 128

27825.34

27451.13

5541.47

128, 2048

29584.05

22830.08

4169.78

128, 4096

21564.68

14237.01

2608.05

500, 2000

23410.63

17036.04

3446.37

1000, 1000

19151.19

15770.89

3154.52

2048, 128

3383.16

3333.68

649

2048, 2048

14007.29

10685.85

2056.58

5000, 500

4223.68

3646.09

724.44

20000, 2000

2299.21

1757.45

337.51

4

128, 128

42551.59

41068.23

6921.87

10324.28

128, 2048

52291.78

41164.73

7996.93

10911.86

128, 4096

39513.73

27912.48

5736.09

7666.51

500, 2000

43818.99

34489.34

6914.68

8456.21

1000, 1000

33580.9

27784.74

5251.49

7122.84

2048, 128

5467.62

5234.98

827.62

1237.62

2048, 2048

24980.93

19432.08

3935.32

5222.98

5000, 500

7084.94

6401.56

1092.88

1500.55

20000, 2000

4236.84

3303.83

682.48

829.59

8

128, 128

53212.55

50849.55

6740.84

17043.54

128, 2048

68608.45

61607.7

10393.3

20277.88

128, 4096

54827.78

48280.37

8472.35

15282.89

500, 2000

58706.39

52583.65

8660.71

17184.24

1000, 1000

44705.48

40631.71

5947.72

12851.44

2048, 128

7554.38

6988.18

811.96

2165.52

2048, 2048

36193.64

30983.35

5136.98

9809.76

5000, 500

10271.8

9210.11

1153.76

2761.28

20000, 2000

6835.53

5602.43

918.95

1592.53

Mixtral 8x22B

8

128, 128

22948.57

21876.08

6381.95

128, 2048

32415.81

25150.03

6685.99

128, 4096

25753.14

18387.4

4789.13

500, 2000

27429.6

21421.86

5648.46

1000, 1000

19712.35

16573.24

4549.46

2048, 128

2899.84

2794.97

761.56

2048, 2048

15798.59

12244.93

3521.98

5000, 500

4031.79

3645.27

959.14

20000, 2000

2815.76

2227.63

575.02

TP 代表张量并行性

重现基准测试结果#

[!NOTE] 此工作流程中仅支持上表中列出的模型。

下表是基准测试过程中使用的命令的参考。 有关此基准测试工作流程的更详细描述,请参阅 基准测试套件文档

命令#

对于 GH200 以外的系统#

阶段

描述

命令

数据集

创建合成数据集

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

构建

构建 TensorRT-LLM 引擎

trtllm-bench --model $model_name build --tp_size $tp_size --pp_size $pp_size --quantization FP8 --dataset $dataset_file

运行

使用数据集运行基准测试

trtllm-bench --model $model_name throughput --dataset $dataset_file --engine_dir $engine_dir

仅适用于 GH200 系统#

对于版本 v0.17,在 GH200 系统上,建议使用基于 gptManagerBenchmark 的传统流程来衡量性能。

阶段

描述

命令

数据集

创建用于引擎构建的合成数据集

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

构建

构建 TensorRT-LLM 引擎

trtllm-bench --model $model_name build --tp_size $tp_size --quantization FP8 --dataset $dataset_file

数据集

创建用于 json 格式基准测试的合成数据集

python benchmarks/cpp/prepare_dataset.py --output=$dataset_file_json --tokenizer=$model_name token-norm-dist --num-requests=$num_requests --input-mean=$isl --output-mean=$osl --input-stdev=0 --output-stdev=0

运行

使用 json 格式的数据集运行基准测试

/app/tensorrt_llm/benchmarks/cpp/gptManagerBenchmark --engine_dir $engine_dir --type IFB --api executor --dataset $dataset_file_json --eos_id -1 --log_iteration_data --scheduler_policy guaranteed_no_evict --kv_cache_free_gpu_mem_fraction 0.95 --output_csv result.csv --request_rate -1.0 --enable_chunked_context --warm_up 0

变量#

名称

描述

$isl

基准测试输入序列长度。

$osl

基准测试输出序列长度。

$tp_size

用于运行基准测试的张量并行映射度

$pp_size

用于运行基准测试的流水线并行映射度

$engine_dir

用于存储构建的引擎文件的位置(运行基准测试后可以删除)。

$model_name

HuggingFace 模型名称,例如 meta-llama/Llama-2-7b-hf,或使用本地权重目录的路径

$dataset_file

prepare_dataset.py 生成的数据集文件的位置

$num_requests

要为数据集生成生成的请求数

$seq_len

ISL + OSL 的序列长度

准备数据集#

为了准备数据集,您可以使用提供的 脚本。 要生成合成数据集,请运行以下命令

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

该命令将生成一个文本文件,位于指定的 $dataset_file 路径,其中所有请求都具有相同的输入/输出序列长度组合。 该脚本通过使用 tokenizer 来检索词汇表大小,并从中随机抽取令牌 ID 来创建完全随机的序列。 在上面的命令中,所有请求都将是统一的,因为输入和输出序列的标准偏差都设置为 0。

对于每个输入和输出序列长度组合,下表详细说明了使用的 $num_requests。 对于较短的输入和输出长度,使用了更多的消息来保证系统达到稳定状态,因为请求以更快的速率进入和退出系统。 对于较长的输入/输出序列长度,请求在系统中停留的时间更长,因此需要更少的请求才能达到稳定状态。

输入长度

输出长度

$seq_len

$num_requests

128

128

256

30000

128

2048

2176

3000

128

4096

4224

1500

2048

128

2176

3000

2048

2048

4096

1500

5000

500

5500

1500

1000

1000

2000

3000

500

2000

2500

3000

20000

2000

22000

1000

引擎构建#

所有引擎都是使用 trtllm-bench build 子命令构建的。FP8 量化引擎的基本命令如下:

trtllm-bench --model $model_name build --tp_size $tp_size --pp_size $pp_size --quantization FP8 --dataset $dataset_file

在 build 子命令中提供 --dataset 时,trtllm-bench build 使用数据集的高级统计信息(平均 ISL/OSL、最大序列长度)和调整启发法来优化引擎构建设置。

或者,如果您想使用特定设置构建引擎,可以通过指定 max_batch_sizemax_num_tokens 的值来实现。

trtllm-bench --model $model_name build --tp_size $tp_size --pp_size $pp_size --quantization FP8 --max_seq_len $seq_len --max_batch_size $max_bs --max_num_tokens $max_token

如果您想构建没有量化的 FP16 引擎,只需删除 --quantization FP8 选项。如果使用预量化权重(例如,来自 HuggingFace 的 nvidia/Llama-3.1-70B-Instruct-FP8),请将 --quantization 参数设置为模型 dtype,以确保 KV Cache 设置为相应的 dtype。

[!NOTE] 如果您指定 FP8 量化,KV 缓存也将自动设置为 FP8!

trtllm-bench build 子命令将在成功构建后输出引擎所在的路径。例如:

===========================================================
ENGINE SAVED: /tmp/meta-llama/Llama-2-7b-hf/tp_1_pp_1
===========================================================

运行基准测试#

对于非 GH200 系统#

要使用生成的数据集运行基准测试,只需使用 trtllm-bench throughput 子命令。 该基准测试器将运行离线最大吞吐量场景,以便所有请求都以快速连续的方式排队。 您只需从 构建 阶段提供引擎的补丁,并提供一个生成的数据集

trtllm-bench --model $model_name throughput --dataset $dataset_file --engine_dir $engine_dir

在大多数情况下,我们还通过在基准测试命令中设置 --kv_cache_free_gpu_mem_fraction 0.95 来使用更高的 KV 缓存百分比。这使我们能够获得比默认设置 0.90 更好的性能。 如果遇到内存不足的问题,我们会回退到 0.90

结果将在基准测试完成后打印到终端。例如:

===========================================================
= ENGINE DETAILS
===========================================================
Model:                  meta-llama/Llama-2-7b-hf
Engine Directory:       /tmp/meta-llama/Llama-2-7b-hf/tp_1_pp_1
TensorRT-LLM Version:   0.12.0
Dtype:                  float16
KV Cache Dtype:         FP8
Quantization:           FP8
Max Input Length:       2048
Max Sequence Length:    4098

===========================================================
= WORLD + RUNTIME INFORMATION
===========================================================
TP Size:                1
PP Size:                1
Max Runtime Batch Size: 4096
Max Runtime Tokens:     8192
Scheduling Policy:      Guaranteed No Evict
KV Memory Percentage:   99.0%
Issue Rate (req/sec):   3.680275266452667e+18
===========================================================
= STATISTICS
===========================================================
Number of requests:             3000
Average Input Length (tokens):  128.0
Average Output Length (tokens): 128.0
Token Throughput (tokens/sec):  23405.927228471104
Request Throughput (req/sec):   182.8588064724305
Total Latency (seconds):        16.406100739
===========================================================

[!WARNING] 在某些情况下,基准测试器可能根本不打印任何内容。此行为通常意味着基准测试已遇到内存不足的问题。尝试使用 --kv_cache_free_gpu_mem_fraction 选项降低 KV 缓存百分比,以降低已用内存的百分比。

在线服务测量#

TensorRT-LLM 后端 用于测量 TensorRT-LLM 在线服务的性能。

下表显示了服务场景下的吞吐量和延迟。

下表中所有数据均使用 0.14.0 版本生成,包含 500 个请求和 BF16 精度。

模型

GPU

TP

输入长度

输出长度

QPS

Tput(req/s)

Mean TTFT(ms)

Mean ITL(ms)

Total Token Tput (tok/s)

Output Tput (tok/s)

LLaMA 3.1 70B

H100 80GB HBM3

4

467

256

2

2

62

21

1406

498

4

4

68

24

2750

973

8

7

92

32

5256

1860

16

12

175

66

8941

3164

32

16

1229

86

11537

4083

INF

16

9123

85

11593

4103

467

16

2

2

53

18

844

28

4

4

58

20

1908

63

8

8

71

24

3795

126

16

16

109

38

7492

248

32

28

1197

482

13655

452

INF

28

9126

548

13719

454

202

214

2

2

48

20

780

401

4

4

51

22

1499

771

8

7

57

25

2702

1390

16

11

74

32

4364

2245

32

14

116

42

5837

3003

INF

16

4482

50

6725

3459

LLaMA 3.1 8B

1

467

256

2

2

23

8

1423

504

4

4

24

9

2624

929

8

8

26

9

5535

1959

16

15

30

11

10636

3765

32

26

50

19

19138

6774

INF

37

3335

39

26614

9420

467

16

2

2

19

7

956

32

4

4

20

7

1910

63

8

8

22

7

3808

126

16

16

24

8

7567

251

32

31

29

10

14894

493

INF

79

3280

193

38319

1269

202

214

2

2

19

7

809

416

4

4

20

8

1586

816

8

7

21

9

3047

1568

16

13

23

10

5597

2879

32

23

27

11

9381

4825

INF

39

1657

21

16117

8291

LLaMA 3.1 70B

H200 131GB HBM3

4

467

256

2

2

58

18

1411

499

4

4

63

20

2770

980

8

7

84

27

5328

1886

16

13

165

60

9224

3264

32

16

1279

83

11800

4176

INF

16

9222

83

11826

4185

467

16

2

2

50

15

956

32

4

4

55

16

1909

63

8

8

67

20

3799

126

16

16

103

33

7499

248

32

28

1259

485

13586

450

INF

29

9074

546

13792

457

202

214

2

2

43

17

793

408

4

4

46

18

1524

784

8

7

51

21

2796

1438

16

11

67

28

4639

2386

32

15

112

39

6288

3235

INF

17

4480

48

7230

3719

LLaMA 3.1 8B

H200 131GB HBM3

1

467

256

2

2

21

6

1425

504

4

4

23

7

2828

1001

8

8

24

7

5567

1971

16

15

27

9

10761

3809

32

27

44

16

19848

7025

INF

40

3237

36

28596

10121

467

16

2

2

18

5

956

32

4

4

19

6

1910

63

8

8

20

6

3810

126

16

16

22

7

7567

250

32

31

27

9

14927

494

INF

81

3227

190

39007

1291

202

214

2

2

17

6

812

418

4

4

18

6

1597

822

8

7

19

7

3088

1589

16

14

20

8

5771

2969

32

24

24

9

9931

5109

INF

43

1665

19

17861

9189

TP 代表张量并行性

TTFT 代表 Time To First Token(首个 Token 的时间)

ITL 代表 Inter Token Latency(Token 间延迟)

仅适用于 GH200 系统#

对于 v0.17 版本,在 GH200 系统上,建议使用 *gptManagerBenchmark* 来测量性能。吞吐量测量基于以下命令报告。

 /app/tensorrt_llm/benchmarks/cpp/gptManagerBenchmark  --engine_dir $engine_dir --type IFB --dataset $dataset_file_json --eos_id -1 --scheduler_policy guaranteed_no_evict --kv_cache_free_gpu_mem_fraction 0.95 --output_csv result.csv --request_rate -1.0 --enable_chunked_context --warm_up 0

该命令将运行 gptManagerBenchmark 二进制文件,该文件将报告吞吐量和其他指标,作为其输出的一部分,可以与本 README 的 吞吐量测量表进行比较。