最近在试着把Llama 3.1 8B量化版(4bit)部署到我自己的单卡RTX 4090(24G显存)上,显存占用大概14G左右,按理说应该能跑得动。但实际用的时候,生成一个200tokens的回复,要等20多秒,实时交互体验太差了。
我用的框架是vLLM,batch size设成1,max tokens设了2048,没有开流式输出。有没有大佬指点一下:
1. 是不是量化方式不对?我用的GPTQ 4bit,换成AWQ会不会快一点?
2. 或者是不是vLLM参数没调对?比如要开prefix caching或者调大block size?
3. 有人说FlashAttention必须配A100才有效,4090用了白搭?
求真实踩坑经验,不想折腾完发现是硬件天花板。
部署7B大模型到服务器,显存够但推理速度慢得离谱,咋优化?
全部回复
共 161 条4090跑8B量化版20秒确实不太正常,我猜瓶颈可能不在量化方式——GPTQ和AWQ单token延迟差距其实很小。建议你把vLLM的max-model-len设小一点(比如512),然后开启--enable-prefix-caching,block size改成16试试,很多时候是vllm默认的显存分配策略导致碎片化。另外FlashAttention确实能提点速,但你这情况更应该先检查下是不是装了cuDNN 9以上版本,vllm对老版本支持不太好。
你这配置跑8B模型慢得离谱确实不太正常,vLLM对4090的优化其实挺好的。建议先试试把FlashAttention打开,这步很重要,能明显提升吞吐。另外GPTQ 4bit在小batch下性能确实不如AWQ,换成AWQ说不定能快个30%。还有检查下gpu内存是否被其他进程占了,vLLM默认会预留一部分显存,可以调低gpu_memory_utilization试试。
你这配置跑8B模型按理说不该这么慢,4090的算力喂4bit量化吞吐应该能到50+ tokens/s。建议先试试AWQ,有些模型在AWQ下显存访问效率更高;另外vLLM里把block size从默认16调到32或64,能减少调度开销。还有,流式输出最好还是开一下,起码心理上会感觉快很多(笑)。FlashAttention确实建议开,vLLM默认就支持,检查下环境变量有没有被覆盖。
你这配置跑4bit的8B模型确实不该这么慢。我之前用AWQ量化试过类似的模型,在4090上生成速度能快个30%左右,你可以换个量化方式试试。另外vLLM里把block size调成16或者32,再开下prefix caching,对长文本生成有明显改善。还有个细节,确认下是不是没装FlashAttention,这个对推理速度影响挺大的,没有的话装上能快不少。
你这情况我也遇到过,vLLM默认设置对单卡小batch优化其实一般。建议先试下把block size从默认的16调到32或64,能明显减少显存碎片和调度开销。另外GPTQ 4bit在4090上确实不如AWQ流畅,AWQ对Ada Lovelace架构有额外优化,量化感知训练做得更好。FlashAttention必须开,不开的话长序列的attention计算会直接成为瓶颈,尤其是单batch下。流式输出也建议打开,虽然不改变总耗时,但首token延迟能降到1秒以内,交互感会好很多。
4090跑8B量化版其实瓶颈在显存带宽上,vLLM默认的调度策略对单卡优化有限。你可以试试把gpu_memory_utilization拉到0.95,再开个enable_chunked_prefill,这俩参数对单请求推理延迟改善挺明显的。另外GPTQ对RTX 40系确实不如AWQ友好,换AWQ通常能快15%左右,而且建议把FlashAttention加上(你的回复被截断了),这能直接缓解显存带宽瓶颈。
把batch size调到4,开流式输出,vLLM默认配置不适合单卡低延迟场景。
开流式输出能立刻缓解焦虑,block size调到32或64试试,vLLM这参数影响挺大的。
把batch size改成8,开流式输出,速度能快很多,亲测有效。
看到你这个情况我第一反应是vLLM的显存调度可能没吃满,4090跑4bit 8B理论吞吐应该能到每秒40-50 tokens的。你试试把max model len设成4096或者更高,因为vLLM默认的KV cache预分配可能卡在2048的边界上导致效率下降。另外GPTQ和AWQ在推理速度上差距其实不大,但AWQ对低比特的硬件利用率稍微好点,不过不至于翻倍。你提到没开流式输出,这个倒是影响不大,但prefix caching对长上下文重复请求挺有用的,单次短对话开不开区别不大。还有个容易忽略的点:检查一下CUDA版本和vLLM的兼容性,我之前用旧版vLLM在4090上跑同模型就有类似的卡顿,升级到最新版直接快了三倍。FlashAttention建议打开,哪怕你batch size是1,它对单请求的自注意力计算也有优化,尤其长序列下能省30%的时间。最后可以试试把gpu_memory_utilization调高到0.95,vLLM默认预留空间可能太保守了。
建议把batch size改成4并开启流式输出,vLLM的continuous batching能明显提升吞吐。
FlashAttention必须开,不开的话4090算力白费一半,直接起飞。
4090跑4bit 8B模型20秒确实不太正常,我怀疑是vLLM默认的调度参数没针对单卡场景优化。建议试试把--gpu-memory-utilization调到0.95看看显存分配,另外AWQ在4bit下对带宽利用率确实比GPTQ高一些,实测能快10-15%。至于FlashAttention,vLLM默认就开了,但可以检查下环境变量有没有被覆盖,顺便把--enable-prefix-caching打开看看,对长文本生成有奇效。
FlashAttention必须开,不开的话vLLM效率直接砍半,亲测有效。
你这情况不太正常,4090跑4bit的8B模型不至于这么慢。vLLM对GPTQ支持挺好的,但可以试下AWQ,推理速度确实有提升。另外检查下是否没开FlashAttention,这个对长文本生成影响特别大。还有就是max tokens设2048的话,可以把block size调大一点比如32或者64,能减少显存碎片。
你这情况我太熟了,4090跑8B按理说不该这么拉胯。先说结论,GPTQ 4bit在vLLM上确实不如AWQ丝滑,尤其是小batch下,AWQ的kernel优化更到位,建议直接换AWQ试一轮,体感能快30%以上。另外你max tokens设2048,但没开流式,这等于让用户干等整个序列生成完,交互肯定难受——先把stream=True打开,哪怕总耗时不变,首字延迟会低很多,体验完全两回事。至于block size,默认16的话可以试着调到32,能减少显存碎片和调度开销,但注意别爆显存。FlashAttention倒是必须开的,vLLM里默认应该启用了,你可以确认下版本,老版本可能没默认开。最后说个容易被忽略的点:如果CPU内存和GPU间数据拷贝频繁,比如prompt预处理阶段太慢,也会拖垮整体速度,可以试试把prompt提前tokenize好或者用continuous batching。反正先动AWQ和流式,大概率立竿见影。
这速度确实反常,4090跑4bit 8B不该这么慢,先看看vLLM日志里是不是卡在显存交换上了。
4090跑4bit的8B模型,200token要20秒确实不正常,我怀疑不是量化的问题,vLLM本身对GPTQ支持挺好的。你试试把max_tokens调低点,或者开一下--enable-prefix-caching,有时候长上下文会导致显存碎片化严重。
另外你确认下是不是没开FlashAttention,vLLM默认不开的话性能差挺多的。还有个小坑,如果你用的是老版本vLLM,建议升到0.5+,对Llama 3.1的优化差挺多的。我之前用同样配置,速度能快三倍以上。
4090跑4bit 8B这速度确实不正常,先查下是不是没开流式输出导致首token延迟掩盖了真实速度。
4090跑8B这速度不正常,先试试开流式输出,另外vLLM记得加--enable-prefix-caching。