默认性能基准测试#

本节讨论如何使用 LLM-API 为模型构建引擎以及如何使用 TRTLLM-Bench 对其进行基准测试。

免责声明:此处显示的性能数据真实,但仅用于演示目的。环境、SKU、互连和工作负载的差异都可能显著影响性能,并导致您的结果与此处所示不同。

开始之前:TensorRT-LLM LLM-API#

TensorRT-LLM 的 LLM-API 旨在让您快速轻松地开始使用 TensorRT-LLM。例如,以下脚本实例化 Llama-3.3-70B-Instruct 并在少量提示上运行推理。对于熟悉 TensorRT-LLM 的 CLI 工作流程的用户,调用 LLM() 可以在一行代码中处理模型检查点转换和引擎构建。

#quickstart.py
from tensorrt_llm import LLM, SamplingParams


def main():
    prompts = [
        "Hello, I am",
        "The president of the United States is",
        "The capital of France is",
        "The future of AI is",
    ]

    sampling_params = SamplingParams(temperature=0.8, top_p=0.95)

    llm  =  LLM(
    model="meta-llama/Llama-3.3-70B-Instruct", #HuggingFace model name, no need to download the checkpoint beforehand
    tensor_parallel_size=4
    )

    outputs = llm.generate(prompts, sampling_params)

    # Print the outputs.
    for output in outputs:
        prompt = output.prompt
        generated_text = output.outputs[0].text
        print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")

if __name__ == '__main__':
    main()

故障排除技巧和应避免的陷阱#

由于我们在多个 GPU 上运行,因此使用 MPI 为每个 GPU 生成进程。这带来了以下要求

  1. 脚本的入口点应通过 if __name__ == '__main__' 进行保护。此要求来自 mpi4py。

  2. 根据您的环境,可能需要使用 mpirun 包装 python 命令。例如,运行上述脚本的命令可以是 mpirun -n 1 --oversubscribe --allow-run-as-root python quickstart.py。像示例尝试在单个节点上的多个 GPU 上运行时,通常不需要在前面加上 mpirun,但如果您遇到 MPI 错误,则应添加它。此外,-n 1 意在仅启动一个进程,因为 TensorRT-LLM 会负责为剩余的 GPU 生成进程。

  3. 如果在加载 Llama 权重时遇到 HuggingFace 访问错误,这很可能是因为模型是受限的。请在该模型的 HuggingFace 页面上请求访问权限。然后按照 Huggingface 快速入门指南 中的说明在您的环境中进行身份验证。

构建并保存引擎#

使用 .save() 保存引擎。与之前的示例一样,此脚本和所有后续脚本可能需要通过 mpirun 运行。

from tensorrt_llm import LLM

def main():
    llm = LLM(
        model="/scratch/Llama-3.3-70B-Instruct",
        tensor_parallel_size=4
    )

    llm.save("baseline")

if __name__ == '__main__':
    main()

通过 CLI 构建并保存引擎#

TensorRT-LLM 还提供了用于构建和保存引擎的命令行界面。此工作流程包含两个步骤

  1. 通过 convert_checkpoint.py 将模型检查点(HuggingFace、Nemo)转换为 TensorRT-LLM 检查点。每个支持的模型都有一个相关的 convert_checkpoint.py,可以在 examples 文件夹中找到。例如,Llama 模型的 convert_checkpoint.py 脚本可以在这里找到。

  2. 通过将 TensorRT-LLM 检查点传递给 trtllm-build 命令来构建引擎。tensorrt_llm 包安装后,trtllm-build 命令会自动安装。

支持模型的 examples 文件夹中的 README 详细介绍了使用此流程构建引擎以应对各种情况。Llama 模型的 examples 文件夹可以在 NVIDIA/TensorRT-LLM 找到。

使用 trtllm-bench 进行基准测试#

trtllm-bench 提供了一个命令行界面,用于对已保存引擎的吞吐量和延迟进行基准测试。

准备数据集#

trtllm-bench 期望传入要通过模型运行的请求数据集。本指南创建了一个包含 1000 个请求的虚拟数据集,每个请求的输入和输出序列长度均为 2048。TensorRT-LLM 提供了 prepare_dataset.py 脚本来生成数据集。要使用它,请克隆 TensorRT-LLM 仓库并运行以下命令

python benchmarks/cpp/prepare_dataset.py --stdout --tokenizer /path/to/hf/Llama-3.3-70B-Instruct/ token-norm-dist --input-mean 2048 --output-mean 2048 --input-stdev 0 --output-stdev 0 --num-requests 1000 > synthetic_2048_2048.txt

trtllm-bench 也可以使用真实数据,有关所需格式的更多详细信息,请参阅 trtllm-bench 文档

运行吞吐量和延迟基准测试#

要对在之前脚本中构建的基线引擎进行基准测试,请运行以下命令。再次提醒,由于工作负载的多 GPU 特性,您可能需要在 trtllm-bench 命令前加上 mpirun -n 1 --oversubscribe --allow-run-as-root

吞吐量

trtllm-bench \
--model /path/to/hf/Llama-3.3-70B-Instruct/ \
throughput \
--dataset /path/to/dataset/synthetic_2048_2048_1000.txt \
--engine_dir /path/to/engines/baseline #replace baseline with name used in llm.save()

此命令将立即向模型发送全部 1000 个请求。运行 trtllm-bench throughput -h 查看选项列表,这些选项可帮助您控制请求速率,并在基准测试耗时过长时限制总请求数。作为参考,内部测试上述命令在 4 个通过 NVLink 连接的 H100-sxm-80GB 上耗时约 20 分钟。

运行此命令将提供吞吐量概述,如下所示

===========================================================
= ENGINE DETAILS
===========================================================
Model:			/scratch/Llama-3.3-70B-Instruct/
Engine Directory:	/scratch/grid_search_engines/baseline
TensorRT-LLM Version:	0.16.0
Dtype:			bfloat16
KV Cache Dtype:		None
Quantization:		None
Max Sequence Length:	131072

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

===========================================================
= PERFORMANCE OVERVIEW
===========================================================
Number of requests:		1000
Average Input Length (tokens):	2048.0000
Average Output Length (tokens):	2048.0000
Token Throughput (tokens/sec):	1585.7480
Request Throughput (req/sec):	0.7743
Total Latency (ms):		1291504.1051

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

延迟

trtllm-bench \
--model /path/to/hf/Llama-3.3-70B-Instruct/ \
latency \
--dataset /path/to/dataset/synthetic_2048_2048_1000.txt \
--num-requests 100 \
--warmup 10 \
--engine_dir /path/to/engines/baseline #replace baseline with name used in llm.save()

延迟基准测试强制使用批量大小为 1 以准确测量延迟,这会显著增加测试持续时间。在上面的示例中,通过 --num-requests 将总请求数限制为 100,以使测试持续时间更易于管理。此示例基准测试旨在产生非常稳定的数字,但在实际场景中,即使是 100 个请求也可能超出您的需求,并且可能需要很长时间才能完成(在案例研究中,耗时约一个半小时)。将请求数减少到 10 仍能提供准确的数据,并加快开发迭代速度。通常,您应根据自己的需求调整请求数。运行 trtllm-bench latency -h 查看其他可配置选项。

运行此命令将提供延迟概述,如下所示

===========================================================
= ENGINE DETAILS
===========================================================
Model:			/scratch/Llama-3.3-70B-Instruct/
Engine Directory:	/scratch/grid_search_engines/baseline
TensorRT-LLM Version:	0.16.0
Dtype:			bfloat16
KV Cache Dtype:		None
Quantization:		None
Max Input Length:	1024
Max Sequence Length:	131072

===========================================================
= WORLD + RUNTIME INFORMATION
===========================================================
TP Size:		4
PP Size:		1
Max Runtime Batch Size:	1
Max Runtime Tokens:	8192
Scheduling Policy:	Guaranteed No Evict
KV Memory Percentage:	90.00%

===========================================================
= GENERAL OVERVIEW
===========================================================
Number of requests:		100
Average Input Length (tokens):	2048.0000
Average Output Length (tokens):	2048.0000
Average request latency (ms):	63456.0704

===========================================================
= THROUGHPUT OVERVIEW
===========================================================
Request Throughput (req/sec):		  0.0158
Total Token Throughput (tokens/sec):	  32.2742
Generation Token Throughput (tokens/sec): 32.3338

===========================================================
= LATENCY OVERVIEW
===========================================================
Total Latency (ms):		  6345624.0554
Average time-to-first-token (ms): 147.7502
Average inter-token latency (ms): 30.9274
Acceptance Rate (Speculative):	  1.00

===========================================================
= GENERATION LATENCY BREAKDOWN
===========================================================
MIN (ms): 63266.8804
MAX (ms): 63374.7770
AVG (ms): 63308.3201
P90 (ms): 63307.1885
P95 (ms): 63331.7136
P99 (ms): 63374.7770

===========================================================
= ACCEPTANCE BREAKDOWN
===========================================================
MIN: 1.00
MAX: 1.00
AVG: 1.00
P90: 1.00
P95: 1.00
P99: 1.00

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

结果#

基线引擎在令牌吞吐量、请求吞吐量、首个令牌平均延迟和令牌间平均延迟方面达到了以下性能。本指南将对这些指标进行分析。

指标

令牌吞吐量 (令牌/秒)

1564.3040

请求吞吐量 (请求/秒)

0.7638

首个令牌平均延迟 (ms)

147.6976

令牌间平均延迟 (ms)

31.3276

以下章节展示了使用不同配置选项改进这些指标的方法。