最近在把一个7B的LLM用vLLM部署到内网给业务测试用,机器是A100 40G,显存占用才60%左右,但并发一上来(比如5个请求同时打)每个请求的响应时间直接飙到十几秒,吞吐量上不去。已经试过调max_num_seqs和gpu_memory_utilization,效果不明显。是不是我量化没做好?或者是不是该用FP8而不是BF16?还有人说用TGI会好一些,纠结要不要换框架。各位大佬有没有碰到过类似情况,一般从哪些方向排查?模型是chat类任务,输入输出都不长,理论上不该这么慢。
部署7B大模型到生产环境,显存够但推理慢得离谱,求优化思路
全部回复
共 89 条之前调vLLM也踩过类似的坑,后来发现瓶颈在prefill阶段,尤其是并发请求的pd分离没做好。你可以看看vLLM的日志里prefill和decode各自耗时,另外试下把--enable-chunked-prefill打开,有时候比调量化管用。
FP8确实能提速,但7B模型在A100上显存不是瓶颈,换了收益可能有限。更建议先查一下是不是CPU负载太高,比如tokenizer或者请求预处理拖了后腿,或者网络IO有延迟。
另外,如果输入输出都不长,试试把max-model-len调小一点,给KV cache多留空间,有时候默认配置会预留太多导致实际批处理效率上不去。TGI也可以试试,但换框架前最好先跑个压测对比下。
我之前也踩过类似的坑,后来发现瓶颈根本不在显存和量化上,而是vLLM默认的调度策略对短请求不友好。试试把max_num_seqs调小到16甚至8,同时开一下continuous batching的细节参数,响应时间能掉一大截。另外FP8确实比BF16快,但前提是你的卡支持且内核编译到位,不然反而会引入额外开销。TGI其实和vLLM半斤八两,换框架不如先看看是不是CPU绑核或者PCIe带宽被占满了,这俩在并发时特别容易成隐形瓶颈。
5个并发就飙到十几秒肯定不正常,你这输入输出又不长,感觉瓶颈不在显存或量化上。建议先看下vLLM的server日志里有没有prefill和decode的耗时拆分,再查一下是不是CPU和GPU之间数据搬运或者tokenize环节卡住了。另外A100跑BF16的7B本来就不会慢,FP8提升也有限,不如试试把max_num_seqs调低到2-3,给每个请求更多连续计算的机会。之前我遇到过类似情况,最后发现是容器里CPU配额被限制得太狠,导致调度线程跟不上。
并发5个就十几秒肯定不正常,先看下是不是CPU算子瓶颈或者显存碎片化,用vllm的日志看下调度延迟。
检查一下prefill和decode的耗时占比,大概率是prefill阶段没吃到连续batch的甜头,试试加长max_num_batched_tokens。
5个并发就飙到十几秒,这明显不是量化或者框架的问题,vLLM在A100上7B模型正常能吃下几十路并发。我怀疑你卡在CPU和GPU之间的数据传输上了,或者pipeline并行没生效,先看看vllm的日志里有没有cpu offload的警告。另外你试过用lookahead scheduling和continuous batching的新版本吗?老版本vLLM对短请求的调度效率挺拉的,升级到最新版或者直接上SGLang可能立竿见影。
我之前调7B的时候也撞过这堵墙,A100 40G跑7B按理说余量很足,但你瓶颈八成不在显存,而在算力调度和batching策略上。vLLM的continuous batching对短输入输出其实不太友好,请求太短导致prefill和decode的切换开销占比太高,你可以试试把max_num_seqs调大点,比如64以上,同时看看是不是vLLM的调度器在等凑batch,延迟反而被拉高了。另外你说的FP8,如果卡是H系列或者有FP8加速,确实能有效提升吞吐,但A100用FP8其实没有硬件加速,收益可能不大,甚至转来转去还更慢。我建议你先用nvidia-smi盯一下GPU利用率,如果只有30%左右,那大概率是CPU显存带宽或者pinned memory传输瓶颈,试试加大--num-cpu-blocks或者开async tensor parallel。TGI的话,它对短文本场景的优化确实激进一些,但换框架成本不小,不如先看看你的tokenizer和模型是否原生支持padding,还有vLLM版本是不是太老,有些版本有已知的性能回归。我之前就是升级到0.6.x后,同样负载吞吐翻了一倍。最后可以确认下业务端是不是有频繁的新连接建立,内网高并发下连接池复用往往比模型参数更影响响应时间。
并发才5个就这么拉胯,先看看是不是CPU和GPU之间数据搬运卡住了,vLLM的prefill阶段容易吃满CPU。
5个并发就十几秒确实不正常,我怀疑问题不在显存或量化上,而是卡在vLLM的调度或者CPU offload上了。你可以先看看GPU util是不是一直满的,如果经常掉到90%以下,多半是prefill和decode阶段互相抢资源,试试把max_num_seqs调小到2或者3,同时开一下continuous batching的日志看看排队情况。FP8对7B模型提升有限,除非你显存真的吃紧,不然先别折腾量化,我觉得更值得查的是输入输出的tokenize和padding设置,有时候短文本反而因为padding到固定长度导致计算浪费。