模型性能测试

关于模型性能测试

模型性能测试定义

  • 功能描述:模型性能测试旨在评估模型推理服务在真实部署环境中的运行效率(吞吐、延迟)
  • 要求:模型推理服务需支持流式接口/v1/chat/completions方式访问

如何进行模型性能测试

  1. 遵循下文模型性能测试运行脚本的指导编写脚本。注意:只有模型适配仓库管理员并且仓库硬件类型为npu,才可以启动模型性能测试
    image-20260311092702397
  2. 点击模型评测tab栏,进入模型评测页面。
    Snipaste_2026-03-11_09-29-21
  3. 在模型评测的页面,点击“性能测试”的tab,选择模型的权重文件,然后单击“立即测试”,发起性能测试。
    Snipaste_2026-03-11_09-30-26
  4. 等待性能测试用例执行完成。
    Snipaste_2026-03-11_09-30-26
  5. (可选) 当模型处于“测试中”时,用户可以单击“终止测试”手动停止性能测试。
  6. 当性能评测执行完成后,在“性能测试”区域显示测试状态,并提供测试日志和评测报告下载。
    Snipaste_2026-03-11_09-30-26

模型性能测试运行脚本

模型性能测试脚本以deploy.sh为入口。脚本编写请严格遵照本文档的规范

模型性能测试的适配仓库须包含以下两个文件:

  • requirements.txt:该脚本运行需配置的相应module ,如果没有需要安装的依赖,则无需创建 (非必须)。
  • deploy.sh: 模型评测服务基于该脚本安装依赖和启动此模型适配项目 (必须)。

文件位置

requirements.txt和deploy.sh必须位于仓库根目录下。

requirements.txt文件(可选)

请设置NPU下运行该脚本需要配置的对应依赖,Torch_npu、Cann和Python根据选择的框架版本由环境提供,因此在requirements.txt中不需要重复上述依赖的添加(可能会导致依赖安装冲突异常)。库的依赖脚本格式示例如下:

transformers==4.37.0
accelerate==0.27.2

如果不需要添加任何依赖,该.txt文件可不提供,测试任务会跳过依赖安装。

deploy.sh文件

该文件是一个执行启动模型适配推理的shell脚本,该推理脚本运行方式无严格限制,以下为脚本规范。

执行安装依赖编写示例(可选)

python3 -m pip install --upgrade pip setuptools wheel

构造执行脚本所需要的入参

模型权重由自动化测试执行侧根据模型评测发起时页面选择模型权重仓库,在执行测试的时候下载。在shell脚本中,如果需要传入权重路径,可以通过环境变量"$MODEL_PATH"获取权重文件所在的path路径。如vllm启动项目,则传入模型path路径示例如下:

vllm serve "$MODEL_PATH"  --trust-remote-code --tensor-parallel-size 1 --dtype float16   --max-num-seqs 4  --gpu-memory-utilization 0.95

适配代码编写要求

适配推理代码需要提供标准的openapi推理接口,并且启动http server服务的端口必须为:8000。模型评测服务会根据选择的模型权重文件任务类型调用对应的推理接口进行模型评测 目前已经支持评测任务类型如下:

任务类型任务编码推理接口path
文本生成text-generation/v1/chat/completions
图片转文本image-text-to-text/v1/chat/completions
多模态any-to-any/v1/chat/completions

注:模型性能测试服务依赖请求/v1/chat/completions进行测试,如果不存在此推理接口,会导致精度评测任务失败。

模型权重文件大小限制

  • 大小上限:100GB
  • 限制说明:适配模型权重文件存储大小不得超出上限。
  • 影响范围:若超出限制,将触发模型权重文件下载失败,直接导致模型评测任务失败。

全流程代码示例

deploy.sh

  • vllm适配验证示例:
#!/bin/sh
set -e
echo "=== MODEL_PATH set to: $MODEL_PATH ==="
vllm serve "$MODEL_PATH"  --trust-remote-code --tensor-parallel-size 1 --dtype float16   --max-num-seqs 4  --gpu-memory-utilization 0.95

注:上面示例为vllm启动方式,无需设置–served-model-name,模型评测服务会自动使用模型权重的path作为serverd-model-name.

性能测试报告

性能评测执行成功以后,下载精度测试报告,解压缩以后,包含以下文件夹:configs、logs、performance,

最终生成的目录结构如下:

ee9480acbbac4d4aa190a124d5ddf39c/
├── configs               # 自动存储的所有已转储配置文件
├── logs                  # 执行过程中日志,命令中如果加--debug,不会有过程日志落盘(都直接打印出来了)
│   └── performance/      # 推理阶段的日志文件
└── performance           # 性能测评结果
│    └── vllm-api-stream-chat/          # “服务化模型配置”名称,对应模型任务配置文件中models的 abbr参数
│         ├── gsm8kdataset.csv          # 单次请求性能输出(CSV),与性能结果打屏中的Performance Parameters表格一致
│         ├── gsm8kdataset.json         # 端到端性能输出(JSON),与性能结果打屏中的Common Metric表格一致
│         ├── gsm8kdataset_details.json # 全量打点日志(JSON)
│         └── gsm8kdataset_plot.html    # 请求并发可视化报告(HTML)

查看性能结果

性能结果打印在评测日志中的示例如下:

03/26 20:22:24 - AISBench - INFO - Performance Results of task: vllm-api-stream-chat/gsm8kdataset:

╒══════════════════════════╤═════════╤══════════════════╤══════════════════╤══════════════════╤══════════════════╤══════════════════╤══════════════════╤══════════════════╤══════╕
│ Performance Parameters   │ Stage   │ Average          │ Min              │ Max              │ Median           │ P75              │ P90              │ P99              │  N   │
╞══════════════════════════╪═════════╪══════════════════╪══════════════════╪══════════════════╪══════════════════╪══════════════════╪══════════════════╪══════════════════╪══════╡
│ E2EL                     │ total   │ 2048.2945  ms    │ 1729.7498 ms     │ 3450.96 ms       │ 2491.8789 ms     │ 2750.85 ms       │ 3184.9186 ms     │ 3424.4354 ms     │ 8    │
├──────────────────────────┼─────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────┤
│ TTFT                     │ total   │ 50.332 ms        │ 50.6244 ms       │ 52.0585 ms       │ 50.3237 ms       │ 50.5872 ms       │ 50.7566 ms       │ 50 .0551 ms      │ 8    │
├──────────────────────────┼─────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────┤
│ TPOT                     │ total   │ 10.6965 ms       │ 10.061 ms        │ 10.8805 ms       │ 10.7495 ms       │ 10.7818 ms       │ 10.808 ms        │ 10.8582 ms       │ 8    │
├──────────────────────────┼─────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────┤
│ ITL                      │ total   │ 10.6965 ms       │ 7.3583 ms        │ 13.7707 ms       │ 10.7513 ms       │ 10.8009 ms       │ 10.8358 ms       │ 10.9322 ms       │ 8    │
├──────────────────────────┼─────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────┤
│ InputTokens              │ total   │ 1512.5           │ 1481.0           │ 1566.0           │ 1511.5           │ 1520.25          │ 1536.6           │ 1563.06          │ 8    │
├──────────────────────────┼─────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────┤
│ OutputTokens             │ total   │ 287.375          │ 200.0            │ 407.0            │ 280.0            │ 322.75           │ 374.8            │ 403.78           │ 8    │
├──────────────────────────┼─────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────┤
│ OutputTokenThroughput    │ total   │ 115.9216 token/s │ 107.6555 token/s │ 116.5352 token/s │ 117.6448 token/s │ 118.2426 token/s │ 118.3765 token/s │ 118.6388 token/s │ 8    │
╘══════════════════════════╧═════════╧══════════════════╧══════════════════╧══════════════════╧══════════════════╧══════════════════╧══════════════════╧══════════════════╧══════╛
╒══════════════════════════╤═════════╤════════════════════╕
│ Common Metric            │ Stage   │ Value              │
╞══════════════════════════╪═════════╪════════════════════╡
│ Benchmark Duration       │ total   │ 19897.8505 ms      │
├──────────────────────────┼─────────┼────────────────────┤
│ Total Requests           │ total   │ 8                  │
├──────────────────────────┼─────────┼────────────────────┤
│ Failed Requests          │ total   │ 0                  │
├──────────────────────────┼─────────┼────────────────────┤
│ Success Requests         │ total   │ 8                  │
├──────────────────────────┼─────────┼────────────────────┤
│ Concurrency              │ total   │ 0.9972             │
├──────────────────────────┼─────────┼────────────────────┤
│ Max Concurrency          │ total   │ 1                  │
├──────────────────────────┼─────────┼────────────────────┤
│ Request Throughput       │ total   │ 0.4021 req/s       │
├──────────────────────────┼─────────┼────────────────────┤
│ Total Input Tokens       │ total   │ 12100              │
├──────────────────────────┼─────────┼────────────────────┤
│ Prefill Token Throughput │ total   │ 17014.3123 token/s │
├──────────────────────────┼─────────┼────────────────────┤
│ Total generated tokens   │ total   │ 2299               │
├──────────────────────────┼─────────┼────────────────────┤
│ Input Token Throughput   │ total   │ 608.7438 token/s   │
├──────────────────────────┼─────────┼────────────────────┤
│ Output Token Throughput  │ total   │ 115.7835 token/s   │
├──────────────────────────┼─────────┼────────────────────┤
│ Total Token Throughput   │ total   │ 723.5273 token/s   │
╘══════════════════════════╧═════════╧════════════════════╛

03/26 20:22:24 - AISBench - INFO - Performance Result files locate in outputs/default/20250605_202220/performances/vllm-api-stream-chat.

性能测评结果说明

性能测评结果包括单个推理请求性能输出结果和端到端性能输出结果,参数说明如下:

单个推理请求性能输出结果

部分统计指标解释如下所示:

  • P75 / P90 / P99:以 TPOT 为例,表示所有请求的 TPOT 值分别处于第 75、90、99 百分位的性能表现。
  • E2EL(End-to-End Latency):单个请求从发送到接收全部响应的总时延。
  • TTFT(Time To First Token):首个 Token 返回的时延。
  • TPOT(Time Per Output Token):输出阶段每个 Token 的平均生成时延(不含首个 Token)。
  • ITL(Inter-token Latency):相邻 Token 间的平均间隔时延(不含首个 Token)。
  • InputTokens:请求的输入 Token 数量。
  • OutputTokens:请求生成的输出 Token 数量。
  • OutputTokenThroughput:输出 Token 的吞吐率(Token/s)。
  • Tokenizer:Tokenizer 编码耗时。
  • Detokenizer:Detokenizer 解码耗时。
Performance ParametersStageAverageMaxMinMedianP75P90P99N
E2EL统计此参数的阶段平均请求时延最大请求时延最小请求时延请求时延中位数请求时延75分位值请求时延90分位值请求时延99分位值测试数据量,来源于输入参数
TTFT统计此参数的阶段首个token平均时延首个token最大时延首个token最小时延首个token中位数时延首个token75分位时延首个token90分位时延首个token99分位时延测试数据量,来源于输入参数
TPOT统计此参数的阶段Decode阶段平均时延最大Decode阶段时延最小Decode阶段时延Decode阶段中位数时延75分位Decode阶段时延90分位每条请求Decode阶段平均时延99分位Decode阶段时延测试数据量,来源于输入参数
ITL统计此参数的阶段token间平均时延token间最大时延token间最小时延token间中位数时延token间75分位时延token间90分位时延token间99分位时延测试数据量,来源于输入参数
InputTokens统计此参数的阶段输入token平均长度最大输入token长度最小输入token长度输入token中位数长度75分位输入token长度90分位输入token长度99分位输入token长度测试数据量,来源于输入参数
OutputTokens统计此参数的阶段输出token平均长度最大输出token长度最小输出token长度输出token中位数长度75分位输出token长度90分位输出token长度99分位输出token长度测试数据量,来源于输入参数
OutputTokenThroughput统计此参数的阶段平均输出吞吐最大输出吞吐最小输出吞吐中位数输出吞吐输出吞吐75分位输出吞吐90分位输出吞吐99分位测试数据量,来源于输入参数

端到端性能输出结果

参数说明
Benchmark Duration测试任务的总执行时间
Total Requests请求总数量
Failed Requests请求失败数量(包含无响应或响应为空)
Success Requests成功返回的请求数量(包括空响应与非空响应)
Concurrency实际平均并发数
Max Concurrency配置的最大并发数
Request Throughput请求级吞吐率(请求数/秒)
Total Input Tokens所有请求的总输入 Token 数
Prefill Token ThroughputPrefill 阶段的 Token 吞吐率
Total Output Tokens所有请求生成的总输出 Token 数
Input Token Throughput输入 Token 吞吐率
Output Token Throughput输出 Token 吞吐率
Total Token Throughput总 Token 吞吐率(输入 + 输出)

性能测试可视化并发图使用说明

该并发图用于展示性能测评过程中的详细推理耗时,包括:

  • 请求力度耗时展示:每条请求的详细处理耗时,包含Prefill 阶段耗时、Decode 阶段耗时以及请求完整耗时
  • 实时并发数展示:反映测试过程中的并发变化趋势,帮助判断请求调度与系统吞吐能力。

核心功能

  • 精细化耗时分析:可对每条请求的处理过程进行拆解,识别性能瓶颈是否集中在 prefill 或 decode 阶段。
  • 并发动态可视化:展示整个测试期间的并发水平波动,辅助评估系统在高并发压力下的稳定性与响应效率。
  • 支持大规模请求回放:适用于高压测试,分析模型或服务在持续负载下的表现。

使用场景

  • 性能调优:识别瓶颈点,为模型推理服务的延迟优化、并发控制、批量处理策略调整提供数据支持。
  • 推理服务压测验证:对部署后的服务进行压力测试,确保在目标并发场景下性能达标。
  • 部署方案评估:对比不同模型、不同部署方式(如本地 vs 服务化)在相同负载下的响应表现。

数据生成方式: 性能测试将自动生成一份 HTML 可视化报告。使用任意主流浏览器打开该文件,即可交互式查看每条请求的详细耗时信息和全程并发曲线。


性能报告文件查看

1. 视图控制

鼠标滑动至图的右上角可显示导航栏

导航栏说明

从左到右按顺序

名称符号作用图例
Download照相机将当前视图截屏并保存为png格式
download
Zoom放大镜开启Zoom模式,详见下表 鼠标操作说明 中的 鼠标拖拽画布
zoom
Pan正十字开启Pan模式,详见下表 鼠标操作说明 中的 鼠标拖拽画布
pan
Zoom in加号以当前视图为中心,等比例同时放大上下两张图
zoom_in
Zoom out减号以当前视图为中心,等比例同时缩小上下两张图
zoom_out
Autoscale斜十字 + 四角外框根据数据规模,重置全图
autoscale
Reset axes房屋根据初始设置,重置全图
reset_axes

2. 数据查看

  • 参考样例
    • 全图总览
      full_plot_example
    • 请求线段图
      • 带Decode阶段图例
        index_chart
      • 不带Decode阶段图例
        without_decode_chart_example
    • 并发阶梯图
      concurrency_chart
  • 图例说明与计算
    • 请求线段图
      • 每条水平线段:由红、蓝两部分,或只由红色部分组成,表示一条请求的E2EL
      • 红色线段:TTFT,即首Token时延
      • 蓝色线段:Decode, 即非首Token时延
      • 值的计算
        • TTFT = prefill_latency
        • Decode = end_time - (start_time + prefill_latency)
        • End-to-End Latency(E2EL) = end_time - start_time
    • 并发阶梯图
      • 绿色线段:表示随着时间变化而变化的实时请求并发数
      • 值的计算:截取当前时间点的请求数量
  • 悬停文本框
    • 请求线段图:光标悬停在每条请求线段最开始的数据点附近,显示:首Token时延(TTFT)、非首Token时延(Decode)、该请求总时长(E2EL)
    • 并发阶梯图:光标悬停在新事件的转折拐角点,显示:时间戳(Time)、并发数(Concurrency)
  • 坐标轴说明
    • 请求线段图:
      • 横坐标:相对时间线,起始点:0,单位:s
      • 纵坐标:请求索引,起始点:1
    • 并发阶梯图:
      • 横坐标:相对时间线,起始点:0,单位:s
      • 纵坐标:请求并发个数,起始点:1

注:以上性能测试结果说明资料来源: AISBench官网