数据中心/云端

LLM 推理基准测试:使用 TensorRT-LLM 进行性能调优

这是大语言模型延迟 – 吞吐量基准测试系列的第三篇博文,旨在指导开发者如何使用 TensorRT-LLM 对 LLM 推理进行基准测试。有关基准测试和参数的常用指标的背景知识,请参阅 LLM 推理基准测试:基本概念。阅读《 LLM 推理基准测试指南:NVIDIA GenAI-Perf 和 NIM》,了解如何在您的应用中使用 GenAI – Perf 和 NVIDIA NIM。

在部署、集成或对任何大语言模型 (LLM) 框架进行基准测试时,务必要考虑推理性能。您需要确保调整所选框架及其功能,以便其提供对应用程序至关重要的性能指标。

TensorRT-LLM 是 NVIDIA 的开源 AI 推理引擎,允许您使用其原生基准测试和服务工具部署模型,并具有一系列可调整的功能。在本文中,我们将提供实用指南,介绍如何使用 trtllm-bench 调整模型,然后使用 trtllm-serve 进行部署。

如何使用 trtllm-bench 进行基准测试

trtllm-bench 是 TensorRT-LLM 基于 Python 的实用程序,可直接对模型进行基准测试,而无需承担完整推理部署的开销。它使快速生成模型性能洞察变得简单。trtllm-bench 在内部为引擎设置了最佳设置,通常可提供良好的性能。

设置 GPU 环境

基准测试始于正确配置的 GPU 环境。要将 GPU 恢复为默认设置,请运行:

sudo nvidia-smi -rgc
sudo nvidia-smi -rmc

要查询 GPU 的最大使用量:

nvidia-smi -q -d POWER

如果您要设置特定的功率限制 (或设置最大值) ,请运行:

nvidia-smi -i <gpu_id> -pl <wattage>

有关更多详细信息,请参阅 trtllm-bench 文档。

准备数据集

您可以使用 prepare_dataset 准备合成数据集,也可以使用我们的文档中指定的格式创建自己的数据集。对于自定义数据集,您可以格式化 JSON 行 (jsonl) 文件,并在每行上配置有效载荷。以下是单个数据集条目的示例:

{"task_id": 1, "prompt": "Generate infinitely: This is the song that never ends, it goes on and on", "output_tokens": 128}

出于本文目的,我们提供基于 ISL/ OSL 为 128/ 128 的合成数据集的输出示例。

运行基准测试

要使用 trtllm-bench 运行基准测试,您可以使用 ttg_ 11 子命令。使用 PyTorch 流运行基准测试时,您只需在已安装 TensorRT-LLM 的环境中运行以下命令:

trtllm-bench throughput \
  --model meta-llama/Llama-3.1-8B-Instruct \
  --dataset dataset.jsonl \
   --tp 1 \
   --backend pytorch \
   --report_json results.json
   --streaming \
   --concurrency $CONCURRENCY

throughput 命令将自动从 HuggingFace 中提取检查点 (如果未缓存) ,并使用 PyTorch 流引导 TRT-LLM。运行完成后,结果将保存到 results.json 并打印到终端,如下所示:

注意:这只是输出样本,不代表性能声明。

===========================================================
= PYTORCH BACKEND
===========================================================
Model:                  meta-llama/Llama-3.1-8B-Instruct
Model Path:             None
TensorRT-LLM Version:   0.21.0rc0
Dtype:                  bfloat16
KV Cache Dtype:         None
Quantization:           None

===========================================================
= REQUEST DETAILS
===========================================================
Number of requests:             100
Number of concurrent requests:  94.6050
Average Input Length (tokens):  128.0000
Average Output Length (tokens): 128.0000
===========================================================
= WORLD + RUNTIME INFORMATION
===========================================================
TP Size:                1
PP Size:                1
EP Size:                None
Max Runtime Batch Size: 3840
Max Runtime Tokens:     7680
Scheduling Policy:      GUARANTEED_NO_EVICT
KV Memory Percentage:   90.00%
Issue Rate (req/sec):   1.0526E+15

===========================================================
= PERFORMANCE OVERVIEW
===========================================================
Request Throughput (req/sec):                     86.5373
Total Output Throughput (tokens/sec):             11076.7700
Total Token Throughput (tokens/sec):              22153.5399
Total Latency (ms):                               1155.5715
Average request latency (ms):                     1093.2284
Per User Output Throughput [w/ ctx] (tps/user):   117.1544
Per GPU Output Throughput (tps/gpu):              11076.7700
Average time-to-first-token [TTFT] (ms):   162.6706
Average time-per-output-token [TPOT] (ms): 7.3272
Per User Output Speed (tps/user):          137.1475

-- Per-Request Time-per-Output-Token [TPOT] Breakdown (ms)

[TPOT] MINIMUM: 6.6450
[TPOT] MAXIMUM: 8.1306
[TPOT] AVERAGE: 7.3272
[TPOT] P50    : 7.6079
[TPOT] P90    : 8.1246
[TPOT] P95    : 8.1289
[TPOT] P99    : 8.1306

-- Per-Request Time-to-First-Token [TTFT] Breakdown (ms)

[TTFT] MINIMUM: 93.9210
[TTFT] MAXIMUM: 232.4339
[TTFT] AVERAGE: 162.6706
[TTFT] P50    : 159.7857
[TTFT] P90    : 220.0530
[TTFT] P95    : 226.9148
[TTFT] P99    : 232.4339

-- Per-Request Generation Throughput [GTPS] Breakdown (tps/user)

[GTPS] MINIMUM: 122.9921
[GTPS] MAXIMUM: 150.4894
[GTPS] AVERAGE: 137.1475
[GTPS] P50    : 131.4444
[GTPS] P90    : 150.4112
[GTPS] P95    : 150.4606
[GTPS] P99    : 150.4894

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

[Latency] P50    : 1091.7905
[Latency] P90    : 1130.7200
[Latency] P95    : 1133.0074
[Latency] P99    : 1137.6817
[Latency] MINIMUM: 1050.1519
[Latency] MAXIMUM: 1137.6817
[Latency] AVERAGE: 1093.2284

===========================================================
= DATASET DETAILS
===========================================================
Dataset Path:         /workspace/benchmark_toolkit/synthetic_data.jsonl
Number of Sequences:  100

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

        Input              Output           Seq. Length
-----------------------------------------------------------
MIN:   128.0000           128.0000           256.0000
MAX:   128.0000           128.0000           256.0000
AVG:   128.0000           128.0000           256.0000
P50:   128.0000           128.0000           256.0000
P90:   128.0000           128.0000           256.0000
P95:   128.0000           128.0000           256.0000
P99:   128.0000           128.0000           256.0000
===========================================================

分析性能结果

运行上述命令时,主要统计数据显示在 PERFORMANCE OVERVIEW 部分下。在我们深入了解细节之前,以下是一些有用的术语:

  • 在概述上下文中,Output 表示生成的所有输出令牌 (包括上下文令牌)
  • Total Token 表示生成的总序列长度 (ISL+ OSL)
  • Per userTTFT 和 tg_ 21 认为每个请求都是“用户”;然后根据这些统计数据形成分布。

有关更深入的说明,请参阅本系列第一篇博文 — — LLM 推理基准测试:基本概念。

===========================================================
= PERFORMANCE OVERVIEW
===========================================================
Request Throughput (req/sec):                 	86.5373
Total Output Throughput (tokens/sec):         	11076.7700
Total Token Throughput (tokens/sec):          	22153.5399
Total Latency (ms):                           	1155.5715
Average request latency (ms):                 	1093.2284
Per User Output Throughput [w/ ctx] (tps/user):   117.1544
Per GPU Output Throughput (tps/gpu):          	11076.7700
Average time-to-first-token [TTFT] (ms):   162.6706
Average time-per-output-token [TPOT] (ms): 7.3272
Per User Output Speed (tps/user):      	137.1475

您还会注意到,trtllm-bench 报告令牌的最大数量和批量大小。

===========================================================
= WORLD + RUNTIME INFORMATION
===========================================================
TP Size:            	1
PP Size:            	1
EP Size:            	None
Max Runtime Batch Size: 3840
Max Runtime Tokens: 	7680

它们在 TensorRT-LLM 的环境中具有特殊的含义:

  • 令牌的最大数量是指引擎本身在一次批量迭代中可以处理的令牌的最大数量。此限制包括所有上下文请求的所有输入令牌之和,以及批量中所有生成请求之和的单个令牌。
  • 最大批量大小是批量中允许的最大请求数。假设您的迭代包含一个上下文长度为 128 的请求、四代请求 (共 132 个令牌) ,并且您已将最大令牌设置为 512 个,最大批量大小为 5 个请求。在这种情况下,即使引擎尚未满足最大令牌,它也将限制为批量大小。

在分析结果时,了解您的优先级很有帮助。一些常见问题:

  • 您的目标是提高每个用户的 token 吞吐量吗?
  • 您是否正在处理大量文本并需要尽可能高的吞吐量?
  • 您是否希望第一个 token 快速返回?

您选择的调优很大程度上取决于您要优先考虑的场景。在本文中,我们重点介绍如何优化每个用户的体验。我们希望优先考虑 Per User Output Speed 指标或上下文阶段完成后向用户返回 token 的速度。借助 trtllm-bench,您可以使用 tg_ 27 指定未完成请求的最大数量,从而缩小系统可支持的用户数量。

此选项可用于生成几种不同的曲线,这在搜索延迟和吞吐量目标时至关重要。以下是一组基于 NVIDIA Llama-3.1 8B FP8 和 Meta Llama – 3.1 8B FP16 为 128/ 128 ISL/ OSL 场景生成的曲线。假设我们希望尽可能多地利用该系统,但我们仍然希望用户体验到约 50 个令牌/ 秒的输出速度 (令牌之间约 20 毫秒) 。为了评估 GPU 性能和用户体验之间的权衡,您可以根据每个用户的输出速度绘制每个 GPU 的输出吞吐量。

A plot chart with two colored lines, one in green (FP8) and one in blue (FP16). The green line peaks at roughly 25,000 tokens for an output speed of 72 tokens/second/user and curves down to 300 tokens/second/user as concurrent users decrease to one. The blue line peaks roughly at 16,600 tokens/second/GPU at output speed 20 tokens/second/user and curves down to the right to 203 tokens/second/user. A red bounding box is featured over the right side of the chart from 50 tokens/second/user to the end of the chart.
图 1。每个用户的输出速度和每个 GPU 的输出吞吐量的比较。根据我们的标准,我们可以看到每个 GPU 的吞吐量随着并发率的增加而提高 (系统利用率提高) ;但是,随着系统饱和度降低,每个用户的输出速度也会提高 (体验更好) 。

在图 1 中,我们可以看到,Llama-3.1 8B FP16 只能以大约 72 个 token/ 秒/ 用户的速度处理大约 256 个并发用户,然后才会违反 50 个 token/ 秒/ 用户的约束条件。但是,通过观察 Llama-3.1 8B FP8 优化检查点,我们发现 TensorRT-LLM 能以大约 66 个 token/ 秒/ 用户的速度处理 512 个并发用户。我们可以得出结论,量化模型只需使用 trtllm-bench 扫描两个模型,即可在相同预算内为更多用户提供服务。

借助这些数据,您可以考虑以下事项:

  1. 如果您想强制引擎包含 512 个条目,可以将最大批量大小设置为 512;但是,如果指向此实例的流量超过 512 (超出 512 的任何请求都会排队) ,这可能会增加优先令牌时间 (TTFT) 。
  2. 您可以使用 trtllm-bench 使用其他数据集评估服务质量场景和模型,并绘制各种指标。借助该工具,您可以通过简单易用的方式调整命令行,根据优先级进行价值评估。

注意:在此场景中,我们仅探索单个 GPU 模型。如果您的模型需要多个 GPU,则可以使用 --tp、tg_ 33 和 tg_ 34 选项配置 tg_ 31,以找到最佳分片/ 数据并行配置。此外,如果您是开发者并且需要高级功能,可以使用 --extra_llm_api_options 参数。

如何使用 trtllm-serve 为大语言模型提供服务

TensorRT-LLM 能够使用 trtllm-serve 命令轻松建立与 OpenAI 兼容的端点。您可以使用上面 trtllm-bench 中的调优来启动经过调优的服务器。与基准测试不同,trtllm-serve 除了常规设置之外,对配置不作任何假设。要根据上述最大吞吐量结果调整服务器,您需要根据上述输出提供以下命令:

trtllm-serve serve nvidia/Llama-3.1-8B-Instruct-FP8 --backend pytorch --max_num_tokens 7680 --max_batch_size 3840 --tp_size 1 --extra_llm_api_options llm_api_options.yml

--extra_llm_api_options 提供了一种在 LLM API 级别直接更改设置的机制。为了匹配基准测试中的设置,您需要在 llm_api_options.yml 中使用以下内容:

cuda_graph_config:
    max_batch_size: 3840
    padding_enabled: true 

配置并运行后,您应看到服务器正在运行的状态更新:

INFO:     Application startup complete.
INFO:     Uvicorn running on http://localhost:8000 (Press CTRL+C to quit)

随着服务器的运行,您现在可以使用 GenAI-Perf 对模型进行基准测试 (类似于本系列的第二个博客) ,也可以使用我们的移植版本 benchmark_serving.py。这些可以帮助您验证经过调整的服务器配置的性能。在未来的版本中,我们计划增强 trtllm-bench,以便能够启动经过优化的服务器进行基准测试。

开始针对 LLM 进行基准测试和性能调整

借助 trtllm-bench,TensorRT-LLM 提供了一种对各种配置、调优、并发性和功能进行基准测试的简单方法。trtllm-bench 中的设置可直接转换为 TensorRT-LLM 的原生服务解决方案 tg_ 47。它使您能够将性能调优无缝移植到与 OpenAI 兼容的部署中。

有关性能、模型特定调优以及 TensorRT-LLM 调优/ 基准测试的更多详细信息,请参阅以下资源:

  • 如需更深入地了解可用的性能选项,请参阅性能调优指南。
  • 有关 trtllm-bench 文档,请参阅性能基准测试页面。
  • 要了解如何分析 TensorRT-LLM,性能分析涵盖使用 Nsight System 分析模型执行。
  • 如需深入了解 DeepSeek-R1 的性能调优,请查看 DeepSeek – R1 的 TensorRT-LLM 性能调优指南。

查看以下资源:

  • 如需详细了解平台架构如何超越 FLOPS 来影响 TCO,您可以阅读博文“NVIDIA DGX 云推出即用型模板来基准 AI 平台性能”。另请参阅此处可在 NGC 上下载的性能基准测试方法集合 (即用型模板) 。
  • 阅读《 IT 领导者 AI 推理和性能指南》,了解如何降低每个 token 的成本并更大限度地利用 AI 模型。

 

标签