目录
1 概述
浪潮信息KOS是浪潮信息基于Linux Kernel、OpenAnolis等开源技术自主研发的一款服务器操作系统,支持x86、ARM等主流架构处理器,性能和稳定性居于行业领先地位,具备成熟的 CentOS 迁移和替换能力,可满足云计算、大数据、分布式存储、人工智能、边缘计算等应用场景需求。详细介绍见官网链接https://www.ieisystem.com/kos/product-kos-xq.thtml?id=12126
vLLM是一种用于大规模语言模型(LLM)推理的框架,旨在提高模型的吞吐量和降低延迟。vLLM通过优化内存管理和调度策略,显著提升了模型在高并发场景下的性能。vLLM利用了一种名为PagedAttention的注意力机制,该机制借鉴了虚拟内存和分页技术,以减少缓存内存(KV Cache)的浪费,并允许在请求之间灵活共享KV缓存。这种设计使得vLLM在保持与现有系统相同延迟水平的情况下,能够将吞吐量提高2到4倍。官方网址:https://www.vllm.ai
本篇文章主要介绍如何在KOS操作系统上进行vLLM基准性能测试,及benchmark测试,vLLM benchmark 测试是针对 vLLM 推理服务框架的性能评估过程,旨在量化其处理大规模语言模型推理任务时的效率、吞吐量和延迟表现,覆盖典型测试场景,包括单GPU/多GPU、不同模型规模、批处理效果等。
2 环境准备
操作系统版本:KOS 5.8 sp2u1(5.10.134-17.2.2.kos5.x86_64)
测试架构:x86_64,96核1TB物理机
显卡:NVIDIA Tesla V100s * 2
Docker镜像: vllm/vllm-openai:latest
模型:DeepSeek-R1-Distill-Llama-8B
3 性能测试
3.1 下载vllm源码
1、创建挂载容器目录:
mkdir –p /data
2、下载vllm源码到指定目录
cd /data
git clone https://github.com/vllm-project/vllm.git vllm_source
3.2 启动vllm容器
创建容器:
docker run --name ds-vllm-test --gpus all -ti --privileged -v /root/:/workspace -v /data/:/data --ipc=host -p 8090:8090 --security-opt seccomp=unconfined --entrypoint /bin/sh docker.1ms.run/vllm/vllm-openai:latest
3.3 手动测试
进入容器:
docker exec -it ds-vllm-test bash
prefill预填充性能测试:
Prefill阶段为模型接收到完整输入之后,在开始生成第一个输出token之前,反映模型在处理输入序列时的速度。
执行benchmark测试命令:
python3 /data/vllm_source/benchmarks/benchmark_latency.py \--model /data/ssdmodels/DeepSeek-R1-Distill-Llama-8B \--trust-remote-code \--tokenizer /data/ssdmodels/DeepSeek-R1-Distill-Llama-8B \--input-len 500 \--output-len 1 \--batch-size 1 \--tensor-parallel-size 2 \--num-iters-warmup 1 \--num-iters 1 \--dtype=half \--max-model-len 4096 |
---|
其中:
参数 | 值 | 含义 |
---|---|---|
--model | /data/ssdmodels/DeepSeek-R1-Distill-Llama-8B | 指定要测试的模型路径(Hugging Face 格式的模型目录)。 |
--trust-remote-code | / | 允许加载模型时执行远程代码(如自定义的 modeling.py),通常用于非标准模型。 |
--tokenizer | /data/ssdmodels/DeepSeek-R1-Distill-Llama-8B | 指定分词器路径,若与模型路径不同时需单独设置。 |
--input-len | 500 | 输入序列的长度(token 数量),模拟长文本输入场景。 |
--output-len | 1 | 输出序列的长度(token 数量),此处测试生成 1 个 token 的延迟。 |
--batch-size | 1 | 批量大小(每次处理的请求数),设为 1 表示单请求测试。 |
--tensor-parallel-size | 2 | 张量并行度(GPU 数量),表示模型在 2 个 GPU 上并行计算。 |
--num-iters-warmup | 1 | 预热迭代次数(不记录结果),用于消除冷启动影响。 |
--num-iters | 1 | 正式测试迭代次数,结果取平均值 |
--dtype | half | 模型精度(half 即 FP16),可减少显存占用并提升计算速度。 |
--max-model-len | 4096 | 模型支持的最大上下文长度(token 数),超出会报错。 |
测试结果:
获取到Avg latency值0.13214380299905315 seconds
计算prefill性能(tokens/s):input-len / Avg latency = 500/0.13214380299905315 = 3783
decode解码性能测试:
decode解码阶段为prefill预填充阶段完成之后开始,到完成所有输出,体现模型生成输出序列的速度。
执行benchmark测试命令
python3 /data/vllm_source/benchmarks/benchmark_latency.py \--model /data/ssdmodels/DeepSeek-R1-Distill-Llama-8B \--trust-remote-code \--tokenizer /data/ssdmodels/DeepSeek-R1-Distill-Llama-8B \--input-len 500 \--output-len 200 \--batch-size 1 \--tensor-parallel-size 2 \--num-iters-warmup 1 \--num-iters 1 \--dtype=half \--max-model-len 4096 |
---|
获取到Avg latency值2.824540817004163 seconds
计算decode性能(tokens/s):output-len/( – ) = 200/(2.824540817004163 - 0.13214380299905315) = 74
3.4 编写脚本测试
如果要进行不同参数组合的交叉测试,可以编写自动化测试脚本,例如测试batch-size为1,2,4,8;max-model-len为1024,4096,8192的性能:
#!/bin/bash#测试batch-size为1,2,4,8;max-model-len为1024,4096,8192的性能model_path="/data/ssdmodels/DeepSeek-R1-Distill-Llama-8B"input_len=500output_len=1tp=2vllm_path="/data/vllm_source"for i in {1,2,4,8}do for m in {1024,4096,8192} do python3 ${vllm_path}/benchmarks/benchmark_latency.py --model $model_path --trust-remote-code --tokenizer $model_path --input-len $input_len --output-len $output_len --batch-size $i --tensor-parallel-size ${tp} --num-iters-warmup 1 --num-iters 1 --dtype=half --max-model-len $m >> vllm_V100s_DeepSeek8B_tp${tp}_input${input_len}_output${output_len}_maxtoken${m}_batch${i}.log sleep 5 donedoneoutput_len=200for i in {1,2,4,8}do for m in {1024,4096,8192} do python3 ${vllm_path}/benchmarks/benchmark_latency.py --model $model_path --trust-remote-code --tokenizer $model_path --input-len $input_len --output-len $output_len --batch-size $i --tensor-parallel-size ${tp} --num-iters-warmup 1 --num-iters 1 --dtype=half --max-model-len $m >> vllm_V100s_DeepSeek8B_tp${tp}_input${input_len}_output${output_len}_maxtoken${m}_batch${i}.log sleep 5 donedone |
---|
之后依次读取log文件,将数据整理到表格中: