TensorRT-LLM 基准测试#

重要

此基准测试套件正在开发中。 预计会有破坏性的 API 更改。

TensorRT-LLM 提供了 trtllm-bench CLI,这是一个打包的基准测试实用程序,旨在让用户更容易地重现我们官方发布的 性能概述trtllm-bench 提供以下功能

  • 一种简化的方式来构建针对各种模型和平台进行基准测试的调整引擎。

  • 完全使用 Python 工作流程进行基准测试。

  • 能够对 TensorRT-LLM 中的各种流程和特性进行基准测试。

trtllm-bench 使用 [in-flight batching] 执行所有基准测试 – 更多信息请参见 本节,其中更详细地描述了该概念。

基准测试之前#

对于需要一致且可重现结果的严格基准测试,正确的 GPU 配置至关重要。 这些设置有助于最大化 GPU 利用率,消除性能变化,并确保准确测量的最佳条件。 虽然对于正常运行不是严格要求的,但我们建议在进行性能比较或发布基准测试结果时应用这些配置。

持久模式#

确保启用持久模式以保持一致的 GPU 状态

sudo nvidia-smi -pm 1

GPU 时钟管理#

允许 GPU 根据工作负载和温度动态调整其时钟速度。 虽然将时钟锁定在最大频率可能看起来有益,但有时会导致热节流并降低性能。 使用以下命令重置 GPU 时钟

sudo nvidia-smi -rgc

设置功率限制#

首先查询最大功率限制

nvidia-smi -q -d POWER

然后配置 GPU 以最大功率限制运行,以获得一致的性能

sudo nvidia-smi -pl <max_power_limit>

Boost 设置#

GPU 可能支持 boost 级别。 首先查询可用的 boost 级别

sudo nvidia-smi boost-slider -l

如果支持,使用其中一个可用的级别启用 boost 滑块以获得最大性能

sudo nvidia-smi boost-slider --vboost <max_boost_slider>

吞吐量基准测试#

限制和注意事项#

经过验证的基准测试网络#

虽然 trtllm-bench 应该能够运行 TensorRT-LLM 支持的任何网络,但以下是经过广泛验证的列表,与 性能概述 页面上看到的列表相同。

提示

trtllm-bench 可以自动从 Hugging Face Model Hub 下载模型。 将你的 token 导出到 HF_TOKEN 环境变量中。

支持的量化模式#

trtllm-bench 支持以下量化模式

  • None(未应用量化)

  • FP8

  • NVFP4

有关量化的更多信息,请参阅 数值精度支持矩阵,其中列出了每个网络支持的量化方法。

提示

尽管 TensorRT-LLM 支持比上面列出的更多的量化模式,但 trtllm-bench 目前仅配置较小的子集。

快速入门#

本快速入门重点介绍在 meta-llama/Llama-3.1-8B 上使用合成数据集和 128:128 的均匀 ISL:OSL 分布的提示运行短的最大吞吐量基准测试。 要从头到尾运行基准测试,请运行以下命令

python benchmarks/cpp/prepare_dataset.py --stdout --tokenizer meta-llama/Llama-3.1-8B token-norm-dist --input-mean 128 --output-mean 128 --input-stdev 0 --output-stdev 0 --num-requests 3000 > /tmp/synthetic_128_128.txt
trtllm-bench --model meta-llama/Llama-3.1-8B build --dataset /tmp/synthetic_128_128.txt --quantization FP8
trtllm-bench --model meta-llama/Llama-3.1-8B throughput --dataset /tmp/synthetic_128_128.txt --engine_dir /tmp/meta-llama/Llama-3.1-8B/tp_1_pp_1

基准测试完成后,trtllm-bench 会打印包含摘要指标的摘要。

===========================================================
= ENGINE DETAILS
===========================================================
Model:                  meta-llama/Llama-3.1-8B
Engine Directory:       /tmp/meta-llama/Llama-3.1-8B/tp_1_pp_1
TensorRT-LLM Version:   0.17.0
Dtype:                  bfloat16
KV Cache Dtype:         FP8
Quantization:           FP8
Max Input Length:       256
Max Sequence Length:    256

===========================================================
= 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:   90.00%
Issue Rate (req/sec):   5.0689E+14

===========================================================
= PERFORMANCE OVERVIEW
===========================================================
Number of requests:             3000
Average Input Length (tokens):  128.0000
Average Output Length (tokens): 128.0000
Token Throughput (tokens/sec):  28390.4265
Request Throughput (req/sec):   221.8002
Total Latency (ms):             13525.6862

===========================================================

工作流程#

trtllm-bench 的工作流程由以下步骤组成

  1. 准备一个数据集来驱动 inflight batching 基准测试。

  2. 使用 trtllm-bench build 子命令构建基准测试引擎(PyTorch 流程不需要)。

  3. 使用 trtllm-bench throughput 子命令运行最大吞吐量基准测试,或使用 trtllm-bench latency 子命令运行低延迟基准测试。

准备数据集#

吞吐量基准测试使用固定的 JSON 模式来指定请求。 该模式定义如下

必需

类型

描述

task_id

Y

字符串

请求的唯一标识符。

prompt

N*

字符串

生成请求的输入文本。

input_ids

Y*

List[Integer]

构成请求提示的 logits 列表。

output_tokens

Y

整数

此请求生成的 tokens 数。

提示

* 需要指定 promptinput_ids。 但是,不能同时定义 prompts 和 logits (input_ids)。 如果指定 input_ids,则在请求生成时会忽略 prompt 条目。

请参考以下基准测试有效条目的示例

  • 带有可读提示且没有 logits 的条目。

    {"task_id": 1, "prompt": "Generate an infinite response to the following: This is the song that never ends, it goes on and on my friend.", "output_tokens": 1000}
    {"task_id": 2, "prompt": "Generate an infinite response to the following: Na, na, na, na", "output_tokens": 1000}
    
  • 包含 logits 的条目。

    {"task_id":0,"input_ids":[863,22056,25603,11943,8932,13195,3132,25032,21747,22213],"output_tokens":128}
    {"task_id":1,"input_ids":[14480,13598,15585,6591,1252,8259,30990,26778,7063,30065,21764,11023,1418],"output_tokens":128}
    

提示

在每行上指定每个条目。 为了简化数据传递,完整的 JSON 条目位于每行上,以便基准测试器可以简单地读取一行并假定为完整的条目。 创建数据集时,请确保每个完整的 JSON 条目都位于每一行上。

为了准备合成数据集,可以使用 benchmarks/cpp 目录中提供的脚本。 例如,要为 meta-llama/Llama-3.1-8B 生成具有 128/128 的统一 ISL/OSL 的 1000 个请求的合成数据集,请运行

benchmarks/cpp/prepare_dataset.py --stdout --tokenizer meta-llama/Llama-3.1-8B token-norm-dist --input-mean 128 --output-mean 128 --input-stdev 0 --output-stdev 0 --num-requests 1000 > /tmp/synthetic_128_128.txt

构建基准测试引擎#

默认构建行为#

trtllm-bench 命令行工具提供了 build 子命令,用于构建最大吞吐量基准测试的 TRT-LLM 引擎。要构建用于基准测试的引擎,您可以通过 --dataset 选项指定使用 prepare_dataset.py 生成的数据集。默认情况下,trtllm-bench 的调优启发式算法使用数据集的高级统计信息(平均 ISL/OSL,最大序列长度)来优化引擎构建设置。以下命令构建使用数据集 ISL/OSL 优化的 FP8 量化引擎。

trtllm-bench --model meta-llama/Llama-3.1-8B build --quantization FP8 --dataset /tmp/synthetic_128_128.txt

其他构建模式#

build 子命令还提供了其他构建引擎的方式,用户可以更好地控制调优值。

  • 使用自定义调优值构建引擎:您可以通过直接设置 --max_batch_size--max_num_tokens 来指定用于构建引擎的调优值。max_batch_sizemax_num_tokens 控制每次迭代中可以调度的最大请求数和令牌数。如果未指定任何值,则使用默认的 max_batch_sizemax_num_tokens20488192。以下命令通过指定引擎调优值来构建 FP8 量化引擎。

trtllm-bench --model meta-llama/Llama-3.1-8B build --quantization FP8 --max_seq_len 4096 --max_batch_size 1024 --max_num_tokens 2048
  • [实验性] 使用目标 ISL/OSL 构建引擎以进行优化:在此实验模式下,您可以向 trtllm-bench 的调优启发式算法提供提示,以优化特定 ISL 和 OSL 目标的引擎。通常,目标 ISL 和 OSL 与数据集的平均 ISL 和 OSL 对齐,但您可以尝试使用不同的值来使用此模式优化引擎。以下命令构建 FP8 量化引擎,并针对 128:128 的 ISL:OSL 目标进行优化。

trtllm-bench --model meta-llama/Llama-3.1-8B build --quantization FP8 --max_seq_len 4096 --target_isl 128 --target_osl 128

并行映射支持#

trtllm-bench build 子命令支持张量并行 (TP) 和流水线并行 (PP) 映射的组合,只要世界大小 (tp_size x pp_size) <= 8。build 子命令中的并行映射由 --tp_size--pp_size 选项控制。以下命令构建具有 TP2-PP2 映射的引擎。

trtllm-bench --model meta-llama/Llama-3.1-8B build --quantization FP8 --dataset /tmp/synthetic_128_128.txt --tp_size 2 --pp_size 2

Build 子命令输出示例:#

build 子命令的输出看起来类似于下面的代码片段(对于 meta-llama/Llama-3.1-8B

user@387b12598a9e:/scratch/code/trt-llm/tekit_2025$ trtllm-bench --model meta-llama/Llama-3.1-8B build --dataset /tmp/synthetic_128_128.txt --quantization FP8
[TensorRT-LLM] TensorRT-LLM version: 0.17.0
[01/18/2025-00:55:14] [TRT-LLM] [I] Found dataset.
[01/18/2025-00:55:14] [TRT-LLM] [I]
===========================================================
= DATASET DETAILS
===========================================================
Max Input Sequence Length:      128
Max Output Sequence Length:     128
Max Sequence Length:    256
Target (Average) Input Sequence Length: 128
Target (Average) Output Sequence Length:        128
Number of Sequences:    3000
===========================================================


[01/18/2025-00:55:14] [TRT-LLM] [I] Max batch size and max num tokens are not provided, use tuning heuristics or pre-defined setting from trtllm-bench.
[01/18/2025-00:55:14] [TRT-LLM] [I] Estimated total available memory for KV cache: 132.37 GB
[01/18/2025-00:55:14] [TRT-LLM] [I] Estimated total KV cache memory: 125.75 GB
[01/18/2025-00:55:14] [TRT-LLM] [I] Estimated max number of requests in KV cache memory: 8048.16
[01/18/2025-00:55:14] [TRT-LLM] [I] Estimated max batch size (after fine-tune): 4096
[01/18/2025-00:55:14] [TRT-LLM] [I] Estimated max num tokens (after fine-tune): 8192
[01/18/2025-00:55:14] [TRT-LLM] [I] Set dtype to bfloat16.
[01/18/2025-00:55:14] [TRT-LLM] [I] Set multiple_profiles to True.
[01/18/2025-00:55:14] [TRT-LLM] [I] Set use_paged_context_fmha to True.
[01/18/2025-00:55:14] [TRT-LLM] [I] Set use_fp8_context_fmha to True.
[01/18/2025-00:55:14] [TRT-LLM] [I]
===========================================================
= ENGINE BUILD INFO
===========================================================
Model Name:             meta-llama/Llama-3.1-8B
Model Path:             None
Workspace Directory:    /tmp
Engine Directory:       /tmp/meta-llama/Llama-3.1-8B/tp_1_pp_1

===========================================================
= ENGINE CONFIGURATION DETAILS
===========================================================
Max Sequence Length:            256
Max Batch Size:                 4096
Max Num Tokens:                 8192
Quantization:                   FP8
KV Cache Dtype:                 FP8
===========================================================

Loading Model: [1/3]    Downloading HF model
Downloaded model to /data/models--meta-llama--Llama-3.1-8B/snapshots/d04e592bb4f6aa9cfee91e2e20afa771667e1d4b
Time: 0.321s
Loading Model: [2/3]    Loading HF model to memory
Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████| 4/4 [00:59<00:00, 14.79s/it]
Generating train split: 100%|████████████████████████████████████████████████████████████████████████████████████| 287113/287113 [00:06<00:00, 41375.57 examples/s]
Generating validation split: 100%|█████████████████████████████████████████████████████████████████████████████████| 13368/13368 [00:00<00:00, 41020.63 examples/s]
Generating test split: 100%|███████████████████████████████████████████████████████████████████████████████████████| 11490/11490 [00:00<00:00, 41607.11 examples/s]
Inserted 675 quantizers
/usr/local/lib/python3.12/dist-packages/modelopt/torch/quantization/model_quant.py:71: DeprecationWarning: forward_loop should take model as argument, but got forward_loop without any arguments. This usage will be deprecated in future versions.
  warnings.warn(
Disable lm_head quantization for TRT-LLM export due to deployment limitations.
current rank: 0, tp rank: 0, pp rank: 0
Time: 122.568s
Loading Model: [3/3]    Building TRT-LLM engine
/usr/local/lib/python3.12/dist-packages/tensorrt/__init__.py:85: DeprecationWarning: Context managers for TensorRT types are deprecated. Memory will be freed automatically when the reference count reaches 0.
  warnings.warn(
Time: 53.820s
Loading model done.
Total latency: 176.709s

<snip verbose logging>

===========================================================
ENGINE SAVED: /tmp/meta-llama/Llama-3.1-8B/tp_1_pp_1
===========================================================

在这种情况下,引擎将被写入 /tmp/meta-llama/Llama-3.1-8B/tp_1_pp_1(日志的结尾)。

最大吞吐量基准测试#

trtllm-bench 命令行工具提供了一个最大吞吐量基准测试,可以通过 throughput 子命令访问。此基准测试在最大负载下测试 TensorRT-LLM 引擎或 PyTorch 后端,以提供吞吐量上限。

基准测试器的工作原理#

基准测试器读取一个数据文件,其中单行包含一个完整的 JSON 请求条目,如 准备数据集 中指定的那样。基准测试器过程如下

  1. 迭代所有输入请求。如果指定了 logits,则使用指定的 logits 列表构造请求。否则,使用 --model $HF_MODEL_NAME 指定的方式对 prompt 进行令牌化。

  2. 以尽可能快的速度(离线模式)将数据集提交到 TensorRT-LLM Executor API。

  3. 等待所有请求返回,计算统计信息,然后报告结果。

要运行基准测试器,请使用从先前步骤生成的 引擎数据集 运行以下命令

trtllm-bench --model meta-llama/Llama-3.1-8B throughput --dataset /tmp/synthetic_128_128.txt --engine_dir /tmp/meta-llama/Llama-3.1-8B/tp_1_pp_1
[TensorRT-LLM] TensorRT-LLM version: 0.17.0
[01/18/2025-01:01:13] [TRT-LLM] [I] Preparing to run throughput benchmark...
[01/18/2025-01:01:13] [TRT-LLM] [I] Setting up throughput benchmark.

<snip verbose logging>

[01/18/2025-01:01:26] [TRT-LLM] [I] Setting up for warmup...
[01/18/2025-01:01:26] [TRT-LLM] [I] Running warmup.
[01/18/2025-01:01:26] [TRT-LLM] [I] Starting benchmarking async task.
[01/18/2025-01:01:26] [TRT-LLM] [I] Starting benchmark...
[01/18/2025-01:01:26] [TRT-LLM] [I] Request submission complete. [count=2, time=0.0000s, rate=121847.20 req/s]
[01/18/2025-01:01:28] [TRT-LLM] [I] Benchmark complete.
[01/18/2025-01:01:28] [TRT-LLM] [I] Stopping LLM backend.
[01/18/2025-01:01:28] [TRT-LLM] [I] Cancelling all 0 tasks to complete.
[01/18/2025-01:01:28] [TRT-LLM] [I] All tasks cancelled.
[01/18/2025-01:01:28] [TRT-LLM] [I] LLM Backend stopped.
[01/18/2025-01:01:28] [TRT-LLM] [I] Warmup done.
[01/18/2025-01:01:28] [TRT-LLM] [I] Starting benchmarking async task.
[01/18/2025-01:01:28] [TRT-LLM] [I] Starting benchmark...
[01/18/2025-01:01:28] [TRT-LLM] [I] Request submission complete. [count=3000, time=0.0012s, rate=2590780.97 req/s]
[01/18/2025-01:01:42] [TRT-LLM] [I] Benchmark complete.
[01/18/2025-01:01:42] [TRT-LLM] [I] Stopping LLM backend.
[01/18/2025-01:01:42] [TRT-LLM] [I] Cancelling all 0 tasks to complete.
[01/18/2025-01:01:42] [TRT-LLM] [I] All tasks cancelled.
[01/18/2025-01:01:42] [TRT-LLM] [I] LLM Backend stopped.
[01/18/2025-01:01:42] [TRT-LLM] [I]

===========================================================
= ENGINE DETAILS
===========================================================
Model:                  meta-llama/Llama-3.1-8B
Engine Directory:       /tmp/meta-llama/Llama-3.1-8B/tp_1_pp_1
TensorRT-LLM Version:   0.17.0
Dtype:                  bfloat16
KV Cache Dtype:         FP8
Quantization:           FP8
Max Input Length:       256
Max Sequence Length:    256

===========================================================
= 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:   90.00%
Issue Rate (req/sec):   5.0689E+14

===========================================================
= PERFORMANCE OVERVIEW
===========================================================
Number of requests:             3000
Average Input Length (tokens):  128.0000
Average Output Length (tokens): 128.0000
Token Throughput (tokens/sec):  28390.4265
Request Throughput (req/sec):   221.8002
Total Latency (ms):             13525.6862

===========================================================

[01/18/2025-01:01:42] [TRT-LLM] [I] Thread proxy_dispatch_result_thread stopped.
[TensorRT-LLM][INFO] Refreshed the MPI local session

使用 PyTorch 工作流程运行#

要对 PyTorch 后端 (tensorrt_llm._torch) 进行基准测试,请使用从先前步骤生成的 数据集 运行以下命令。对于 PyTorch 流程,您无需运行 trtllm-bench buildthroughput 基准测试通过针对通过 --dataset 提供的数据集(或 上面 描述的其他构建模式设置)进行调优来初始化后端。请注意,默认情况下启用 CUDA 图。您可以使用 --extra_llm_api_options 后跟 YAML 文件的路径来添加其他 pytorch 配置。有关更多详细信息,请通过使用 --help 运行命令来参考帮助文本。

提示

以下命令指定 --model_path 选项。模型路径是可选的,仅当您要运行本地存储的检查点时才使用。当使用 --model_path 时,仍然需要 --model 以用于报告原因和查找构建启发式的参数。

trtllm-bench --model meta-llama/Llama-3.1-8B --model_path /Ckpt/Path/To/Llama-3.1-8B throughput --dataset /tmp/synthetic_128_128.txt --backend pytorch

# Example output
<snip verbose logging>
===========================================================
= PyTorch backend
===========================================================
Model:                  meta-llama/Llama-3.1-8B
Model Path:             /Ckpt/Path/To/Llama-3.1-8B
TensorRT-LLM Version:   0.17.0
Dtype:                  bfloat16
KV Cache Dtype:         None
Quantization:           FP8

===========================================================
= WORLD + RUNTIME INFORMATION
===========================================================
TP Size:                1
PP Size:                1
Max Runtime Batch Size: 2048
Max Runtime Tokens:     4096
Scheduling Policy:      Guaranteed No Evict
KV Memory Percentage:   90.00%
Issue Rate (req/sec):   7.6753E+14

===========================================================
= PERFORMANCE OVERVIEW
===========================================================
Number of requests:             3000
Average Input Length (tokens):  128.0000
Average Output Length (tokens): 128.0000
Token Throughput (tokens/sec):  20685.5510
Request Throughput (req/sec):   161.6059
Total Latency (ms):             18563.6825

在 PyTorch 工作流程中运行多模态模型#

要使用 PyTorch 工作流程对多模态模型进行基准测试,您可以按照与上述类似的方法。

首先,准备数据集

python ./benchmarks/cpp/prepare_dataset.py \
  --tokenizer Qwen/Qwen2-VL-2B-Instruct \
  --stdout \
  dataset \
  --dataset-name lmms-lab/MMMU \
  --dataset-split test \
  --dataset-image-key image \
  --dataset-prompt-key question \
  --num-requests 10 \
  --output-len-dist 128,5 > mm_data.jsonl

它会将媒体文件下载到 /tmp 目录并准备包含其路径的数据集。请注意,prompt 字段是文本,而不是令牌化 ID。这是因为 prompt 和媒体(图像/视频)由多模态文件的预处理器处理。

多模态的示例数据集

{"task_id":0,"prompt":"Brahma Industries sells vinyl replacement windows to home improvement retailers nationwide. The national sales manager believes that if they invest an additional $25,000 in advertising, they would increase sales volume by 10,000 units. <image 1> What is the total contribution margin?","media_paths":["/tmp/tmp9so41y3r.jpg"],"output_tokens":126}
{"task_id":1,"prompt":"Let us compute for the missing amounts under work in process inventory, what is the cost of goods manufactured? <image 1>","media_paths":["/tmp/tmpowsrb_f4.jpg"],"output_tokens":119}
{"task_id":2,"prompt":"Tsuji is reviewing the price of a 3-month Japanese yen/U.S. dollar currency futures contract, using the currency and interest rate data shown below. Because the 3-month Japanese interest rate has just increased to .50%, Itsuji recognizes that an arbitrage opportunity exists nd decides to borrow $1 million U.S. dollars to purchase Japanese yen. Calculate the yen arbitrage profit from Itsuji's strategy, using the following data: <image 1> ","media_paths":["/tmp/tmpxhdvasex.jpg"],"output_tokens":126}
...

运行基准测试

trtllm-bench --model Qwen/Qwen2-VL-2B-Instruct \
  throughput \
  --dataset mm_data.jsonl \
  --backend pytorch \
  --num_requests 10 \
  --max_batch_size 4 \
  --modality image

示例输出

===========================================================
= REQUEST DETAILS
===========================================================
Number of requests:             10
Number of concurrent requests:  5.3019
Average Input Length (tokens):  411.6000
Average Output Length (tokens): 128.7000
===========================================================
= WORLD + RUNTIME INFORMATION
===========================================================
TP Size:                1
PP Size:                1
EP Size:                None
Max Runtime Batch Size: 4
Max Runtime Tokens:     12288
Scheduling Policy:      GUARANTEED_NO_EVICT
KV Memory Percentage:   90.00%
Issue Rate (req/sec):   1.4117E+17

===========================================================
= PERFORMANCE OVERVIEW
===========================================================
Request Throughput (req/sec):                     1.4439
Total Output Throughput (tokens/sec):             185.8351
Per User Output Throughput (tokens/sec/user):     38.1959
Per GPU Output Throughput (tokens/sec/gpu):       185.8351
Total Token Throughput (tokens/sec):              780.1607
Total Latency (ms):                               6925.4963
Average request latency (ms):                     3671.8441

-- Request Latency Breakdown (ms) -----------------------

[Latency] P50    : 3936.3022
[Latency] P90    : 5514.4701
[Latency] P95    : 5514.4701
[Latency] P99    : 5514.4701
[Latency] MINIMUM: 2397.1047
[Latency] MAXIMUM: 5514.4701
[Latency] AVERAGE: 3671.8441

===========================================================
= DATASET DETAILS
===========================================================
Dataset Path:         /workspaces/tensorrt_llm/mm_data.jsonl
Number of Sequences:  10

-- Percentiles statistics ---------------------------------

        Input              Output           Seq. Length
-----------------------------------------------------------
MIN:   167.0000           119.0000           300.0000
MAX:  1059.0000           137.0000          1178.0000
AVG:   411.6000           128.7000           540.3000
P50:   299.0000           128.0000           427.0000
P90:  1059.0000           137.0000          1178.0000
P95:  1059.0000           137.0000          1178.0000
P99:  1059.0000           137.0000          1178.0000
===========================================================

注意事项和限制:

  • 目前仅支持图像数据集。

  • --output-len-dist 是多模态数据集的必需参数。

  • 令牌化器在准备步骤中未使用,但它仍然是必需参数。

  • 由于图像在模型运行时会转换为令牌,因此 trtllm-bench 在设置执行设置时,对最大输入序列长度使用默认的大值。您还可以通过使用适合您用例的标志 --max_input_len 指定不同的值来修改该行为。

PyTorch 流程中的量化#

为了使用 PyTorch 流程通过 trtllm-bench 运行量化运行,您需要使用预量化的检查点。为了使用 PyTorch 流程通过 trtllm-bench 运行量化基准测试,您需要使用预量化的检查点。对于 Llama-3.1 模型,TensorRT-LLM 通过 HuggingFace 提供以下检查点

trtllm-bench 利用上述预量化检查点中存在的 hf_quant_config.json 文件。该配置文件存在于使用 TensorRT 模型优化器 量化的检查点中,并描述了使用其编译的计算和 KV 缓存量化。例如,从上面的检查点

{
    "producer": {
        "name": "modelopt",
        "version": "0.23.0rc1"
    },
    "quantization": {
        "quant_algo": "FP8",
        "kv_cache_quant_algo": null
    }

上面的检查点被量化为以 FP8 的计算精度运行,并且默认为不进行 KV 缓存量化(完整的 FP16 缓存)。当运行 trtllm-bench throughput 时。如果 kv_cache_quant_algo 指定为 null,则基准测试将自动选择最适合检查点计算精度的 KV 缓存量化,否则它将被强制匹配指定的非空 KV 缓存量化。以下是当检查点未指定 KV 缓存量化算法时,trtllm-bench 将遵循的映射

检查点计算量化

检查点 KV 缓存量化

trtllm-bench

注意

null

null

null

在这种情况下,量化配置不存在。

FP8

FP8

FP8

与检查点匹配

FP8

null

FP8

通过基准测试设置为 FP8

NVFP4

null

FP8

通过基准测试设置为 FP8

如果您想强制 KV 缓存量化,您可以在 YAML 文件中指定以下内容,以便在检查点精度为 null 时强制精度

pytorch_backend_config:
  kv_cache_dtype: "fp8"

提示

kv_cache_dtype 的两个有效值为 autofp8

低延迟基准测试#

低延迟基准测试遵循与 吞吐量基准测试 类似的工作流程,但需要从 trtllm-bench 单独构建引擎。低延迟基准测试具有以下模式

  • 单请求低延迟引擎

  • 启用 Medusa 的推测解码引擎

适用于 Llama-3 70B 的低延迟 TensorRT-LLM 引擎#

要为延迟基准测试构建一个低延迟引擎,请运行以下量化和构建命令。$checkpoint_dir 是指向 meta-llama/Meta-Llama-3-70B Hugging Face 检查点的路径,该检查点位于您的缓存中,或者使用 huggingface-cli 下载到特定位置。 要准备数据集,请按照 准备数据集 中指定的相同流程进行操作。

对非 Medusa 低延迟引擎进行基准测试#

量化检查点

cd tensorrt_llm/examples/llama
python ../quantization/quantize.py \
    --model_dir $checkpoint_dir \
    --dtype bfloat16 \
    --qformat fp8 \
    --kv_cache_dtype fp8 \
    --output_dir /tmp/meta-llama/Meta-Llama-3-70B/checkpoint \
    --calib_size 512 \
    --tp_size $tp_size

然后构建,

trtllm-build \
    --checkpoint_dir /tmp/meta-llama/Meta-Llama-3-70B/checkpoint \
    --use_fused_mlp enable \
    --gpt_attention_plugin bfloat16 \
    --output_dir /tmp/meta-llama/Meta-Llama-3-70B/engine \
    --max_batch_size 1 \
    --max_seq_len $(($isl+$osl)) \
    --reduce_fusion enable \
    --gemm_plugin fp8 \
    --workers $tp_size \
    --use_fp8_context_fmha enable \
    --max_num_tokens $isl \
    --use_paged_context_fmha disable \
    --multiple_profiles enable

引擎构建完成后,运行低延迟基准测试

env TRTLLM_ENABLE_MMHA_MULTI_BLOCK_DEBUG=1 \
  TRTLLM_MMHA_KERNEL_BLOCK_SIZE=256 \
  TRTLLM_MMHA_BLOCKS_PER_SEQUENCE=32 \
  FORCE_MULTI_BLOCK_MODE=ON \
  TRTLLM_ENABLE_PDL=1 \
  trtllm-bench --model meta-llama/Meta-Llama-3-70B \
  latency \
  --dataset $DATASET_PATH \
  --engine_dir /tmp/meta-llama/Meta-Llama-3-70B/engine

构建 Medusa 低延迟引擎#

要构建支持 Medusa 的引擎,需要包含 Medusa 头部的检查点。 NVIDIA 在 Hugging Face 的 NVIDIA 页面上提供了 TensorRT-LLM 检查点。 这些检查点是预量化的,可以使用 huggingface-cli 下载后直接构建。 下载检查点后,运行以下命令。 请确保指定您的 Medusa 检查点支持的 $tp_size 及其存储位置 $checkpoint_dir 的路径。 此外,$max_seq_len 应设置为模型的最大位置嵌入。

以 Llama-3.1 70B 为例,对于张量并行 8 和 bfloat16 数据类型

tp_size=8
max_seq_len=131072
trtllm-build --checkpoint_dir $checkpoint_dir \
    --speculative_decoding_mode medusa \
    --max_batch_size 1 \
    --gpt_attention_plugin bfloat16 \
    --max_seq_len $max_seq_len \
    --output_dir /tmp/meta-llama/Meta-Llama-3.1-70B/medusa/engine \
    --use_fused_mlp enable \
    --paged_kv_cache enable \
    --use_paged_context_fmha disable \
    --multiple_profiles enable \
    --reduce_fusion enable \
    --use_fp8_context_fmha enable \
    --workers $tp_size \
    --low_latency_gemm_plugin fp8

引擎构建完成后,您需要定义 Medusa 选择。 这些选择是用 YAML 文件指定的,如下面的示例 (medusa.yaml)

- [0]
- [0, 0]
- [1]
- [0, 1]
- [2]
- [0, 0, 0]
- [1, 0]
- [0, 2]
- [3]
- [0, 3]
- [4]
- [0, 4]
- [2, 0]
- [0, 5]
- [0, 0, 1]

要运行支持 Medusa 的引擎,请运行以下命令

env TRTLLM_ENABLE_PDL=1 \
  UB_ONESHOT=1 \
  UB_TP_SIZE=$tp_size \
  TRTLLM_ENABLE_PDL=1 \
  TRTLLM_PDL_OVERLAP_RATIO=0.15 \
  TRTLLM_PREFETCH_RATIO=-1 \
  trtllm-bench --model meta-llama/Meta-Llama-3-70B \
  latency \
  --dataset $DATASET_PATH \
  --engine_dir /tmp/meta-llama/Meta-Llama-3-70B/medusa/engine \
  --medusa_choices medusa.yml

总结#

下表总结了运行基准测试所需的命令

场景

阶段

命令

数据集

准备

python benchmarks/cpp/prepare_dataset.py --stdout --tokenizer $HF_MODEL token-norm-dist --input-mean $ISL --output-mean $OSL --input-stdev 0 --output-stdev 0 --num-requests $NUM_REQUESTS > $DATASET_PATH

吞吐量

构建

trtllm-bench --model $HF_MODEL build --dataset $DATASET_PATH

吞吐量

基准测试

trtllm-bench --model $HF_MODEL throughput --dataset $DATASET_PATH --engine_dir $ENGINE_DIR

延迟

构建

请参阅 有关构建 Llama-3 70B 低延迟引擎的部分

非 Medusa 延迟

基准测试

trtllm-bench --model $HF_MODEL latency --dataset $DATASET_PATH --engine_dir $ENGINE_DIR

Medusa 延迟

基准测试

trtllm-bench --model $HF_MODEL latency --dataset $DATASET_PATH --engine_dir $ENGINE_DIR --medusa_choices $MEDUSA_CHOICES

其中,

$HF_MODEL

模型的 Hugging Face 名称。

$NUM_REQUESTS

要生成的请求数。

$DATASET_PATH

准备数据集时写入数据集的路径。

$ENGINE_DIR

trtllm-bench build 打印的引擎目录。

$MEDUSA_CHOICES

表示基准测试的 Medusa 树的 YAML 配置文件。