GenAI 性能分析器#

GenAI-Perf#

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

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

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

您可以使用 GenAI-Perf 对以下模型运行性能基准测试 - 大型语言模型 - 视觉语言模型 - 嵌入模型 - 排序模型 - 多 LoRA 适配器

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

安装#

安装 GenAI-Perf 最简单的方法是通过 Triton Server SDK 容器。使用以下命令安装最新版本

export RELEASE="yy.mm" # e.g. export RELEASE="24.06"

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

# Check out genai_perf command inside the container:
genai-perf --help

或者,从源代码安装

由于 GenAI-Perf 依赖于 Perf Analyzer,因此您需要安装 Perf Analyzer 二进制文件

安装 Perf Analyzer (Ubuntu, Python 3.8+)#

注意:您必须已安装 CUDA 12(查看 CUDA 安装指南)。

pip install tritonclient

apt update && apt install -y --no-install-recommends libb64-0d libcurl4

您也可以从源代码构建 Perf Analyzer。

从源代码安装 GenAI-Perf#

git clone https://github.com/triton-inference-server/perf_analyzer.git && cd perf_analyzer

pip install -e genai-perf

快速开始#

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

使用 Triton CLI 部署 GPT-2 TensorRT-LLM 模型#

您可以按照 Triton CLI github 仓库上的快速入门指南在本地运行 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}/models:/root/models \
    -v ${HOME}/.cache/huggingface:/root/.cache/huggingface \
    nvcr.io/nvidia/tritonserver:24.05-trtllm-python-py3

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

# 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

export RELEASE="yy.mm" # e.g. export RELEASE="24.06"

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

# Run GenAI-Perf in the container:
genai-perf profile \
  -m gpt2 \
  --service-kind triton \
  --backend tensorrtllm \
  --num-prompts 100 \
  --random-seed 123 \
  --synthetic-input-tokens-mean 200 \
  --synthetic-input-tokens-stddev 0 \
  --streaming \
  --output-tokens-mean 100 \
  --output-tokens-stddev 0 \
  --output-tokens-mean-deterministic \
  --tokenizer hf-internal-testing/llama-tokenizer \
  --concurrency 1 \
  --measurement-interval 4000 \
  --profile-export-file my_profile_export.json \
  --url localhost:8001

示例输出

                                   LLM Metrics
┏━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━┓
┃                Statistic ┃    avg ┃    min ┃    max ┃    p99 ┃    p90 ┃    p75 ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━━┩
│ Time to first token (ms) │  11.70 │   9.88 │  17.21 │  14.35 │  12.01 │  11.87 │
│ Inter token latency (ms) │   1.46 │   1.08 │   1.89 │   1.87 │   1.62 │   1.52 │
│     Request latency (ms) │ 161.24 │ 153.45 │ 200.74 │ 200.66 │ 179.43 │ 162.23 │
│   Output sequence length │ 103.39 │  95.00 │ 134.00 │ 120.08 │ 107.30 │ 105.00 │
│    Input sequence length │ 200.01 │ 200.00 │ 201.00 │ 200.13 │ 200.00 │ 200.00 │
└──────────────────────────┴────────┴────────┴────────┴────────┴────────┴────────┘
Output token throughput (per sec): 635.61
Request throughput (per sec): 6.15

有关更多示例,请参阅“教程”

可视化#

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 支持来自合成生成输入或 HuggingFace OpenOrcaCNN_DailyMail 数据集的模型输入提示。这使用 --input-dataset CLI 选项指定。

当数据集是合成数据集时,您可以指定以下选项: * --num-prompts <int>:要生成作为刺激的唯一提示的数量,>= 1。 * --synthetic-input-tokens-mean <int>:使用合成数据时,生成的提示中令牌数的平均值,>= 1。 * --synthetic-input-tokens-stddev <int>:使用合成数据时,生成的提示中令牌数的标准差,>= 0。 * --random-seed <int>:用于生成随机值的种子,>= 0。

当数据集来自 HuggingFace 时,您可以指定以下选项: * --input-dataset {openorca,cnn_dailymail}:用于基准测试的 HuggingFace 数据集。 * --num-prompts <int>:要生成作为刺激的唯一提示的数量,>= 1。

当数据集来自文件时,您可以指定以下选项: * --input-file <path>:包含要用于基准测试的提示的输入文件,格式为 JSON 对象。

对于任何数据集,您可以指定以下选项: * --output-tokens-mean <int>:每个输出中的令牌数的平均值。确保正确设置 --tokenizer 值,>= 1。 * --output-tokens-stddev <int>:每个输出中令牌数的标准差。仅当提供 output-tokens-mean 时才使用此选项,>= 1。 * --output-tokens-mean-deterministic:当使用 --output-tokens-mean 时,可以设置此标志以通过将最小令牌数设置为等于请求的令牌数来提高精度。当前 Triton 服务类型支持此功能。请注意,请求的输出令牌数仍然存在一些可变性,但 GenAi-Perf 会尽最大努力使用您的模型来获得正确的输出令牌数。

您可以选择使用以下选项设置其他模型输入: * --extra-inputs <input_name>:<value>:要与模型一起使用的附加输入,具有单个值,例如 stream:truemax_tokens:5。可以重复使用此标志来提供多个额外输入。

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

指标#

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

指标

描述

聚合方式

首个令牌时间

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

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

令牌间延迟

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

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

请求延迟

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

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

输出序列长度

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

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

输入序列长度

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

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

输出令牌吞吐量

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

无 – 每个基准测试一个值

请求吞吐量

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

无 – 每个基准测试一个值

命令行选项#

显示帮助消息并退出。

端点选项:#

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

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

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

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

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

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

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

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

输入选项#

GenAI-Perf 应发送的请求的批处理大小。当前仅 embeddings、image_retrieval 和 rankings 端点类型支持此功能。(默认值:1

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

要用于提示的 HuggingFace 数据集。(默认值:openorca

包含要用于性能分析的提示的输入文件。每行应是一个 JSON 对象,其中包含 JSONL 格式的“text_input”字段。示例:{“text_input”: “您的提示在此处”}”(默认值:)

要生成作为刺激的唯一提示的数量。(默认值:100

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

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

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

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

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

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

性能分析选项#

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

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

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

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

输出选项#

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

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

将生成 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

其他选项#

用于解释来自提示和响应的令牌指标的 HuggingFace 分词器。(默认值:hf-internal-testing/llama-tokenizer

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

打印版本并退出的选项。

已知问题#

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

  • 令牌计数可能不准确