GenAI-Perf#

GenAI-Perf 是一个命令行工具,用于测量通过推理服务器提供的生成式 AI 模型的吞吐量和延迟。 对于大型语言模型 (LLM),GenAI-Perf 提供诸如 输出令牌吞吐量首个令牌时间第二个令牌时间令牌间延迟请求吞吐量 等指标。 有关指标的完整列表,请参阅指标部分

用户指定模型名称、推理服务器 URL、要使用的输入类型(合成的或来自通过文件定义的数据集)以及要生成的负载类型(并发请求数、请求速率)。

GenAI-Perf 生成指定的负载,测量推理服务器的性能,并在一个简单的表格中以控制台输出形式报告指标。 该工具还将所有结果记录在 csv 和 json 文件中,这些文件可用于导出其他指标和可视化。 运行 GenAI-Perf 时,推理服务器必须已在运行。

您可以使用 GenAI-Perf 在以下模型上运行性能基准测试:

您还可以使用 GenAI-Perf 在您的 自定义 API 上运行基准测试。

[!Note] GenAI-Perf 目前处于早期发布阶段,并且正在快速开发中。 尽管我们会尽力保持一致,但命令行选项和功能可能会随着工具的成熟而发生变化。


安装#

安装 GenAI-Perf 最简单的方法是通过 pip。

安装 GenAI-Perf (Ubuntu 24.04, Python 3.10+)#

pip install genai-perf

注意:您必须已安装 CUDA 12

或者,要安装容器

Triton Server SDK 容器

使用以下命令拉取最新版本

export RELEASE="24.12"

docker run -it --net=host --gpus=all  nvcr.io/nvidia/tritonserver:${RELEASE}-py3-sdk

# Validate the genai-perf command works inside the container:
genai-perf --help

您还可以 从源代码构建 Perf Analyzer,以便与 GenAI-Perf 一起使用。


快速入门#

在本快速入门中,我们将使用 GenAI-Perf 对在 Triton 推理服务器上使用 TensorRT-LLM 引擎运行的 GPT-2 模型进行性能基准测试。

使用 Triton CLI 提供 GPT-2 TensorRT-LLM 模型#

您可以按照 Triton CLI Github 仓库中的快速入门指南,使用 TensorRT-LLM 后端在 Triton 服务器上提供 GPT-2。 为了方便起见,完整说明复制如下

# This container comes with all of the dependencies for building TRT-LLM engines
# and serving the engine with Triton Inference Server.
docker run -ti \
    --gpus all \
    --network=host \
    --shm-size=1g --ulimit memlock=-1 \
    -v /tmp:/tmp \
    -v ${HOME}/.cache/huggingface:/root/.cache/huggingface \
    nvcr.io/nvidia/tritonserver:24.12-trtllm-python-py3

# Install the Triton CLI
pip install git+https://github.com/triton-inference-server/triton_cli.git@0.0.11

# Build TRT LLM engine and generate a Triton model repository pointing at it
triton remove -m all
triton import -m gpt2 --backend tensorrtllm

# Start Triton pointing at the default model repository
triton start

运行 GenAI-Perf#

现在我们可以在 Triton 推理服务器 SDK 容器内运行 GenAI-Perf

genai-perf profile -m gpt2 --service-kind triton --backend tensorrtllm --streaming

示例输出

                              NVIDIA GenAI-Perf | LLM Metrics
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━┓
┃                         Statistic ┃    avg ┃    min ┃    max ┃    p99 ┃    p90 ┃    p75 ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━━┩
│          Time to first token (ms) │  16.26 │  12.39 │  17.25 │  17.09 │  16.68 │  16.56 │
│          Inter token latency (ms) │   1.85 │   1.55 │   2.04 │   2.02 │   1.97 │   1.92 │
│              Request latency (ms) │ 499.20 │ 451.01 │ 554.61 │ 548.69 │ 526.13 │ 514.19 │
│            Output sequence length │ 261.90 │ 256.00 │ 298.00 │ 296.60 │ 270.00 │ 265.00 │
│             Input sequence length │ 550.06 │ 550.00 │ 553.00 │ 551.60 │ 550.00 │ 550.00 │
│ Output token throughput (per sec) │ 520.87 │    N/A │    N/A │    N/A │    N/A │    N/A │
│      Request throughput (per sec) │   1.99 │    N/A │    N/A │    N/A │    N/A │    N/A │
└───────────────────────────────────┴────────┴────────┴────────┴────────┴────────┴────────┘

有关其他示例,请参阅教程


分析#

GenAI-Perf 可用于扫描 PA 或 GenAI-Perf 刺激,允许用户使用单个命令分析多个场景。 有关如何利用此子命令的详细信息,请参阅分析

可视化#

GenAI-Perf 还可以生成各种图表,可视化当前分析运行的性能。 默认情况下禁用此功能,但用户可以通过在运行基准测试时传递 --generate-plots 选项轻松启用它

genai-perf profile \
  -m gpt2 \
  --service-kind triton \
  --backend tensorrtllm \
  --streaming \
  --concurrency 1 \
  --generate-plots

这将生成一组默认图表,例如

  • 首个令牌时间 (TTFT) 分析

  • 请求延迟分析

  • TTFT 与输入序列长度

  • 令牌间延迟与令牌位置

  • 输入序列长度与输出序列长度

使用 compare 子命令可视化多次运行#

GenAI-Perf 中的 compare 子命令有助于用户比较多次分析运行,并通过图表可视化差异。

用法#

假设用户拥有两个分析导出 JSON 文件,即 profile1.jsonprofile2.json,他们可以使用 --files 选项执行 compare 子命令

genai-perf compare --files profile1.json profile2.json

执行上述命令将在 compare 目录下执行以下操作

  1. 生成一个 YAML 配置文件(例如 config.yaml),其中包含比较过程中生成的每个图表的元数据。

  2. 自动生成默认图表集(例如 TTFT 与输入序列长度),用于比较两次分析运行。

compare
├── config.yaml
├── distribution_of_input_sequence_lengths_to_output_sequence_lengths.jpeg
├── request_latency.jpeg
├── time_to_first_token.jpeg
├── time_to_first_token_vs_input_sequence_lengths.jpeg
├── token-to-token_latency_vs_output_token_position.jpeg
└── ...

自定义#

用户可以灵活地迭代修改生成的 YAML 配置文件,以满足其特定要求。 他们可以根据自己的喜好更改图表,并使用 --config 选项以及修改后的配置文件的路径来执行命令

genai-perf compare --config compare/config.yaml

此命令将根据更新的配置设置重新生成图表,使用户能够根据自己的需要改进比较结果的可视化表示。

有关更多详细信息,请参阅比较文档


模型输入#

GenAI-Perf 支持来自合成生成的输入或来自通过文件定义的数据集的模型输入提示。

当数据集是合成的时,您可以指定以下选项

  • --num-dataset-entries <int>:要从中采样的唯一有效负载的数量。 这些有效负载将被重用,直到基准测试完成。

  • --synthetic-input-tokens-mean <int>:使用合成数据时,生成的提示中令牌数的平均值,>= 1。

  • --synthetic-input-tokens-stddev <int>:使用合成数据时,生成的提示中令牌数的标准差,>= 0。

  • --random-seed <int>:用于生成随机值的种子,>= 0。

  • --request-count <int>:要进行基准测试的请求数

  • --warmup-request-count <int>:基准测试之前要发送的预热请求数

当数据集来自文件时,您可以指定以下选项

  • --input-file <path>:输入文件或目录,其中包含用于基准测试的提示或图像文件路径,格式为 JSON 对象。

对于任何数据集,您可以指定以下选项

  • --num-prefix-prompts <int>:要从中采样的合成前缀提示的数量。 如果此值 > 0,则合成前缀提示将添加到用户提示的前面。

  • --output-tokens-mean <int>:每个输出中的平均令牌数。 确保 --tokenizer 值设置正确,>= 1。

  • --output-tokens-stddev <int>:每个输出中令牌数的标准差。 这仅在提供 output-tokens-mean 时使用,>= 1。

  • --output-tokens-mean-deterministic:当使用 --output-tokens-mean 时,可以设置此标志以通过将最小令牌数设置为等于请求的令牌数来提高精度。 当前 Triton service-kind 支持此功能。 请注意,请求的输出令牌数仍然存在一些可变性,但 GenAi-Perf 会尽最大努力使您的模型获得正确的输出令牌数。

  • --prefix-prompt-length <int>:每个前缀提示中包含的令牌数。 仅当 –num-prefix-prompts 为正数时才使用此值。

您可以选择使用以下选项设置其他模型输入

  • --extra-inputs <input_name>:<value>:要与模型一起使用的附加输入,具有单数值,例如 stream:truemax_tokens:5。 可以重复此标志以提供多个额外输入。

对于大型语言模型,没有批大小(即,批大小始终为 1)。 每个请求都包含单个推理的输入。 诸如 嵌入排序 端点之类的其他模式支持客户端批处理,其中 --batch-size-text N 表示发送的每个请求将包含 N 个单独推理的输入,从而允许它们一起处理。


身份验证#

GenAI-Perf 可以对安全端点(例如 OpenAI)进行基准测试,这些端点需要 API 密钥身份验证。 为此,您必须直接在命令中添加您的 API 密钥。 将以下标志添加到您的命令中。

-H "Authorization: Bearer ${API_KEY}" -H "Accept: text/event-stream"

指标#

GenAI-Perf 收集各种指标,用于捕获推理服务器的性能。

指标

描述

聚合

首个令牌时间

从发送请求到收到其首个响应之间的时间,基准测试中每个请求一个值

平均值、最小值、最大值、p99、p90、p75

第二个令牌时间

从收到第一个流式响应到收到第二个流式响应之间的时间,基准测试中每个请求一个值

平均值、最小值、最大值、p99、p90、p75

令牌间延迟

单个请求的中间响应之间的时间除以后一个响应的生成令牌数,基准测试中每个请求的每个响应一个值

平均值、最小值、最大值、p99、p90、p75

请求延迟

从发送请求到收到其最终响应之间的时间,基准测试中每个请求一个值

平均值、最小值、最大值、p99、p90、p75

输出序列长度

请求的输出令牌总数,基准测试中每个请求一个值

平均值、最小值、最大值、p99、p90、p75

输入序列长度

请求的输入令牌总数,基准测试中每个请求一个值

平均值、最小值、最大值、p99、p90、p75

输出令牌吞吐量

从基准测试输出的令牌总数除以基准测试持续时间

无 – 每个基准测试一个值

请求吞吐量

从基准测试获得的最终响应数除以基准测试持续时间

无 – 每个基准测试一个值


遥测指标#

当使用 Triton 服务类型时,遥测指标将在 GenAI-Perf 配置文件导出文件中报告。 这些指标包括 GPU 功耗、GPU 利用率、能耗、GPU 总内存等等。 如果您希望将这些指标打印为输出,可以使用 --verbose 标志。

命令行选项#

-h#

--help#

显示帮助消息并退出。

端点选项:#

-m <list>#

--model <list>#

要进行基准测试的模型的名称。 建议使用单个模型,除非您正在分析多个 LoRA 适配器。 (默认值:None

--model-selection-strategy {round_robin, random}#

当指定多个模型时,这是将特定模型分配给提示的方式。 轮循意味着每个模型按顺序接收一个请求。 随机意味着分配是均匀随机的(默认值:round_robin

--backend {tensorrtllm,vllm}#

当使用“triton”服务类型时,这是模型的后端。 对于 TRT-LLM 后端,您当前必须在模型配置中将 exclude_input_in_output 设置为 true,以避免在输出中回显输入令牌。 (默认值:tensorrtllm)

--endpoint <str>#

设置与 OpenAI 默认值不同的自定义端点。 (默认值:None

--endpoint-type {chat,completions,embeddings,rankings}#

要在服务器上发送请求的端点类型。 这仅与 openai 服务类型一起使用。 (默认值:None

--service-kind {triton,openai}#

perf_analyzer 将为其生成负载的服务类型。 为了使用 openai,您必须通过 --endpoint-type 指定 API。 (默认值:triton

--streaming#

用于启用流式 API 使用的选项。 (默认值:False

-u <url>#

--url <url>#

要进行基准测试的端点的 URL。 (默认值:None

输入选项#

-b <int>#

--batch-size <int>#

--batch-size-text <int>#

GenAI-Perf 应发送的请求的文本批大小。 这目前仅在嵌入排序端点类型中受支持。 (默认值:1

--batch-size-image <int>#

GenAI-Perf 应发送的请求的图像批大小。 这目前仅在图像检索端点类型中受支持。 (默认值:1

--extra-inputs <str>#

提供要包含在每个请求中的其他输入。 您可以重复此标志以获取多个输入。 输入应采用 input_name:value 格式。 或者,可以提供表示 json 格式字典的字符串。 (默认值:None

--header <str>#

--H <str>#

向请求添加自定义标头。 标头必须指定为“Header:Value”。 您可以重复此标志以获取多个标头。 (默认值:None

--input-file <path>#

输入文件或目录,其中包含要用于分析的内容。 每行应为 JSONL 格式的 JSON 对象,其中包含“text”或“image”字段。 示例:{“text”: “您的提示在此处”}” 要为需要多个文件的转换器使用合成文件,请在路径前加上“synthetic:”,后跟逗号分隔的文件名列表。 合成文件名不应带有扩展名。 例如,“synthetic:queries,passages”。 (默认值:None

--num-dataset-entries <int>#

要从中采样的唯一有效负载的数量。 这些有效负载将被重用,直到基准测试完成。 (默认值:100

--num-prefix-prompts <int>#

要从中选择的前缀提示的数量。 如果此值不为零,则这些提示将添加到输入提示的前面。 这对于基准测试使用 K-V 缓存的模型很有用。 (默认值:0

--output-tokens-mean <int>#

--osl#

每个输出中的平均令牌数。 确保 --tokenizer 值设置正确。 (默认值:-1

--output-tokens-mean-deterministic#

当使用 --output-tokens-mean 时,可以设置此标志以通过将最小令牌数设置为等于请求的令牌数来提高精度。 当前 Triton 服务类型支持此功能。 请注意,请求的输出令牌数仍然存在一些可变性,但 GenAi-Perf 会尽最大努力使您的模型获得正确的输出令牌数。 (默认值:False

--output-tokens-stddev <int>#

每个输出中令牌数的标准差。 这仅在提供 --output-tokens-mean 时使用。 (默认值:0

--random-seed <int>#

用于生成随机值的种子。 (默认值:0

--request-count <int>#

--num-requests <int>#

用于测量的请求数。 默认情况下,基准测试不会根据请求计数终止。 相反,它会持续到检测到稳定为止。 (默认值:0

--synthetic-input-tokens-mean <int>#

--isl#

使用合成数据时,生成的提示中令牌数的平均值。 (默认值:550

--synthetic-input-tokens-stddev <int>#

使用合成数据时,生成的提示中令牌数的标准差。 (默认值:0

--prefix-prompt-length <int>#

每个前缀提示中的令牌数。 仅当 –num-prefix-prompts 为正数时才使用此值。 请注意,由于前缀提示和用户提示是连接在一起的,因此最终提示中的令牌数可能会相差一个。 (默认值:100

--warmup-request-count <int>#

--num-warmup-requests <int>#

基准测试之前要发送的预热请求数。 (默认值:0

分析选项#

--concurrency <int>#

要进行基准测试的并发值。 (默认值:None

--measurement-interval <int>#

-p <int>#

每次测量使用的时间间隔,以毫秒为单位。 Perf Analyzer 将对指定的时间间隔进行采样,并对在该时间间隔内完成的请求进行测量。 (默认值:10000

--request-rate <float>#

设置 PA 生成的负载的请求速率。 (默认值:None

-s <float>#

--stability-percentage <float>#

确定结果是否稳定时,延迟测量中允许的变化范围。 如果最近 3 次测量的最大值/最小值之比在(稳定性百分比)范围内(就每秒推理次数和延迟而言),则测量被视为稳定。 (默认值:999

输出选项#

--artifact-dir#

用于存储 GenAI-Perf 和 Perf Analyzer 生成的所有(输出)工件的目录。 (默认值:artifacts

--generate-plots#

用于启用图表生成的选项。 (默认值:False)

--profile-export-file <path>#

将生成 perf_analyzer 配置文件导出的路径。 默认情况下,配置文件导出将为 profile_export.json。 genai-perf 文件将导出到 <profile_export_file>_genai_perf.json<profile_export_file>_genai_perf.csv。 例如,如果配置文件导出文件为 profile_export.json,则 genai-perf 文件将导出到 profile_export_genai_perf.csv。 (默认值:profile_export.json

其他选项#

--tokenizer <str>#

用于解释来自提示和响应的令牌指标的 HuggingFace 分词器。 该值可以是分词器的名称或分词器的文件路径。 (默认值:hf-internal-testing/llama-tokenizer

--tokenizer-revision <str>#

要使用的特定分词器模型版本。 它可以是分支名称、标签名称或提交 ID。 (默认值:main

--tokenizer-trust-remote-code#

允许下载和执行自定义分词器。 这会带来安全风险,应仅用于您信任的存储库。 这仅对于存储在 HuggingFace Hub 中的自定义分词器是必需的。 (默认值:False

-v#

--verbose#

用于启用详细模式的选项。 (默认值:False

--version#

用于打印版本并退出的选项。


已知问题#

  • 如果提供高请求速率,GenAI-Perf 完成速度可能会很慢

  • 令牌计数可能不完全准确