Qwen 系列大模型 Speed Benchmark 实战指南:transformer 与 vLLM 双引擎效率评测完整流程

Qwen 系列大模型 Speed Benchmark 实战指南:transformer 与 vLLM 双引擎效率评测完整流程 Qwen 系列大模型 Speed Benchmark 实战指南transformer 与 vLLM 双引擎效率评测完整流程【免费下载链接】Qwen1.5Qwen3 is the large language model series developed by Qwen team, Alibaba Cloud.项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen1.5本文基于 Qwen 开源仓库中 examples/speed-benchmark/README_zh.md 整理而成系统讲解 Qwen2.5 系列模型含原始模型与量化模型的效率测试方法覆盖环境搭建、EvalScope 工具评测、官方脚本评测三种执行路径并深入剖析仓库内 speed_benchmark_transformers.py 与 speed_benchmark_vllm.py 两个脚本的底层实现。读完本文你将掌握 tokens/s 与显存占用的测量原理能够在自己的 GPU 环境上复现一套可对比、可归档的速度基准测试。1. 适用范围与模型资源本套效率测试流程面向Qwen2.5 系列模型原始 bf16 模型与 GPTQ、AWQ 等量化模型核心评测指标为推理速度以 tokens/s 为单位显存占用以 GB 为单位transformers 脚本统计。评测分别在HuggingFace transformers与vLLM两种推理引擎上执行对应两套独立环境与脚本。模型资源方面仓库文档给出了两个获取入口托管在 HuggingFace 的 Qwen2.5 模型集合以及托管在 ModelScope 的 Qwen2.5 模型集合两者均包含 Instruct、量化等不同变体可直接以模型 ID如Qwen/Qwen2.5-0.5B-Instruct传给脚本或评测工具。说明仓库 examples/README.md 明确指出examples目录下的示例当前暂未针对 Qwen3 更新因此本流程以 Qwen2.5 系列为基准版本如果你关注 Qwen3 系列的最新速度数据可参见 docs/source/getting_started/speed_benchmark.md详见本文第 6 节。2. 环境准备两套独立评测环境由于 transformers 与 vLLM 的依赖存在版本差异官方文档明确要求分别创建两个 conda 虚拟环境避免依赖冲突。2.1 transformers 推理环境conda create -n qwen_perf_transformers python3.10 conda activate qwen_perf_transformers pip install torch2.3.1 pip install githttps://github.com/AutoGPTQ/AutoGPTQ.gitv0.7.1 pip install githttps://github.com/Dao-AILab/flash-attention.gitv2.5.8 pip install -r requirements-perf-transformers.txt其中torch、AutoGPTQ、flash-attention需要单独安装不能通过 requirements 文件安装requirements-perf-transformers.txt则声明了其余核心依赖其实际内容为见 requirements-perf-transformers.txttransformers4.46.0 autoawq0.2.6 modelscope[framework] accelerate optimum1.20.0安装时有三个官方特别提示原文档中的[!Important]块flash-attention 可装可不装可以直接使用 [GitHub Releases] 提供的预编译 wheel 包或从源码编译后者需要兼容的 CUDA 编译器实际上它已经被集成进torch作为sdpa的后端实现使用。auto_gptq 必须从源码安装预编译 wheel 依赖的torch版本与上述torch2.3.1不兼容只有从源码编译才能获得高效内核因此同样需要兼容的 CUDA 编译器。autoawq 需要内核组件autoawq-kernels通常随autoawq自动安装若未自动安装请手动执行pip install autoawq-kernels。2.2 vLLM 推理环境conda create -n qwen_perf_vllm python3.10 conda activate qwen_perf_vllm pip install -r requirements-perf-vllm.txtvLLM 环境的依赖清单见 requirements-perf-vllm.txtvllm0.6.3.post1 torch2.4.0 modelscope[framework] accelerate可以看到 vLLM 环境锁定了vllm0.6.3.post1与torch2.4.0与 transformers 环境的torch2.3.1互不相同这正是要求分开建环境的原因。3. 执行测试两条路径任选其一官方文档提供了两种测试方式方法一使用 EvalScope 的 Speed Benchmark 工具适合快速出结果、自动下载模型方法二使用仓库自带的 Python 脚本可控性更强便于深入复现与二次开发。3.1 方法一EvalScope Speed Benchmark 工具EvalScope 是 ModelScope 社区开发的评测工具其perf子命令支持自动从 ModelScope 下载模型并输出测试结果也支持指定模型服务的 URL 进行测试。安装依赖pip install evalscope[perf] -UHuggingFace transformers 推理CUDA_VISIBLE_DEVICES0 evalscope perf \ --parallel 1 \ --model Qwen/Qwen2.5-0.5B-Instruct \ --attn-implementation flash_attention_2 \ --log-every-n-query 5 \ --connect-timeout 6000 \ --read-timeout 6000 \ --max-tokens 2048 \ --min-tokens 2048 \ --api local \ --dataset speed_benchmarkvLLM 推理CUDA_VISIBLE_DEVICES0 evalscope perf \ --parallel 1 \ --model Qwen/Qwen2.5-0.5B-Instruct \ --log-every-n-query 1 \ --connect-timeout 60000 \ --read-timeout 60000 \ --max-tokens 2048 \ --min-tokens 2048 \ --api local_vllm \ --dataset speed_benchmark参数速查表参数含义可选值 / 说明--parallel并发请求的 worker 数量需固定为 1保证单请求串行计时--model测试的模型文件路径或模型 ID支持自动从 ModelScope 下载如Qwen/Qwen2.5-0.5B-Instruct--attn-implementationattention 实现方式flash_attention_2/eager/sdpa仅本地 transformers 推理使用--log-every-n-query每处理 n 个请求打印一次日志正整数--connect-timeout连接超时时间单位秒--read-timeout读取超时时间单位秒--max-tokens最大输出长度单位token--min-tokens最小输出长度单位token与--max-tokens同时设为 2048 时模型固定输出 2048 个 token--api推理接口本地推理可选localtransformers或local_vllmvLLM--dataset测试数据集speed_benchmark/speed_benchmark_long注意 transformers 与 vLLM 两条命令在超时参数上使用了不同量级6000 秒 vs 60000 秒这是文档给出的参考取值可按实际服务响应情况调整。测试结果测试结果保存在outputs/{model_name}/{timestamp}/speed_benchmark.json文件中其中包含所有请求结果与测试参数便于后续分析与归档。3.2 方法二使用仓库脚本仓库提供了两个脚本speed_benchmark_transformers.pytransformers 推理与 speed_benchmark_vllm.pyvLLM 推理均支持 HuggingFace hub 与 ModelScope hub 两种模型来源。transformers 脚本使用 HuggingFace hubpython speed_benchmark_transformers.py --model_id_or_path Qwen/Qwen2.5-0.5B-Instruct --context_length 1 --gpus 0 --outputs_dir outputs/transformers使用 HuggingFace 镜像如HF_ENDPOINThttps://hf-mirror.com加速国内下载HF_ENDPOINThttps://hf-mirror.com python speed_benchmark_transformers.py --model_id_or_path Qwen/Qwen2.5-0.5B-Instruct --context_length 1 --gpus 0 --outputs_dir outputs/transformers使用 ModelScope hubpython speed_benchmark_transformers.py --model_id_or_path Qwen/Qwen2.5-0.5B-Instruct --context_length 1 --gpus 0 --use_modelscope --outputs_dir outputs/transformers参数说明参数含义说明--model_id_or_path模型 ID 或本地路径可选值参考第 1 节模型资源--context_length输入长度token 数可选值1, 6144, 14336, 30720, 63488, 129024--generate_length生成 token 数量默认2048--gpus使用的 GPU等价于环境变量CUDA_VISIBLE_DEVICES如0,1,2,3、4,5--use_modelscope是否使用 ModelScope 加载模型设置该标志使用 ModelScope否则使用 HuggingFace--outputs_dir输出目录默认outputs/transformersvLLM 脚本使用 HuggingFace hubpython speed_benchmark_vllm.py --model_id_or_path Qwen/Qwen2.5-0.5B-Instruct --context_length 1 --max_model_len 32768 --gpus 0 --gpu_memory_utilization 0.9 --outputs_dir outputs/vllm使用 HuggingFace 镜像HF_ENDPOINThttps://hf-mirror.com python speed_benchmark_vllm.py --model_id_or_path Qwen/Qwen2.5-0.5B-Instruct --context_length 1 --max_model_len 32768 --gpus 0 --gpu_memory_utilization 0.9 --outputs_dir outputs/vllm使用 ModelScope hubpython speed_benchmark_vllm.py --model_id_or_path Qwen/Qwen2.5-0.5B-Instruct --context_length 1 --max_model_len 32768 --gpus 0 --use_modelscope --gpu_memory_utilization 0.9 --outputs_dir outputs/vllm参数说明参数含义说明--model_id_or_path模型 ID 或本地路径可选值参考第 1 节模型资源--context_length输入长度token 数可选值1, 6144, 14336, 30720, 63488, 129024--generate_length生成 token 数量默认2048--max_model_len模型最大长度默认32768脚本中注释还给出了4096, 8192, 65536, 131072等参考值--gpus使用的 GPU等价于CUDA_VISIBLE_DEVICES如0,1,2,3、4,5--use_modelscope是否使用 ModelScope 加载模型设置该标志使用 ModelScope否则使用 HuggingFace--gpu_memory_utilizationGPU 内存利用率取值范围(0, 1]默认0.9--outputs_dir输出目录默认outputs/vllm--enforce_eager是否强制使用 eager 模式默认False测试结果脚本测试的结果统一输出到outputs目录默认包含transformers与vllm两个子目录分别存放 HuggingFace transformers 与 vLLM 的测试结果详见第 4 节的 CSV 文件格式。4. 源码级原理剖析要得到可信的基准数据理解脚本如何计时、如何算速、如何统计显存至关重要。下面结合两个脚本的源码实现展开说明。4.1 transformers 脚本的计时与显存统计speed_benchmark_transformers.py 的核心类是SpeedBenchmarkTransformers其默认配置定义在类属性中L19-L28SEED 1024调用transformers.trainer_utils.set_seed固定随机种子保证结果可复现BATCH_SIZE 1单 batch 评测USE_FLASH_ATTN True默认使用flash_attention_2否则回退为eagerDEVICE_MAP auto、TORCH_DTYPE auto自动设备映射与自动精度DUMMY_INPUT 我用于构造输入的填充字符。输入构造脚本用我 * context_length重复字符构造指定长度的输入L67-L69并通过assert inputs[input_ids].shape[1] context_length校验输入长度精确符合参数。计时方式在model.generate前后各调用一次torch.cuda.synchronize()L76-L80确保 GPU 上的异步计算全部完成后再读取墙钟时间得到time_cost。速度与显存计算L82-L102tokens_per_second generate_length / time_cost以生成的 token 数除以总耗时通过torch.cuda.max_memory_allocated(i)遍历所有 GPU 累加峰值显存再除以1024^3换算为 GB得到max_gpu_memory_cost_gb生成结束后调用torch.cuda.empty_cache()释放缓存。结果落盘结果先以 JSON 形式打印再以 CSV 形式写入{outputs_dir}/{model_id_or_path}_{context_length}_{timestamp}.csvL108-L120文件名中的模型名会将/替换为__时间戳格式为MMDDHHMMSS避免同名文件互相覆盖。4.2 vLLM 脚本的上下文构造与采样策略speed_benchmark_vllm.py 在进程启动时设置了两个关键环境变量L28-L29VLLM_WORKER_MULTIPROC_METHOD spawn确保多进程 worker 以 spawn 方式启动VLLM_ALLOW_LONG_MAX_MODEL_LEN 1允许超过默认限制的max_model_len以支撑 129024 token 级别的长上下文测试。模型加载L56-L68tensor_parallel_size由--gpus参数中的 GPU 数量推导tp_size len(envs.split(,))配合gpu_memory_utilization、max_model_len组成LLM的初始化参数脚本会根据vllm.__version__的主版本号判断仅当次要版本号大于等于 3 时才传入enforce_eager参数兼顾不同 vLLM 版本的接口兼容性。使用 ModelScope 时还会设置VLLM_USE_MODELSCOPE True。长上下文构造create_query输入长度小于 96 token 时直接重复填充字符熵超过 96 token 时则通过tokenizer.apply_chat_template构造带 system 与 user 角色的对话system 指令要求模型把一件事翻来覆去地说、回复不少于 2000 字user 指令要求写一篇关于春天的文章、不少于 2000 字以此引导模型在长上下文下持续输出足够长度的内容。构造完成后用tokenizer.tokenize统计真实输入长度若实际生成长度不足output_len还会自动重试一次L120-L124。采样参数L220-L228SamplingParams设置为temperature1.0, top_p0.8, top_k-1, repetition_penalty0.1, presence_penalty-2.0, frequency_penalty-2.0其中强负的 presence/frequency penalty 与极小的 repetition penalty 协同作用都是为了抑制重复、鼓励模型生成足量且不重复的文本从而稳定达到目标输出长度。统计指标collect_statistics使用statistics.mean计算平均耗时与平均吞吐量out_length / time_cost最终输出模型 ID、输入长度、输出长度、TP 大小、平均耗时秒与平均吞吐量tokens/s等字段同样以 CSV 落盘。5. 结果解读与注意事项多次测试取平均值单次测试存在随机波动官方建议测试 3 次左右并取平均作为最终上报数据测试前确保 GPU 空闲避免其他任务抢占算力与显存导致吞吐量偏低或显存统计失真对比口径一致不同引擎transformers / vLLM、不同 attention 实现flash_attention_2 / eager / sdpa之间的数据不能混为一谈报告中应明确记录每个参数组合量化模型的额外依赖测试 GPTQ / AWQ 量化模型时务必确认auto_gptq源码安装与autoawq-kernels已正确就绪见第 2.1 节注意事项否则无法使用高效内核测出的速度会显著偏低。6. 进阶与 Qwen3 速度基准报告的关系本指南对应的仓库文档面向 Qwen2.5 系列而仓库内 docs/source/getting_started/speed_benchmark.md 则进一步给出了Qwen3 系列在 bf16、FP8、GPTQ、AWQ 等精度下的最新速度报告两者在方法论上保持一致均采用batch size 为 1、最少 GPU 数量的评测口径输入长度同样覆盖1, 6144, 14336, 30720, 63488, 129024统一生成2048 个 token速度公式为Speed (prompt tokens generation tokens) / timeQwen3 报告披露的硬件环境为 NVIDIA H20 96GB软件栈更新为 PyTorch 2.6.0、Flash Attention 2.7.4、Transformers 4.51.3、GPTQModel 2.2.0、AutoAWQ 0.2.9、SGLang 0.4.6.post1 与 vLLM 0.7.2可作为你升级环境版本后的参考对齐基线报告还披露了两个值得关注的已知问题transformers 在 FP8 模式下的推理速度尚不理想SGLang 中 GPTQ-INT4 的性能也仍在与社区协同优化中——这说明不同引擎与量化组合的速度表现差异较大务必以实测为准。借助本文的两种测试路径与源码级原理剖析你可以在自己的 GPU 集群上完整复现 Qwen 系列模型的速度与显存基准并为量化选型、服务端资源配置提供可量化的决策依据。【免费下载链接】Qwen1.5Qwen3 is the large language model series developed by Qwen team, Alibaba Cloud.项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen1.5创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考