llmperf 大模型性能测试工具怎么用,输出参数解读
衡量「预填(prefill) + 首 token 生成」这一步的延迟,对交互体验影响极大。同样提供 p25–p99、mean、min、max、stddev 等统计量,帮助查看尾部延迟情况。GenAI‑Perf/LLMPerf 工具会忽略空响应,保证 TTFT 测量有效性e2e包含了 prompt 发送、模型推理、token 流式接收以及网络传输等所有环节。用于衡量单次完整对话请求的响应速度。
大模型测试工具不是很多,用的人也少,找了很久发现一个llmperf,已经是我能找到的star最多的测试工具了(不到900个star,所以用的人真的很少呢)
使用llmperf可以测试你的本地模型的性能,对模型的可用性有一定参考,详细参数见下面的输出参数解读模块
llmperf安装
安装的话其实可以看一下下面这篇博客,讲的很好了:
https://blog.csdn.net/codelearning/article/details/138307201
简单说就是:
- 创建虚拟环境,建议使用conda来创建,可以指定python版本,我之前用的python3.11,安装的时候报版本太高。。。,python版本3.8~3.10都行
conda create --name llmperf-env python=3.10
- 在虚拟环境中安装torch和transformers(上面文章安装的是TensorFlow是不对的,torch和tensorFlow都是框架,用torch的人更多【简单易用】,transformers是huggingface的工具库封装了基于torch训练的大模型,扯多了,见下图);安装版本torch2.3.0 transformers4.40.1,使用-i指定镜像加速【阿里,清华的镜像都行】
pip install torch==2.3.0 transformers==4.40.1 -i https://mirrors.aliyun.com/pypi/simple
装好可以看一下版本:
python -c "import torch; print(torch.__version__)"
python -c "import transformers as tf; print(tf.__version__)"
- 下载好工具(没有代理的就下zip或者走ssh) ,安装环境
git clone https://github.com/ray-project/llmperf.git
cd llmperf
pip install -e . -i https://mirrors.aliyun.com/pypi/simple
- 下载分词器,下载到刚刚进入的llmperf目录下
https://huggingface.co/hf-internal-testing/llama-tokenizer/tree/main ,没代理就手动一个个下载好了一样的(如图)
clone记得开lfs :git lfs install
修改token_benchmark_ray.py文件,将tokenizer = LlamaTokenizerFast.from_pretrained(这里写你的绝对路径:/home/…/llmperf/llama-tokenizer),如图,这样就安装好了第一部分结束
llmperf测试
很简单,先export一下两个环境变量,我本地服务器跑的大模型没有设置密钥所以填EMPTY,我的模型在8000端口开启的
export OPENAI_API_BASE=http://192.168.1.1:8000/v1
export OPENAI_API_KEY=EMPTY
然后就是跑llmperf来测试啦:我跑的模型是qwen2.5-vl-32b-instruct-awq
python token_benchmark_ray.py \
--model "qwen2.5-vl-32b-instruct-awq" \
--mean-input-tokens 550 \
--stddev-input-tokens 150 \
--mean-output-tokens 150 \
--stddev-output-tokens 10 \
--max-num-completed-requests 100 \
--timeout 600 \
--num-concurrent-requests 10 \
--results-dir "vllm_perf_results" \
--llm-api openai \
--additional-sampling-params '{"temperature":0.7,"top_p":0.95}'
输入参数解读如下:
输出参数解读
下面是我得到的结果:
/home/xxx/miniconda3/envs/llmperf-env/lib/python3.10/site-packages/huggingface_hub/file_download.py:943: FutureWarning: resume_download is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use force_download=True. warnings.warn(tokenizer_config.json: 1.54kB [00:00, 11.4MB/s] tokenizer.model: 100%|█████████████████████████████████████████| 500k/500k [00:00<00:00, 688kB/s]
tokenizer.json: 1.84MB [00:00, 5.90MB/s]
special_tokens_map.json: 100%|██████████████████████████████████| 411/411 [00:00<00:00, 5.42MB/s]
2025-05-08 17:48:46,887 INFO worker.py:1888 -- Started a local Ray instance.
100%|██████████████████████████████████████████████████████████| 100/100 [01:03<00:00, 1.57it/s]
\Results for token benchmark for qwen2.5-vl-32b-instruct-awq queried with the openai api.
inter_token_latency_s
p25 = 0.03671828109180243
p50 = 0.03874993362618924
p75 = 0.039909537426762336
p90 = 0.041293648623867515
p95 = 0.04362051771892055
p99 = 0.04671712090020164
mean = 0.038581150767342025
min = 0.029227665513547038
max = 0.048129248938266755
stddev = 0.002935339058284726
ttft_s
p25 = 0.21586506074891076
p50 = 0.25239499600138515
p75 = 0.39776778800296597
p90 = 0.8405991723950137
p95 = 1.1285695109465428
p99 = 1.933300035657594
mean = 0.406071519060788
min = 0.08743653500278015
max = 1.9351992180017987
stddev = 0.404985755421724
end_to_end_latency_s
p25 = 5.356698050505656
p50 = 5.731171156505297
p75 = 6.1135260940027365
p90 = 6.555445644105203
p95 = 6.671672900408157
p99 = 7.1405543738747665
mean = 5.6924612127803265
min = 3.1065677699953085
max = 7.404943760993774
stddev = 0.7008350491133261
request_output_throughput_token_per_s
p25 = 29.83565149879071
p50 = 31.097004275889663
p75 = 32.29500237926665
p90 = 33.839887166134744
p95 = 34.738048991171986
p99 = 38.44776772911334
mean = 31.147770608416266
min = 23.498602124527366
max = 40.41212768268558
stddev = 2.367021838651855
number_input_tokens
p25 = 458.0
p50 = 541.0
p75 = 632.0
p90 = 712.7000000000003
p95 = 812.5999999999999
p99 = 967.6900000000004
mean = 543.73
min = 150
max = 1036
stddev = 158.06154376116166
number_output_tokens
p25 = 170.0
p50 = 178.0
p75 = 188.25
p90 = 195.10000000000002
p95 = 198.1
p99 = 202.04000000000002
mean = 176.45
min = 73
max = 206
stddev = 17.640274740754265
Number Of Errored Requests: 0
Overall Output Throughput: 276.650770445234
Number Of Completed Requests: 100
Completed Requests Per Minute: 94.07223704570156
我当时看这输出都蒙b了,学会之后还行,分为三类指标:
1. 延迟类 (Latency) 指标
1.1 Inter‑token latency (inter_token_latency_s)
定义:相邻两个输出 token 之间的生成时间。
p25、p50、p75 等分别是第 25、50、75 百分位的值,用来衡量延迟分布的中位数与尾部(p95、p99)特征。
mean(均值)、min、max、stddev (这个就是标准差)如常规统计量。
意义:低的 inter‑token latency 意味着模型在 streaming 模式下一口气吐 token 时更顺畅、卡顿更少。
1.2 Time to first token (ttft_s)
定义:从请求(prompt+问题)发出到第一个 token 返回的时间,常简称 TTFT。
衡量「预填(prefill) + 首 token 生成」这一步的延迟,对交互体验影响极大。
同样提供 p25–p99、mean、min、max、stddev 等统计量,帮助查看尾部延迟情况。
GenAI‑Perf/LLMPerf 工具会忽略空响应,保证 TTFT 测量有效性
1.3 End‑to‑end latency (end_to_end_latency_s)
定义:一次请求从发送到接收完所有 tokens 的总耗时。
e2e包含了 prompt 发送、模型推理、token 流式接收以及网络传输等所有环节。
用于衡量单次完整对话请求的响应速度。
2. 吞吐类 (Throughput) 指标
2.1 Request‑output throughput (request_output_throughput_token_per_s)
定义:单次请求内,输出 token 数量 ÷ e2e latency。
和常见的 TPS(Token‑Per‑Second) 类似,但是在每条会话的维度上统计[就是说是在一次问答的总时间内算tps]。
数值越大,说明模型在单位时间内输出 token 较快。
NVIDIA 文档中将其称为 TPS per user,随着并发增加,单用户 TPS 会下降
2.2 Overall Output Throughput
定义:整个测试期间,所有请求输出 token 总数 ÷ (测试总时长)。
包含了请求准备、prompt 生成、结果存储等额外开销,更贴近「系统吞吐」能力。
你看到的 Overall Output Throughput: 276.65 即表示整个跑 100 个请求过程中,平均每秒输出 ~276.65 tokens。
该计算方式同 NVIDIA 文档中 RPS 的 Token 版本,包含了 batch 外开销
提出一个问题:这不是很奇怪吗,我的oot的值276.650770445234居然大于rot的均值31.147770608416266,如果oot包含了请求准备、prompt 生成、结果存储等额外开销,不应该更慢吗,值应该更小啊.(解答见末尾:欢迎有懂的大佬一起解答)
2.3 Completed Requests Per Minute
定义:单位时间(1 分钟)内完成的请求数量。
反映系统在持续发送 load 时的吞吐能力,类似一般意义上的 QPS(Queries Per Second)指标,但以分钟为尺度。
3. Token 分布统计
3.1 Input Tokens (number_input_tokens)
定义:描述本次测试中每条请求的实际 prompt 长度分布(token 数)。
p50 = 541 表示半数请求的 prompt 长度 ≤ 541 tokens。
用于验证使用的均值/方差设置是否合理、样本是否偏离预期。
3.2 Output Tokens (number_output_tokens)
定义:类似地,统计生成长度分布,mean = 176.45 说明平均生成 ~176 tokens。
辅助定位输出长度对延迟/吞吐的影响。
这些分布来源于脚本里 --mean-input-tokens / --stddev-input-tokens 等参数生成的随机样本
3.3 其他参数
Number Of Errored Requests: 0
如字面含义,发送100次请求,响应失败的次数
Number Of Completed Requests: 100
如字面含义,发送100次请求,响应成功完成的次数
问题解答
问题:oot的值276.650770445234居然大于rot的均值31.147770608416266
答案是因为我设置了num-concurrent-requests 10,由于系统并非进行10次问答请求,当然会高出近10倍啦。
下面是我把并发请求数设置为1后的测试结果:
(llmperf-env) root@xxx-nvidia1:/home/xxx/llmperf# python token_benchmark_ray.py \
--model "qwen2.5-vl-32b-instruct-awq" \
--mean-input-tokens 550 \
--stddev-input-tokens 150 \
--mean-output-tokens 150 \
--stddev-output-tokens 10 \
--max-num-completed-requests 100 \
--timeout 600 \
--num-concurrent-requests 1 \
--results-dir "vllm_perf_results" \
--llm-api openai \
--additional-sampling-params '{"temperature":0.7,"top_p":0.95}'
/home/xxx/miniconda3/envs/llmperf-env/lib/python3.10/site-packages/huggingface_hub/file_download.py:943: FutureWarning: `resume_download` is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`.
warnings.warn(
2025-05-09 11:23:46,675 INFO worker.py:1888 -- Started a local Ray instance.
100%|█████████████████████████████████████████████████████████| 100/100 [05:58<00:00, 3.58s/it]
\Results for token benchmark for qwen2.5-vl-32b-instruct-awq queried with the openai api.
inter_token_latency_s
p25 = 0.024019897221220728
p50 = 0.024341752442065
p75 = 0.02456468575662581
p90 = 0.0249380634151514
p95 = 0.0249713240559665
p99 = 0.02538538969572794
mean = 0.02423677369852606
min = 0.022778028851058077
max = 0.02563222895945703
stddev = 0.0005686175518766108
ttft_s
p25 = 0.1649181812608731
p50 = 0.2000759395014029
p75 = 0.23421261347539257
p90 = 0.2620799354888734
p95 = 0.29337599394784775
p99 = 0.34820215106447006
mean = 0.19064070376101883
min = 0.03163052099989727
max = 0.37134033799520694
stddev = 0.07372454831836092
end_to_end_latency_s
p25 = 3.441202829264512
p50 = 3.625112871013698
p75 = 3.769933569492423
p90 = 3.8833440995018464
p95 = 3.9653962967786356
p99 = 4.127491182312078
mean = 3.5694785421903363
min = 2.3257206809939817
max = 4.136105104989838
stddev = 0.33310100129921594
request_output_throughput_token_per_s
p25 = 48.20364100127841
p50 = 49.260533083200876
p75 = 50.213554730587575
p90 = 50.86188554046079
p95 = 51.63199496851801
p99 = 53.42322238049862
mean = 49.26956190112304
min = 45.899079167040185
max = 53.85838011069674
stddev = 1.5331853762641627
number_input_tokens
p25 = 458.0
p50 = 551.0
p75 = 635.25
p90 = 738.5000000000001
p95 = 812.5999999999999
p99 = 967.6900000000004
mean = 546.16
min = 150
max = 1036
stddev = 159.38459426459286
number_output_tokens
p25 = 169.0
p50 = 177.5
p75 = 186.0
p90 = 193.10000000000002
p95 = 197.0
p99 = 201.01
mean = 175.78
min = 115
max = 202
stddev = 16.42527001146389
Number Of Errored Requests: 0
Overall Output Throughput: 49.096301903695064
Number Of Completed Requests: 100
Completed Requests Per Minute: 16.75832355342874
上面把并发请求设置为1后,发现:
request_output_throughput_token_per_s均值: mean = 49.26956190112304
Overall Output Throughput: 49.096301903695064
基本相当
更多推荐
所有评论(0)