最近在把公司的一个Qwen2.5-7B模型部署到内网给业务部门用,用的vLLM,两张3090(24G)做张量并行,量化用的AWQ 4bit。理论上显存占用也就15G左右,但实际跑起来单请求延迟要3-4秒,吞吐才20 tokens/s左右,完全达不到业务要求(他们想要50+)。我已经开了continuous batching,max_num_seqs也调到256了,但还是上不去。GPU利用率看了下只有40%左右,感觉没有吃满。有没有大佬遇到过类似情况?是量化后反而变慢了吗,还是我的并行/调度参数设置有问题?或者是不是该换TensorRT-LLM?现在有点迷茫,求指点方向。
部署7B模型到生产环境,显存明明够但推理速度慢得离谱,求优化思路
全部回复
共 16 条AWQ 4bit在部分算子上的反量化开销确实可能吃掉带宽优势,我试过用GPTQ或者直接用FP8对比下,有时候反而更快。另外你两张3090走NVLink吗?如果走PCIe,张量并行通信开销会拖后腿,小batch下尤其明显。可以把max_num_seqs调小到64试试,有时候调度开销比收益还大。还有看看是不是vLLM版本太老,新版本对MHA和量化支持优化了不少,升级一下说不定有惊喜。
大概率是AWQ的反卷积算子在小batch下没吃到红利,试试关掉tensor parallel换单卡加pipeline,或者直接上FP8。
3090的PCIe带宽在张量并行下是硬伤,两张卡通信开销可能吃掉不少性能,尤其7B这种小模型,单卡其实能塞下,试试去掉tensor parallel用单卡+AWQ,显存也够,说不定延迟直接砍半。另外vLLM对AWQ的kernel优化不如GPTQ成熟,量化格式本身就可能拖慢速度,你可以对比下同样量化位数的GPTQ或者干脆用FP16看看baseline,确认是不是量化引入的额外开销。max_num_seqs调到256不一定有用,这参数主要影响batch吞吐,单请求延迟高的话更该看prefill和decode阶段的调度,比如限制max_num_batched_tokens或者调小max_paddings,减少气泡。GPU利用率40%说明瓶颈不在算力,可能在CPU侧数据搬运或者采样阶段,试试开--use-prefix-caching和--enable-chunked-prefill,后者能加快首token时间。TensorRT-LLM对Qwen支持确实好,但迁移成本也不低,建议先用vLLM的profiler看看time_per_output_token和time_to_first_token到底哪个高,再决定动哪里。还有个野路子,业务方如果接受流式输出,把max_tokens限制短一点,配合投机采样(vLLM里开--speculative-model),小模型做草稿模型能显著提decode速度。最后检查下是不是CPU内存swap,如果页表或者tokenizer频繁触发额外拷贝,那比显存不够还致命,直接看nvidia-smi的volatile GPU-Util和CPU占用对比就能定位。
你查过AWQ量化后的推理内核是不是走了vLLM的优化路径吗?有些量化格式在4bit下反而会触发dequantize的额外开销,特别是当batch size小的时候,计算密度上不去,显存带宽就成瓶颈了。我之前遇到过类似情况,换GPTQ或者直接用FP8试试,有时候吞吐能差30%以上。
另外两张3090跑张量并行,跨卡通信的开销在7B这种小模型上占比很高,你可以试试单卡能不能跑得动——如果显存够的话,去掉TP说不定延迟反而更低。还有max_num_seqs调太高不一定好,如果实际并发没那么多,预分配的KV cache反而浪费了显存带宽,可以先压到64看看。
GPU利用率40%说明要么卡在数据加载或者CPU调度上,要么就是显存带宽已经到顶了。你测一下单请求的prefill和decode阶段分别耗时多少?如果是decode慢,那大概率就是显存带宽问题,这时候换TensorRT-LLM可能有点用,但也别抱太大希望,毕竟3090的带宽就摆在那。
业务要求50+ tokens/s的话,可能得考虑换更小的模型比如6B或者量化到2bit,或者用投机采样来加速。你先用vLLM的benchmark脚本跑个离线压测,看看纯推理能达到多少,排除掉网络和业务逻辑的干扰再调。
这卡利用率才40%,先查下是不是张量并行的通信瓶颈,或者数据预处理卡在CPU了。
看到这个GPU利用率40%我第一反应就是卡在显存带宽或者数据搬运上了,AWQ 4bit虽然省显存但解卷积的时候访存压力反而可能更大,尤其两张3090走NVLink带宽也就那样。你试试把max_num_seqs调低到64或者128看看,有时候开太大反而导致batch内padding和调度开销吃掉收益,vLLM对7B这种小模型并不一定吃满256的配置。另外检查下是不是输入输出长度差异巨大,如果业务请求都是长上下文,prefill阶段会占掉大量时间,这时候可以试试拆分prefill和decode到不同阶段,或者用chunked prefill。TensorRT-LLM确实在低延迟场景下比vLLM激进不少,但迁移成本高,建议先跑个benchmark对比下同样参数下两者的吞吐差距再决定。还有个容易忽略的点,你确认下CPU有没有瓶颈,比如tokenizer和采样器是不是在CPU上跑的,7B模型如果每秒生成token数不高,CPU端处理不过来也会拖后腿。最后建议查一下vLLM版本,老版本对量化模型的支持有已知性能问题,升级到最新版有时候能白捡20%的吞吐提升。
3090是PCIE版本的话,张量并行卡间通信会严重拖后腿,尤其AWQ小batch时更明显,建议先试试单卡+多实例部署,或者把max_num_seqs调低到64看看,有时候batch太大反而触发碎片化调度。另外vLLM对AWQ的支持其实不如GPTQ成熟,你可以换GPTQ量化对比下延迟,我上次遇到类似情况换了问题直接解决。TensorRT-LLM优化空间大但调起来费时间,如果业务急还是先排查下是不是paged attention的KV cache命中问题。
这问题我蹲过,AWQ 4bit在3090上跑小batch时经常比FP16还慢,因为反量化开销没摊薄。先把max_num_seqs调回64左右试试,256反而让调度空转。另外两张卡做TP的话,7B模型其实单卡就能塞下,跨卡通信延迟可能比收益还大,建议改成单卡部署再开两个实例分流。TensorRT-LLM对AWQ支持也一般,不如先检查下vLLM版本是不是太老,新版本对量化kernel优化了不少。
之前跑7B也遇到过类似瓶颈,后来发现问题不在显存而在PCIe带宽和数据搬运上,两张3090做张量并行时通信开销反而可能拖后腿。AWQ 4bit在部分算子上的确会有反优化,尤其是小batch时,建议你试试FP8或者直接不量化对比一下。另外max_num_seqs调太高会频繁切换请求,反而降低单流延迟,可以降到64左右看实际吞吐变化。如果业务主要吃单请求延迟,换TensorRT-LLM收益可能更明显,但也得先排除是不是vLLM的prefill阶段卡住了。
AWQ 4bit在3090上确实有点尴尬,我用过类似配置,量化后的反量化开销在batch小的时候反而拖后腿。你GPU利用率才40%,大概率是请求量不够、batch根本没填满,continuous batching再猛也白搭。建议先压测看看单卡到底能扛多少并发,别急着换TensorRT-LLM,先确认瓶颈在调度还是kernel。另外张量并行两张卡通信开销也不小,7B模型其实单卡跑AWQ绰绰有余,试试单卡说不定更快。
你这两张3090走张量并行,NVLink都没有,卡间通信全靠PCIe,这个开销在7B模型上其实挺要命的。GPU利用率40%很可能不是算力瓶颈,而是在等通信或者等调度。建议你先单卡跑一下试试,7B的AWQ 4bit单卡24G完全放得下,看看单卡延迟是多少,如果单卡反而更快,那基本就是TP通信拖后腿了。另外AWQ在vLLM里确实有时候会出现kernel没跑满的情况,你可以对比一下GPTQ或者FP8的版本,不一定要死磕AWQ。还有max_num_seqs调到256对延迟敏感的场景未必是好事,batch太大反而会让单请求排队变久,可以试试压到32-64看看P99延迟变化。TensorRT-LLM确实在低延迟上更强,但部署复杂度高不少,建议先把TP这个变量排除掉再考虑换框架。
量化后AWQ在小batch下确实可能拖后腿,先试试不量化跑一下对比延迟。
两张3090走张量并行其实是个挺尴尬的配置,卡间没有NVLink,通信全靠PCIe,TP的all-reduce开销在decode阶段会被放得很大,尤其你batch拉大之后通信量线性涨,GPU利用率卡在40%很可能就是在等通信。单请求3-4秒延迟、20 tokens/s这个数,先别急着怀疑AWQ,建议拿fp16不量化的版本跑个baseline对比一下,如果量化前后差不多,那问题基本不在量化上。AWQ 4bit在vLLM里确实偶尔会有kernel没走到最优路径的情况,但一般不至于掉这么狠。max_num_seqs调到256对两张3090来说太激进了,KV cache一挤,调度反而变慢,可以先降到32-64看看曲线。另外确认下你的请求是不是集中在长prompt上,prefill阶段如果没开chunked prefill,长输入会把decode整个堵住,延迟自然就上去了。TensorRT-LLM不一定能救你,它编译和调参成本高,你这个瓶颈更像是并行策略和调度的问题,先把TP换成单卡跑7B AWQ试试,如果单卡反而更快,那答案就很明显了。
两张3090走张量并行其实挺尴尬的,卡间只有PCIe没NVLink,通信开销很可能就是瓶颈,GPU利用率40%也符合这个特征。另外AWQ 4bit在vLLM里dequant是有额外开销的,7B这个量级未必比fp16快多少,你可以先跑个fp16对比看看。建议先把tensor_parallel关掉单卡跑一下,确认延迟基线,再排查是不是调度或通信的问题。
AWQ 4bit在3090上确实可能拖后腿,试试换回FP16或者用GPTQ对比下延迟。另外张量并行两张卡通信开销也不小,不如单卡跑试试。
两张3090跑7B还开TP=2,这个组合本身就有点尴尬——TP的通信开销在PCIe上很肉疼,而7B单卡24G其实塞得下AWQ 4bit,不如直接单卡跑,省掉卡间同步那部分浪费。GPU利用率40%也说明瓶颈大概率不在算力上,而是在调度或者请求侧,比如你的batch里是不是大部分时间只有一两个活跃请求,continuous batching根本没吃饱。另外AWQ在vLLM里对7B这个尺寸的加速比其实没那么明显,dequant反量化那点开销在低并发下反而可能拖后腿,可以对比下FP16或GPTQ的实测数据。max_num_seqs调到256不是越大越好,得看你实际并发量,如果同时只有几个请求进来,调再大也只是空占显存。延迟3-4秒、吞吐20 tokens/s这个数,很像是在跑单请求串行,建议先拿并发压测工具把QPS打上去,看吞吐是不是能线性涨,涨不上去再查kernel和调度。TensorRT-LLM确实在固定shape下更快,但换过去编译和调优成本不低,先把vLLM这边的问题定位清楚再说。