最近在实验室的3090(24G)上部署Qwen2.5-7B-Instruct,用的是vLLM框架,FP16精度。模型加载没问题,显存占用大概15G左右,但推理速度实测只有5-6 tokens/s,batch size=1的时候。试过调整gpu_memory_utilization到0.9,也开了enforce_eager=False,提升不明显。看网上有人说同配置能跑到30+ tokens/s,是我哪里配置有问题吗?还是说3090本身就这个水平?有没有遇到过类似情况的朋友,求指点一下方向。
本地部署Qwen2.5-7B,显存够但推理速度只有5 tokens/s,正常吗?
全部回复
共 9 条5 tokens/s确实太离谱了,3090跑7B FP16正常怎么也有30+,查下是不是PCIe带宽或者驱动版本拖后腿了。
3090跑7B FP16理论上是能到30+的,5 tokens/s确实偏低了。先确认下是不是模型权重没完全加载到GPU上,有时候device_map设成auto会偷偷往CPU丢几层。另外检查一下有没有装flash-attn,vLLM对它的依赖挺大的,没装的话attention那块会慢很多。还有个容易忽略的点,如果用的是WSL,性能损耗也挺明显的,建议在原生Linux下跑一遍对比看看。
batch size=1跑5 tokens/s确实偏慢,3090 FP16不该这样,建议查下是不是PCIe带宽或者CPU瓶颈卡住了。
3090跑7B FP16到5 tokens/s确实偏低了,正常应该能到25-40左右。你先确认下是不是被别的进程占了卡,nvidia-smi看看实际利用率。另外vLLM的版本也很关键,老版本对30系卡支持不太好,建议升到最新版再试试。还有个容易忽略的点是dtype,你确定加载的是fp16而不是fp32吗?
5 tokens/s 确实有点离谱了,3090 跑 7B FP16 怎么也不该是这个数。我之前在 4090 上用 vLLM 跑 Qwen2.5-7B,batch=1 大概能到 50-60 tokens/s,3090 算力砍半也不至于掉到个位数。你先确认一下是不是输出长度统计的问题,有时候首 token 延迟被算进去会拉低平均值,可以单独看 decode 阶段的吞吐。另外 enforce_eager=False 其实默认就是 False,你写成 False 等于没开 CUDA graph,应该设成 True 或者干脆别传这个参数。还有个容易被忽略的点是 kv cache 的 dtype,如果显存够的话可以试试加 --dtype float16 显式指定,有时候自动推断会出问题。建议你直接跑 vLLM 自带的 benchmark_throughput.py 脚本,排除掉客户端和网络的开销,看纯推理到底多少。如果那个脚本也跑不出速度,那可能是驱动或者 CUDA 版本和 vLLM 编译的 wheel 不匹配,重装一下对应版本试试。
5 tokens/s确实不太对劲,3090跑7B FP16怎么也不该这么慢。先确认下是不是输入prompt特别长,长上下文prefill阶段会拖慢整体吞吐;另外vLLM版本也关键,老版本在30系卡上有些kernel没走flash attention,升级到最新版试试。还有个容易忽略的点,检查下是不是开了什么CPU offload或者swap,显存够的话完全没必要。我之前在A100上碰到过类似情况,最后发现是驱动版本太旧导致CUDA graph没生效,更新驱动后直接翻了好几倍。
我之前也遇到过类似问题,后来换了方案。
有没有更详细的教程推荐?
5-6确实太低了,3090跑7B FP16怎么也得20+,先看看是不是PCIe带宽或者CPU offload没关掉。