TensorRT-LLM 基准测试

重要

这个基准测试套件正在进行中。 预计会有破坏性的API更改。

TensorRT-LLM 提供了 trtllm-bench CLI,一个打包的基准测试工具。

支持的基准测试网络

trtllm-bench CLI 工具可以自动从 Hugging Face 模型中心下载模型。 请在 HF_TOKEN 环境变量中导出您的令牌。

支持量化模式

TensorRT-LLM 支持多种量化模式:

  • 无(未应用量化)

  • W8A16

  • W4A16

  • W4A16_AWQ

  • W4A8_AWQ

  • W4A16_GPTQ

  • FP8

  • INT8

有关量化的更多信息,请参阅数值精度以及每个网络支持的量化方法的支持矩阵

使用数据集进行飞行中的基准测试

本节介绍如何使用动态批处理对TensorRT-LLM进行基准测试。

快速入门

本快速入门指南重点介绍如何在具有128:128的ISL:OSL的均匀分布提示的合成数据集上运行meta-llama/Llama-2-7b-hf的短时间最大吞吐量基准测试。 要从头到尾运行基准测试,请运行以下命令:

python benchmarks/cpp/prepare_dataset.py --stdout --tokenizer meta-llama/Llama-2-7b-hf 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-2-7b-hf build --dataset /tmp/synthetic_128_128.txt --quantization FP8
trtllm-bench --model meta-llama/Llama-2-7b-hf throughput --dataset /tmp/synthetic_128_128.txt --engine_dir /tmp/meta-llama/Llama-2-7b-hf/tp_1_pp_1

就是这样! 基准测试完成后,trtllm-bench 会打印一个包含摘要指标的摘要。

===========================================================
= 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
===========================================================

工作流程

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

  1. 准备一个数据集以驱动飞行中的批处理基准测试。

  2. 使用trtllm-bench build子命令构建基准引擎。

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

准备数据集

飞行中的基准测试使用固定的JSON模式,以便简单直接地指定请求。该模式定义如下:

必填

类型

描述

task_id

Y

字符串

请求的唯一标识符。

prompt

N*

字符串

生成请求的输入文本。

logits

N*

整数列表

构成请求提示的logits列表。

output_tokens

Y

整数

此请求生成的令牌数量。

提示和逻辑是互斥的,但需要其中一个promptlogits。 如果您指定logits,则在生成请求时将忽略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,"logits":[863,22056,25603,11943,8932,13195,3132,25032,21747,22213],"output_tokens":128}
    {"task_id":1,"logits":[14480,13598,15585,6591,1252,8259,30990,26778,7063,30065,21764,11023,1418],"output_tokens":128}
    

提示

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

使用 prepare_dataset.py 创建合成数据集

为了准备一个合成数据集,你可以使用benchmarks/cpp目录中提供的脚本。例如,要为Llama-2-7b生成一个包含1000个请求的合成数据集,且ISL/OSL均匀为128/128,只需运行:

benchmarks/cpp/prepare_dataset.py --stdout --tokenizer meta-llama/Llama-2-7b-hf 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 CLI 工具提供了 build 子命令,用于构建 TRT-LLM 引擎以进行最大吞吐量基准测试。

如何构建引擎

要构建一个用于基准测试的引擎,您可以通过--dataset选项指定由prepare_dataset.py生成的数据集。 trtllm-bench的调优启发式方法使用数据集的高级统计信息(平均ISL/OSL,最大序列长度)来优化引擎构建设置。 以下命令构建了一个使用数据集的ISL/OSL优化的FP8量化引擎。

trtllm-bench --model meta-llama/Llama-2-7b-hf build --quantization FP8 --dataset /tmp/synthetic_128_128.txt

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

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

trtllm-bench --model meta-llama/Llama-2-7b-hf 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量化引擎,并针对ISL:OSL目标为128:128进行优化。

trtllm-bench --model meta-llama/Llama-2-7b-hf build --quantization FP8 --max_seq_len 4096 --target_isl 128 --target_osl 128

并行映射支持

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

trtllm-bench --model meta-llama/Llama-2-7b-hf build --quantization FP8 --dataset /tmp/synthetic_128_128.txt --tp_size 2 --pp_size 2

构建子命令输出示例:

build 子命令的输出看起来类似于下面的代码片段(对于 meta-llama/Llama-2-7b-hf):

trtllm-bench --model meta-llama/Llama-2-7b-hf build --dataset /tmp/synthetic_128_128.txt --quantization FP8
[TensorRT-LLM] TensorRT-LLM version: 0.12.0
[08/12/2024-19:13:06] [TRT-LLM] [I] Found dataset.
[08/12/2024-19:13:07] [TRT-LLM] [I]
===========================================================
= DATASET DETAILS
===========================================================
Max Input Sequence Length:      128
Max Output Sequence Length:     128
Max Sequence Length:    256
Number of Sequences:    3000
===========================================================


[08/12/2024-19:13:07] [TRT-LLM] [I] Set multiple_profiles to True.
[08/12/2024-19:13:07] [TRT-LLM] [I] Set use_paged_context_fmha to True.
[08/12/2024-19:13:07] [TRT-LLM] [I] Set use_fp8_context_fmha to True.
[08/12/2024-19:13:07] [TRT-LLM] [I]
===========================================================
= ENGINE BUILD INFO
===========================================================
Model Name:             meta-llama/Llama-2-7b-hf
Workspace Directory:    /tmp
Engine Directory:       /tmp/meta-llama/Llama-2-7b-hf/tp_1_pp_1

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

Loading Model: [1/3]    Downloading HF model
Downloaded model to /data/models--meta-llama--Llama-2-7b-hf/snapshots/01c7f73d771dfac7d292323805ebc428287df4f9
Time: 0.115s
Loading Model: [2/3]    Loading HF model to memory
current rank: 0, tp rank: 0, pp rank: 0
Time: 60.786s
Loading Model: [3/3]    Building TRT-LLM engine
Time: 163.331s
Loading model done.
Total latency: 224.232s
[TensorRT-LLM][INFO] Engine version 0.12.0 found in the config file, assuming engine(s) built by new builder API.

<snip verbose logging>

[08/12/2024-19:17:09] [TRT-LLM] [I]

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

在这种情况下,引擎将被写入 /tmp/meta-llama/Llama-2-7b-hf/tp_1_pp_1(日志的末尾)。

最大吞吐量基准测试

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

基准测试器如何工作

基准测试器读取一个数据文件,其中每一行包含一个完整的JSON请求条目,如准备数据集中所述。基准测试器的处理过程如下:

  1. 遍历所有输入请求。如果指定了logits,则使用指定的logits列表构建请求。否则,按照--model $HF_MODEL_NAME指定的方式对prompt进行分词。

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

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

要运行基准测试器,请使用从先前步骤生成的enginedataset运行以下命令:

trtllm-bench --model meta-llama/Llama-2-7b-hf throughput --dataset /tmp/synthetic_128_128.txt --engine_dir /tmp/meta-llama/Llama-2-7b-hf/tp_1_pp_1
[TensorRT-LLM] TensorRT-LLM version: 0.12.0
[08/12/2024-19:36:48] [TRT-LLM] [I] Preparing to run throughput benchmark...
[08/12/2024-19:36:49] [TRT-LLM] [I] Setting up benchmarker and infrastructure.
[08/12/2024-19:36:49] [TRT-LLM] [I] Ready to start benchmark.
[08/12/2024-19:36:49] [TRT-LLM] [I] Initializing Executor.
[TensorRT-LLM][INFO] Engine version 0.12.0 found in the config file, assuming engine(s) built by new builder API.

<snip verbose logging>

[TensorRT-LLM][INFO] Executor instance created by worker
[08/12/2024-19:36:58] [TRT-LLM] [I] Starting response daemon...
[08/12/2024-19:36:58] [TRT-LLM] [I] Executor started.
[08/12/2024-19:36:58] [TRT-LLM] [I] Request serving started.
[08/12/2024-19:36:58] [TRT-LLM] [I] Starting statistics collection.
[08/12/2024-19:36:58] [TRT-LLM] [I] Benchmark started.
[08/12/2024-19:36:58] [TRT-LLM] [I] Collecting live stats...
[08/12/2024-19:36:59] [TRT-LLM] [I] Request serving stopped.
[08/12/2024-19:37:19] [TRT-LLM] [I] Collecting last stats...
[08/12/2024-19:37:19] [TRT-LLM] [I] Ending statistics collection.
[08/12/2024-19:37:19] [TRT-LLM] [I] Stop received.
[08/12/2024-19:37:19] [TRT-LLM] [I] Stopping response parsing.
[08/12/2024-19:37:19] [TRT-LLM] [I] Collecting last responses before shutdown.
[08/12/2024-19:37:19] [TRT-LLM] [I] Completed request parsing.
[08/12/2024-19:37:19] [TRT-LLM] [I] Parsing stopped.
[08/12/2024-19:37:19] [TRT-LLM] [I] Request generator successfully joined.
[08/12/2024-19:37:19] [TRT-LLM] [I] Statistics process successfully joined.
[08/12/2024-19:37:19] [TRT-LLM] [I]
===========================================================
= 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:       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.0%
Issue Rate (req/sec):   2.0827970096792666e+19
===========================================================
= STATISTICS
===========================================================
Number of requests:             3000
Average Input Length (tokens):  128.0
Average Output Length (tokens): 128.0
Token Throughput (tokens/sec):  18886.813971319196
Request Throughput (req/sec):   147.55323415093122
Total Latency (seconds):        20.331645167
===========================================================

[TensorRT-LLM][INFO] Orchestrator sendReq thread exiting
[TensorRT-LLM][INFO] Orchestrator recv thread exiting
[TensorRT-LLM][INFO] Leader sendThread exiting
[TensorRT-LLM][INFO] Leader recvReq thread exiting
[TensorRT-LLM][INFO] Refreshed the MPI local session

低延迟基准测试

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

  • 一个单请求低延迟引擎

  • 一个支持Medusa的推测解码引擎

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

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

基准测试非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

延迟

构建

参见关于构建低延迟引擎的部分

非Medusa延迟

基准测试

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

美杜莎延迟

基准测试

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配置。