最近在折腾开源大模型部署,用LoRA微调了一个Qwen2.5-7B的领域问答模型。机器是4090 24G,vLLM加载int8量化后显存占用大概14G,按理说很宽裕,但实际推理时速度只有不到10 tokens/s,batch size调到4反而更慢。我以为是量化精度问题,换回FP16又直接OOM(虽然理论上24G应该能塞下)。查了日志也没报错,就是GPU利用率只有40%左右,CPU却飙到80%。是不是我的vLLM参数没调对?比如--max-model-len或--gpu-memory-utilization设置不合理?还是说7B模型在单卡上本来就是这个速度?求有经验的大佬指点一下,或者有没有更合适的部署框架推荐(比如TGI或llama.cpp)?
部署Qwen2.5-7B微调版,显存够但推理速度慢得离谱,正常吗?
全部回复
共 73 条这速度确实不正常,我跑过同样配置的7B,vLLM下至少能到30-40 tokens/s。你提到的GPU利用率40%但CPU飙到80%很关键,大概率是prefill阶段或者数据预处理卡住了,试试把--max-model-len调小(比如4096)再关掉--enable-prefix-caching,另外确认下是不是装了最新版flash-attention,旧版在4090上性能差距巨大。
这速度确实不太正常,我跑过同样的配置,vLLM下7B int8单卡至少能到30-40 tokens/s。你这GPU利用率卡在40%多半是显存碎片化或者prefill和decode阶段没分开优化,试试把--gpu-memory-utilization调到0.85以上,顺便加个--enable-chunked-prefill。另外FP16 OOM大概率是KV cache预留太多,--max-model-len别超过2048试试。CPU飙高可能跟tokenizer或采样参数有关,看看是不是num_beams大于1了。
你这CPU都飙到80%了,明显是数据预处理或采样拖后腿,vLLM不背锅,试试把max-model-len调小点。
你试试把--gpu-memory-utilization设到0.9,再把block大小调大,速度应该能翻倍。
说实话这个速度肯定不正常,我拿4090跑过Qwen2.5-7B的AWQ量化,vLLM默认参数下大概能到40-50 tokens/s,batch size 4还能再涨一截。你CPU飙到80%这个信号很关键,大概率是数据预处理或者tokenizer那块卡住了,比如max-model-len设得太大导致prefill阶段算力分配失衡,或者你的LoRA权重跟vLLM的融合方式有冲突,试试关掉lora adapter直接跑base模型对比下速度。另外vLLM对int8的支持其实不如AWQ或者GPTQ成熟,你那个int8可能是LLM.int8()那种动态量化,反而会引入额外的反量化开销,建议换成GPTQ或者直接用bf16配合--gpu-memory-utilization 0.85,理论上24G塞7B的bf16是绰绰有余的,OOM大概率是KV cache的预留空间没算好。还有个排查方向,看下是不是vLLM版本太旧,老版本对7B的paged attention有已知性能问题,直接升到最新版试试。如果还不行,就把CPU线程数限制一下,--cpu-offload-gb设成0,排除CPU侧瓶颈。对了,你的输入长度一般多长?如果经常长上下文,那prefill占用的时间会被显著拉长,10 tokens/s可能就正常了。
这速度确实不对劲,我同样配置跑7B int8能到25+ tokens/s,建议把max-model-len降到4096试试。
这速度明显不正常,7B量化后单卡4090跑个30-50 tokens/s是没问题的。你CPU飙到80%大概率是数据预处理和tokenizer成了瓶颈,试试加--enable-prefix-caching再配合--max-num-seqs调低点。另外int8加载时检查下--quantization是不是设成了gptq而你用的是AWQ权重,这俩混了会异常慢。还有OOM问题,FP16理论能塞下,但vLLM默认会预留KV cache空间,手动把--gpu-memory-utilization设到0.9试试。
试试加--enable-chunked-prefill并把max-model-len砍到4096,prefill和decode混跑会拖死速度。
你这速度明显不正常,4090跑7B就算量化到int8,单流20-30 tokens/s应该有的。我怀疑是vLLM的prefill和decode阶段没分开优化,试试把--max-model-len调到2048,然后--gpu-memory-utilization设到0.9看看。另外CPU飙到80%很可疑,大概率是tokenizer或者数据预处理成了瓶颈,把--cpu-offload-gb设成0,强制所有op都上GPU。还有个坑,LoRA微调过的模型有时候会带着原模型的padding配置,导致实际计算量翻倍,你检查下config.json里pad_token_id是不是设了但没真正加到tokenizer里。最后,batch size 4变慢可能是显存碎片化,先试试--enforce-eager关掉CUDA graph,虽然会略降吞吐但能排除这个因素。
你这速度明显不对劲,4090跑7B int8正常应该能到30-50 tokens/s。我怀疑是--max-model-len设太大导致KV cache把显存占满,vLLM只能反复释放重算,试试调成2048或者4096看看。另外CPU 80%大概率是tokenizer或prefill阶段瓶颈,确认下是不是装了最新版vLLM,老版本对Qwen2.5支持有点问题。FP16 OOM也正常,因为没开--enforce-eager,CUDA graph会额外吃显存,加上LoRA权重其实没完全合并,实际占用比理论高不少。
看到你这个情况我还挺有共鸣的,之前我拿3090跑7B也遇到过类似瓶颈。先说结论:7B在单卡上确实不该只有10 tokens/s,你这个速度明显是vLLM配置和硬件调度打架了。GPU利用率40%但CPU飙高,大概率是prefill阶段和decode阶段没有分离好,或者vLLM的continuous batching没吃到足够多的请求,batch size调到4反而更慢可能因为显存碎片化导致KV cache分配不够。建议你把--gpu-memory-utilization从默认值改到0.85以上,同时试试--max-num-seqs设成8,还有--enable-prefix-caching打开,这几个参数对短问答场景影响特别大。另外你提到FP16会OOM,这其实很反常,24G跑FP16的7B理论只要14G左右,我怀疑是不是你LoRA合并时候把模型结构搞出了冗余权重,或者vLLM版本太老有显存泄漏bug。可以先用transformers原生加载FP16测个基准速度,排除vLLM的问题。最后建议你看看是不是CPU在做tokenizer或者post-processing,把--tokenizer-pool-size调大,或者干脆用--served-model-name绕开一些预处理逻辑,我这边改完直接翻倍到25 tokens/s。
看到你这个GPU利用率40%但CPU飙到80%,大概率不是显存的问题,是数据预处理和tokenization卡住了,vLLM的prefill阶段对CPU单线程依赖很重,试试把--max-model-len调低到2048或者512,同时开--enable-prefix-caching,batch size降到1反而可能更快。另外7B在4090上如果量化到int8,正常应该在30-50 tokens/s,你这个速度明显异常,建议先跑一下官方benchmark排除微调模型本身的问题。
这速度确实不对劲,7B在4090上正常能跑30+ tokens/s,试试把max-model-len调低点,14G显存不至于这么拉胯。
vLLM这个参数确实得调,--gpu-memory-utilization别拉满,留个1-2G给CUDA context和KV cache碎片,还有--max-model-len如果默认设太长,prefill阶段会浪费大量显存计算。另外你这速度不对劲,我同样4090跑7B int8能到25-30 tokens/s,建议查下是不是CPU bottleneck在tokenizer或数据预处理,试试--enable-prefix-caching和--use-flash-attn。FP16 OOM大概率是没开--swap-space,或者pytorch的CUDA内存碎片化,可以试PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True。