打造专属AI智能助手(三)模型压测:vLLM+DeepSeek+OpenWebUI保姆级教程

123 阅读8分钟

本文较长,建议点赞收藏。更多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获取项目文件

项目地址:github.com/lework/llm-…

下载项目文件:

git clone https://github.com/lework/llm-benchmark.git

主要有两个脚本:

run_benchmarks.py:自动执行多轮压测,自动调整并发配置(1-300并发)。

llm_benchmark.py :核心并发测试实现,管理并发请求和连接池。

3.2命令行参数介绍

run_benchmarks.py 参数

参数说明默认值
--llm_urlLLM 服务器 URL必填
--api_keyAPI 密钥选填
--model模型名称deepseek-r1
--use_long_context使用长文本测试模式False

llm_benchmark.py 参数

参数说明默认值
--llm_urlLLM 服务器 URL必填
--api_keyAPI 密钥选填
--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