最近在折腾开源大模型部署,用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 条大概率是vLLM的prefill chunk和max-model-len没匹配好,导致KV cache碎片化,试试调低max-model-len到2048。
看到这个速度我第一反应是vLLM的prefill阶段可能卡住了,你试试加个--enable-prefix-caching看看,LoRA微调过的模型如果有公共前缀(比如固定的system prompt)缓存命中率上来了能快不少。另外CPU 80%有点反常,7B int8的权重加载不该吃这么多CPU,我怀疑是不是量化后的kernel没走对,CUDA graph没生效,你可以在启动日志里搜下“graph capture”相关字样确认下。
还有个思路是检查下--max-model-len,如果你默认设成32k甚至更长,那vLLM会为每个序列预留大量KV cache显存,实际可用batch就变小了,反而拖慢吞吐。我自己的经验是7B模型在4090上int8跑13-15 tokens/s是正常的,但如果你把max-model-len砍到4k,batch size拉到8,应该能上20+。至于FP16 OOM确实奇怪,24G理论够,但如果你开的是默认的--gpu-memory-utilization 0.9,加上LoRA adapter的额外参数和激活显存,实际峰值很容易超,建议调到0.6-0.7再试。
最后问下你用的vLLM版本是多少?0.6.x和0.7.x对量化模型的支持差别挺大的,我之前用旧版跑AWQ也遇到过类似问题,升级后就好了。如果还不行,可以试试排除法,先用原始Qwen2.5-7B不带LoRA加载int8跑同样的prompt,如果速度正常那就是微调权重和vLLM的兼容性问题,如果也慢那就得从部署环境查起了。
你这情况我遇到过,大概率不是模型本身的问题,而是vLLM的显存分配和并发参数没对上。GPU利用率40%说明算力没吃满,CPU飙高多半是tokenizer或者调度线程在拖后腿,试试把--gpu-memory-utilization调到0.9以上,再限制一下--max-num-seqs别让它自动膨胀。另外7B在4090上正常速度应该能到30-50 tokens/s,你这10都不到肯定有瓶颈,检查下是不是把LoRA合并进base模型后没重新导出,导致推理时还在跑额外的前向计算。
这速度确实不太对劲,我遇到过类似情况,多半是vLLM的prefill和decode阶段没平衡好。你试试把--max-model-len调低到2048或4096,--gpu-memory-utilization设到0.9以上,同时把--enable-prefix-caching打开,应该能明显改善。另外4090跑7B单卡正常能到40-60 tokens/s,FP16 OOM可能是KV cache预留太大,建议用--kv-cache-dtype fp8试试。CPU飙高很可能是tokenizer或数据预处理瓶颈,看看是不是batch拼接时padding策略太保守。
这速度不正常,我拿同样配置跑过Qwen2.5-7B,vLLM+AWQ量化大概能到50+ tokens/s。你显存才用14G,说明KV cache没吃满,试试把--gpu-memory-utilization调到0.95,让它多留点空间给运行时。至于FP16 OOM,很可能是--max-model-len设太高了,默认可能是32768,改成8192就塞得下。CPU占用高多半是数据加载线程卡住了,检查下是不是用了--dtype auto但数据预处理没走GPU。
单卡7B这个速度确实偏低,不过你先别急着怀疑量化。我猜是v
这速度确实不太正常,我拿同样配置跑过Qwen2.5-7B的BF16版本,vLLM默认参数下都能稳定在25-30 tokens/s,你这也差太多了。GPU利用率40%基本说明瓶颈不在显存带宽或算力上,CPU飙到80%就很可疑,大概率是prefill阶段或者tokenizer那部分在拖后腿,你可以试试把--max-model-len调低到2048或4096,如果数据长度本来就短,这个参数会让vLLM预留大量无效的KV cache空间,反而影响调度效率。另外batch size不是越大越好,7B模型在4090上batch 4可能触发了某种内存碎片或paged attention的swap,我建议你单测一下batch 1和batch 2的吞吐对比,排除这个因素。还有个点,LoRA微调过的模型如果合并权重时没处理好,某些层会退化成动态图模式,vLLM的连续批处理会直接失效,你可以用--enforce-eager试试看能不能排除这个原因。最后FP16 OOM那个事,24G理论够但实际要留出CUDA context和碎片空间,建议把--gpu-memory-utilization设成0.9再看看。
这速度确实不正常,我之前跑7B int8都能到20+ tokens/s,你试试把max-model-len调低点,大概率是显存碎片化导致vLLM没吃满。
CPU都飙到80%了明显是数据预处理和tokenize在拖后腿,试试把max-model-len调低点或者换更快的CPU解码器。
vLLM吃显存但吃不满利用率多半是CPU瓶颈,单卡7B不至于这么慢,查下是不是Qwen的tokenizer反复加载了。
CPU飙到80%基本可以断定是prefill阶段吃满单核了,试试把max-model-len调小或者换flash-attention看看。
我之前也遇到过类似情况,vLLM的调度策略对短文本生成影响很大,batch size不是越大越好,得配合continuous batching的配置。
这速度确实不正常,我3070跑7B Q4都有15-20 tok/s,你4090加int8怎么也不该卡在10以下。看CPU飙到80%大概率是prefill阶段或tokenizer的瓶颈,试试把--max-model-len调成和实际输入长度接近的值,再开--enable-prefix-caching。另外vLLM对LoRA合并后的模型支持有时会有问题,建议先确认是不是加载了原始权重而非合并版。FP16 OOM挺奇怪的,24G跑7B应该绰绰有余,检查下是不是--tensor-parallel-size被误设了。
这速度确实不太正常,我拿同样配置跑过Qwen2.5-7B的FP16版本,vLLM默认参数下大概能到25-30 tokens/s,你这才10不到肯定有问题。GPU利用率40%是个关键信号,大概率是显存碎片化或者KV cache预留不够导致的,试试把--gpu-memory-utilization调到0.92,然后--max-model-len设成4096或更短,别让vLLM默认按8K去分配。另外batch size越大越慢很可能是你加的那条LoRA在batching时触发了动态padding,每次请求长度差异大的话中间填充的token全在空转,可以检查下是不是用了--enable-prefix-caching或者开一下--use-v2-block-manager,这俩对短序列场景提升很明显。CPU飙到80%也值得留意,你输入是不是特别长?如果prompt里有大量固定前缀,vLLM的预填充阶段会吃满CPU做tokenization,可以试下把prompt提前编码成token ids传进去,跳过每次的文本处理。还有一个坑是int8量化如果你的算子是per-tensor而不是per-channel,在4090上反而会触发反量化开销,建议直接用AWQ或者GPTQ的预量化权重跑一次对比下。最后确认下你是不是开了--enforce-eager,这个会禁用CUDA graph,推理速度直接掉三分之一,但有些人为了省内存会误开。先按这几个方向调一下,大概率能翻倍。
这速度太不正常了,4090跑7B量化版至少得有30+ tokens/s,重点查下是不是CPU瓶颈把数据搬运卡死了。
试试把--gpu-memory-utilization调到0.9,再关掉--enforce-eager,大概率能解决。
这速度确实不太对,我跑过类似的7B模型,vLLM下一般能到30-40 tokens/s。你GPU利用率只有40%,大概率是卡在CPU和GPU之间的数据传输上了,试试把--gpu-memory-utilization调到0.9,再把--max-model-len改小一点,比如2048,看看会不会好转。另外batch size不是越大越好,4反而慢可能是显存碎片化或者prefill阶段计算瓶颈,建议先固定batch=1,用--enable-prefix-caching试试。换FP16 OOM也正常,因为LoRA权重和KV cache都会额外吃显存,14G只是模型本身,不代表总占用。
CPU都飙到80%了明显是数据预处理和采样瓶颈,试试把--max-num-seqs调小点或者prefill chunk大一些。
同款4090,我之前跑7B也遇过这问题。CPU飙到80%基本就是数据预处理或tokenizer在拖后腿,试试把--max-model-len调小到2048,同时加--enforce-eager关掉CUDA graph,能明显缓解。另外vLLM的prefill和decode阶段速度差异很大,你测的10 tokens/s是首token延迟还是稳定吞吐?如果只是单轮问答慢,其实正常。FP16 OOM大概率是KV cache默认预留太多,--gpu-memory-utilization设0.85再配合--max-num-seqs=2试试,别一次开4个batch,7B在24G上并发高反而亏。
不过说真的,LoRA微调模型有时会和vLLM的paged attention冲突,你试试用transformers原生跑一下对比,如果速度上去了,那就是vLLM版本和微调权重兼容性的问题。我之前换过bf16权重直接加载,速度能到20+ tokens/s,但一用LoRA合并版就掉回个位数,最后换exllamav2才解决。你量化用的什么方案?GPTQ和AWQ在vLLM上的表现差挺多的。
4090跑7B不至于这么拉,看看是不是vLLM版本太旧或者CPU吃满了GPU在等数据,换最新版再试试。
说实话你这个现象我太熟了,之前用4090跑13B模型的时候也踩过类似的坑。7B在24G上单卡推理速度确实不该只有10 tokens/s,瓶颈大概率不在显存容量,而在vLLM的调度和量化方式上。你试过把gpu-memory-utilization调到0.85以上吗?默认值经常留太多余量导致KV cache分配不足,反而触发频繁的显存交换,CPU飙高就是典型信号。另外int8量化对Qwen2.5的算子支持并不完美,某些层会回退到慢速路径,建议试试AWQ或者GPTQ的4bit版本,显存占用还能更低,速度反而会提升。batch size调到4变慢也很正常,vLLM的continuous batching在小batch下收益不明显,反而因为padding和调度开销拖慢单请求延迟。我甚至怀疑你max-model-len是不是设太大了,比如默认设了32K,但实际问答就几百token,这会让prefill阶段计算量虚高。建议先用--max-model-len 4096跑一下对比,再把量化换成GPTQ试试,应该能翻倍。如果还是慢,就用原生transformers加flash-attention跑一次,排除vLLM自身版本兼容问题。
这速度明显不正常,7B单卡不该这么拉胯,试试把max-model-len调小点或者关掉CPU offload。
这速度确实不对劲,我同配置跑Qwen2.5-7B的AWQ量化,vLLM默认参数下基本能到25-30 tokens/s。你试试把--gpu-memory-utilization调到0.9,然后--max-model-len设成4096或更低,另外batch size别用4,vLLM对动态batching挺敏感的,小batch反而容易触发碎片化调度。还有个坑是LoRA加载后如果没合并权重,vLLM的PagedAttention会多走一层adapter计算,CPU飙高八成是这块没优化。你检查下是不是用的最新版vLLM,老版本对Qwen2.5的MLA支持有问题。
4090跑7B不至于这么慢,先查下是不是CPU负载太高导致数据预处理卡住了,试试把max-model-len调小点。
这速度确实不对劲,我之前跑7B的int8在4090上至少能到25+ tokens/s。你CPU飙到80%大概率是tokenizer或prefill阶段在CPU上做算子调度,试试把--gpu-memory-utilization调到0.9再看看,另外确认下vLLM版本是不是太旧,老版本对量化支持有bug。FP16 OOM也正常,因为KV cache默认预留空间太大,加--max-model-len限制到4096应该能塞下。先排除这些因素,再怀疑模型本身吧。