默认性能基准测试#
本节讨论如何使用 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 生成进程。这带来了以下要求
脚本的入口点应通过
if __name__ == '__main__'
进行保护。此要求来自 mpi4py。根据您的环境,可能需要使用
mpirun
包装python
命令。例如,运行上述脚本的命令可以是mpirun -n 1 --oversubscribe --allow-run-as-root python quickstart.py
。像示例尝试在单个节点上的多个 GPU 上运行时,通常不需要在前面加上mpirun
,但如果您遇到 MPI 错误,则应添加它。此外,-n 1
意在仅启动一个进程,因为 TensorRT-LLM 会负责为剩余的 GPU 生成进程。如果在加载 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 还提供了用于构建和保存引擎的命令行界面。此工作流程包含两个步骤
通过
convert_checkpoint.py
将模型检查点(HuggingFace、Nemo)转换为 TensorRT-LLM 检查点。每个支持的模型都有一个相关的convert_checkpoint.py
,可以在 examples 文件夹中找到。例如,Llama 模型的convert_checkpoint.py
脚本可以在这里找到。通过将 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 |
以下章节展示了使用不同配置选项改进这些指标的方法。