本文较长,建议点赞收藏。更多AI大模型应用开发学习视频及资料,在智泊AI。
模型部署完毕之后,资源利用率如何?模型稳定性如何?吞吐量怎么样?并发能力怎么样?能不能满足生产需求(比如1万人的日常使用)。这时候就需要使用专有的压测工具对其进行评估,以便在测试环境优化调整,最终发布到生产使用。
那么如何全面的评估模型稳定性、性能以及用户体验,比如并发数、请求延迟、首token延迟TTFT、总吞吐量等,有哪些需要关注的指标,有没有专业的工具?今天我们就来介绍模型性能的评估指标和方法,附实战测试。
1、大模型推理性能指标
通常我们会关注以下的核心指标,主要衡量模型整体性能和吞吐能力和单个请求的性能和响应效:
(1)首token时间(Time to First Token, TTFT)从发送请求到生成第一个token的时间(以秒为单位),评估首包延时
(2)输出token间时延(Inter-token Latency, ITL)生成每个输出token间隔时间(以秒为单位),评估输出是否平稳
(3)每token延迟(Time Per Output Token, TPOT)生成每个输出token所需的时间(不包含首token,以秒为单位),评估解码速度,它决定了内容生成的流畅度和连贯性。
(4)输出吞吐量(Throughput)每秒输出的token数量。它反映了系统的整体处理能力,通常以“tokens/s”衡量。
(5)并发效率(Concurrency Efficiency)每个并发请求的平均令牌生成速率,用于评估系统在并发场景下的扩展性。并发效率=总吞吐量/并发数
(6)端到端延迟(Latency)从发送请求到接收完整响应的时间(以秒为单位):TTFT + TPOT * Output tokens
2、大模型压测工具选择与对比
业界主流的大模型压测工具主要有:EvalScope、SGLang Bench、LLM-Benchmark。
EvalScope 是魔搭社区倾力打造的模型评测与性能基准测试框架,支持多种模型评测,包括大语言模型、多模态模型、Embedding 模型、AIGC模型(图生文/视频)等,内置多个业界认可的测试基准和评测指标:MMLU、CMMLU、C-Eval、GSM8K 等,提供模型推理服务压测工具和详细统计,为您的模型评估需求提供一站式解决方案。
LLM-Benchmark是一款开源的LLM并发性能测试工具,旨在提供自动化模型压力测试和性能报告生成能力,使用LLM-Benchmark,用户可以在不同并发场景下评估模型服务的性能、稳定性以及用户体验,为模型部署和优化提供数据支持。
3、LLM-Benchmark压测
3.1获取项目文件
下载项目文件:
git clone https://github.com/lework/llm-benchmark.git
主要有两个脚本:
run_benchmarks.py:自动执行多轮压测,自动调整并发配置(1-300并发)。
llm_benchmark.py :核心并发测试实现,管理并发请求和连接池。
3.2命令行参数介绍
run_benchmarks.py 参数
| 参数 | 说明 | 默认值 |
|---|---|---|
| --llm_url | LLM 服务器 URL | 必填 |
| --api_key | API 密钥 | 选填 |
| --model | 模型名称 | deepseek-r1 |
| --use_long_context | 使用长文本测试模式 | False |
llm_benchmark.py 参数
| 参数 | 说明 | 默认值 |
|---|---|---|
| --llm_url | LLM 服务器 URL | 必填 |
| --api_key | API 密钥 | 选填 |
| --model | 模型名称 | deepseek-r1 |
| --num_requests | 总请求数 | 必填 |
| --concurrency | 并发数 | 必填 |
| --output_tokens | 输出 token 数限制 | 50 |
| --request_timeout | 请求超时时间(秒) | 60 |
| --output_format | 输出格式(json/line) | line |
3.3压测实战
(1)安装配置python虚拟环境
运行这两个脚本,需要安装一些python包,所以在虚拟环境执行比较安全。
apt install python3.10-venv
python3 -m venv llm_benchmark_test
source llm_benchmark_test/bin/activate
pip install numpy openai -i https://mirrors.aliyun.com/pypi/simple
[#运行run]()_benchmarks.py时需要
pip install rich -i https://mirrors.aliyun.com/pypi/simple
(2)执行单次并发测试
测试命令,总请求数100,并发数10(这里因为H20环境铲了,临时用L20的环境测试的数据):
python3 llm_benchmark.py \
--llm_url "http://localhost:8000/v1" \
--api_key "OPENWEBUI123" \
--model "deepseek-r1" \
--num_requests 100 \
--concurrency 10
测试结果:
可以看到每秒请求数RPS:4.6,平均延迟:2.2秒,首token响应TTFT:0.19秒,TPS:22.6 token/s。
(3)运行全套性能测试
执行全套性能测试,会自动调整并发配置(1-300并发),最后给出详细的报告和建议:
执行命令:
python3 run_benchmarks.py \
--llm_url "http://localhost:8000/v1" \
--api_key "OPENWEBUI123" \
--model "deepseek-r1" \
--use_long_context
输出结果如下:
结果解读:
在并发300的情况下,每秒请求数RPS:32,平均延迟:9秒,TPS只有10,这个结果就没有那么理想,DeepSeek官方给的是TPS:50,所以最后工具给出的最佳配置是并发数200。
下面这个图是在4*NVIDIA L20 48GB环境下的测试结果,可以做个对照:
4、EvalScope压测
(1)安装evalscope
这里只安装模型推理压测依赖包和可视化包:
# 安装 模型压测模块 依赖
pip install evalscope[perf] -U -i https://mirrors.aliyun.com/pypi/simple
# 安装 可视化 相关依赖
pip install evalscope[app] -U -i https://mirrors.aliyun.com/pypi/simple
(2)测试用例设计
测试用例尽量使用不同输入长度、并发场景和模型能力维度,确保测试的全面性和真实性。
输入长度覆盖:针对模型的上下文处理特性,应覆盖1k、16k、64k token等不同场景,通过 --max-prompt-length进行设置。
并发场景覆盖:这个需要看业务需求进而设置不同的并发,通过--parallel和 --number 设置。
模型能力度覆盖:这里主要测试推理能力,所以推荐使用GSM8K、MATH等数据集评估数学推理能力。evalscope提供openqa、random等真实场景数据集,openqa从modelscope自动下载OpenQA,prompt长度较短,一般在100token以下;random会根据prefix-length,max-prompt-length和min-prompt-length随机生成prompt,但需要指定tokenizer-path。
这里我们使用random数据集,由于要自己生成数据集,所以需要指定使用的分词器,然后测试过程耗时也比较久。
(3)并发测试
测试命令:
evalscope perf \
--parallel 1 10 50 100 200 \
--number 10 20 100 200 400 \
--api-key OPENWEBUI123 \
--model deepseek-r1 \
--url http://127.0.0.1:8000/v1/chat/completions \
--api openai \
--dataset random \
--max-tokens 1024 \
--min-tokens 1024 \
--prefix-length 0 \
--min-prompt-length 1024 \
--max-prompt-length 1024 \
--tokenizer-path /data/DeepSeek/DeepSeek-R1-Distill-Qwen-32B \
--extra-args '{"ignore_eos": true}' [#请求中的额外参数](),此参数为忽略结束token
常用参数解析:
--model 测试模型名称。
--url 指定API地址,支持/chat/completion和/completion两种endpoint。
--api 指定服务API,目前支持[openai|dashscope|local|local_vllm]。
--api-key API密钥,可选。
--debug 输出调试信息。
--connect-timeout 网络连接超时,默认为600s。
--parallel 并发请求的数量,可以传入多个值,用空格隔开;默认为1。
--number 发出的请求的总数量,可以传入多个值,用空格隔开(需与parallel一一对应);默认为1000。
--stream 使用SSE流输出,默认为True。注意:需要设置--stream以测量Time to First Token (TTFT)指标;设置--no-stream将不使用流式输出。
-max-prompt-length 最大输入prompt长度,默认为131072,大于该值时,将丢弃prompt。
--min-prompt-length 最小输入prompt长度,默认为0,小于该值时,将丢弃prompt。
--prefix-length promt的前缀长度,默认为0,仅对于random数据集有效。
--prompt 指定请求prompt,一个字符串或本地文件,使用优先级高于dataset。使用本地文件时,通过@/path/to/file指定文件路径,例如@./prompt.txt。
--dataset 可以指定如下数据集模式:openqa、random
--tokenizer-path 可选,指定分词器权重路径,用于计算输入和输出的token数量,通常与模型权重在同一目录下。使用random数据集时必须。
--max-tokens 可以生成的最大token数量
--min-tokens 生成的最少token数量
测试结果:
Evalscope评测的结果也是建议设置200的并发性能最优,RPS:3.42,吞吐:7007 token/s,首token延迟TTFT:0.428s 每token延迟:0.028s。
(4)可视化测试结果
这里使用官方提供的Swalab进行可视化测试结果:
先安装Swalab,并获取对应的API Key,这里使用在线的看板模式,所以需要登录swanlab.cn/并注册获取Key。
key在这里查看:swanlab.cn/space/~/set…
然后在启动模型评估测试时,添加如下参数:
# ...--swanlab-api-key 'swanlab_api_key'--name 'name_of_swanlab_log'
测试命令运行完毕之后,会自动将测试报告上传至在线Swalab:
可以直观的看到测试的结果情况:
总结:
本篇在前两篇环境准备和模型部署的基础上,对使用docker+vLLM+DeepSeek部署的模型进行压测和评估,以便获取性能指标的实际情况,为优化模型服务提供参考。
学习资源推荐
如果你想更深入地学习大模型,以下是一些非常有价值的学习资源,这些资源将帮助你从不同角度学习大模型,提升你的实践能力。
本文较长,建议点赞收藏。更多AI大模型应用开发学习视频及资料,在智泊AI。