最近在试着把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跑4bit 8B应该每秒30token以上,你先查下是不是没走gpu推理。
vLLM默认配置跑单请求就是这德行,建议把max-num-seqs调小,再开下continuous batching试试。
4090跑8B量化版这个速度确实不正常,我怀疑瓶颈不在量化方式,vLLM本身对GPTQ支持挺成熟的,AWQ在你这场景提升不会太明显。你试试把max tokens降到512看看,有时候长序列的KV cache分配会拖慢首token速度,毕竟2048的上下文对8B模型来说内存开销不小。另外流式输出建议还是开着,虽然不直接提速,但用户感知会好很多,200tokens等20秒和逐字蹦出来完全是两种体验。FlashAttention如果vLLM默认没开,手动把attn_backend设成flash_attn试试,我遇到过类似情况,光这一项能快30%。还有个容易忽略的点,你检查下vLLM的gpu_memory_utilization是不是设太低了,默认值0.9其实有点保守,4090上拉到0.95没问题,给显存留点余量就行。最后确认下是不是跑在PCIe 4.0上,如果插在3.0槽位,模型加载和swap时的带宽瓶颈也会拖慢生成。如果这些还不行,直接换llama.cpp试试,虽然吞吐低但单请求延迟优化得不错。
4090跑4bit的8B按理说不该这么拉胯,20秒200token确实离谱,我怀疑瓶颈压根不在显存上。你vLLM的gpu-memory-utilization是不是没调?默认只吃一点点显存,剩下全浪费了,建议直接拉到0.9以上,让KV cache吃满,效果立竿见影。另外你batch size=1还开2048的max tokens,这等于给每步生成都预留了巨大显存开销,vLLM的page分配会变得很低效,试着把max tokens压到512看看,交互场景根本用不到那么长。至于GPTQ和AWQ,说实话在8B这个规模上速度差异不大,但AWQ对4090的Tensor Core更友好,显存带宽利用率会高一些,你可以换个模型文件对比下,但别指望质变。真正要命的是你关了流式输出,200token一次性吐出来当然感觉慢,开streaming之后首token延迟才是关键,通常几百毫秒就能出第一个字,体验完全不一样。FlashAttention那个选项必须开,vLLM默认可能没启用,不开的话注意力计算会走老路,长序列下能慢三倍以上。最后建议你装个最新版vLLM,老版本对Llama 3.1的优化不全,升级后可能直接快一半。
4090跑4bit的8B模型,20秒生成200token确实不对劲,正常应该能进10秒内。你试试把max tokens改小点,或者关掉vLLM的continuous batching试试,有时候单请求模式下调度开销反而大。GPTQ和AWQ在这个规模上差距不会特别明显,但AWQ对4090的Tensor Core利用率确实更友好,可以换着跑个benchmark对比下。还有,FlashAttention是必须开的,不开的话显存带宽瓶颈会更严重,另外检查下是不是没设gpu_memory_utilization,默认值可能没吃满显存导致KV cache太小。
4090跑4bit 8B这个速度确实不太正常,我怀疑你vLLM的GPU利用率根本没跑满。先试试把--gpu-memory-utilization调到0.9,再开一下--enable-prefix-caching,这俩对单条请求延迟影响挺大。另外GPTQ和AWQ在4090上差距其实不大,你这情况换量化格式估计提升有限,重点还是看vLLM的调度参数。对了,流式输出虽然不降低总耗时,但首token延迟会快很多,体感上会舒服不少,建议先开着。
4090跑4bit 8B这个速度确实不正常,我怀疑瓶颈不在量化方式,vLLM默认配置下单请求延迟本来就偏高,你试试加--enable-prefix-caching,再把block-size调成16,另外把--max-num-seqs设成1。AWQ和GPTQ在你这场景下差距不大,但开流式输出能把首token延迟压到1秒内,体感会好很多。FlashAttention肯定要开,不过vLLM一般默认就启用了,你可以看下日志确认下。还有个思路,如果只是自己交互用,换llama.cpp的server模式,吞吐可能不如vLLM但单请求延迟反而更低。
4090跑4bit的8B模型20秒200token确实不对劲,我怀疑不是量化的问题,GPTQ和AWQ在这代卡上差距没那么夸张。你试试关掉vLLM的continuous batching,或者把--max-num-seqs设成1,有时候调度开销比生成还大。另外你提到没开流式,建议先开streaming看看首token延迟,如果首token很快但总时长长,那就是解码阶段卡住了。还有个小坑,检查下是不是装了最新版CUDA和flash-attn,老版本对Hopper架构支持稀烂,我之前换了个版本直接快了三倍。
4090跑4bit 8B正常不该这么慢,我怀疑你vLLM的gpu-memory-utilization没调,默认只用到90%内存,实际留给KV cache的余量反而小了。把--max-model-len降到1024试试,或者干脆手动指定--gpu-memory-utilization=0.95,有时候显存占用看着低但碎片化严重。 GPTQ和AWQ在8B量级上速度差距不大,除非你量化时group size设得过大,优先排查vLLM的调度参数更靠谱。 FlashAttention我印象里vLLM默认就开着,你如果手动关了反而会慢,可以确认下日志里有没有相关提示。另外别开prefix caching,单用户场景下纯属浪费显存,还容易拖慢首token速度。
4090跑4bit的8B模型生成200token要20多秒确实不正常,我怀疑瓶颈不在量化方式,GPTQ和AWQ在这个规模上差距不会这么大。你试试把vLLM的max-model-len调小点,比如1024,同时把gpu-memory-utilization设到0.9,有时候默认参数会让显存管理很保守。另外FlashAttention最好开着,但更关键的是检查下是不是CPU在跑部分算子,用nvidia-smi看看GPU利用率,如果没到90%以上大概率是数据预处理或采样拖后腿了。流式输出虽然不直接提速,但至少能掩盖延迟,你可以先打开看看每token的耗时分布,定位是prefill还是decode慢。
换个思路,直接上streaming输出,首token延迟砍半,体感能好不少。
你这情况我上周刚踩过坑,4090跑8B按理说不该这么拉胯。vLLM里有个关键参数叫--gpu-memory-utilization,默认只吃90%显存,但你14G占用说明实际分配可能没跑满,试着调到0.95再开个--enable-chunked-prefill,能明显改善首token延迟。GPTQ换AWQ对速度提升有限,真正影响大的是KV cache的block size,默认16容易碎片化,改成128试试。另外流式输出一定要开,200token等20秒体感是翻倍的慢,开了流式至少首字能秒出。最后检查下是不是没开FlashAttention,这玩意儿在4090上能快30%以上。
说实话你这个速度确实不太正常,4090跑4bit的8B模型理论上应该能到每秒30-50token,200个token最多也就五六秒的事。我怀疑瓶颈不在量化方式,GPTQ和AWQ在推理速度上差距没那么大,除非你用的GPTQ是老版本且没做推理优化。
你vLLM里是不是没开gpu_memory_utilization?默认值很保守,可能只用了很少的显存做KV cache,导致频繁重新计算。建议试着调到0.9,然后看看吞吐量有没有明显变化。另外batch size设1的话,vLLM的优势完全发挥不出来,但你说要实时交互,那至少可以把streaming打开,首token延迟会低很多,体感上会流畅不少。
FlashAttention确实建议确认下编译时有没有启用,vLLM默认应该支持,但如果你是自己pip装的,可能依赖没装全导致回退到普通attention了。还有个容易忽略的点,检查下你的CPU有没有在跑数据预处理或者tokenizer的瓶颈,有时候CPU忙不过来也会拖慢整体速度。
你可以先用transformers直接加载同样的模型跑个benchmark对比下,如果transformers反而更快,那肯定是vLLM配置出了问题。最后问下,你的模型是放在机械硬盘还是NVMe上?加载后有没有做warmup?冷启动第一次生成往往慢得离谱。
这个思路不错,收藏了。
4090跑4bit 8B,20秒200token确实不正常,我怀疑瓶颈不在量化方式,GPTQ和AWQ这个体量下差距没那么大。你试试关掉vLLM默认的continuous batching,手动把max_num_seqs调成1,有时候调度开销反而拖慢单请求。另外FlashAttention一定得开,不开的话显存带宽利用率能掉一半,你这延迟大概率跟这个有关。还有个偏方,把gpu_memory_utilization调低到0.85,给CUDA留点缓存余量,有时候能解决奇怪的卡顿。要是还不行,直接换llama.cpp跑一下,排除法定位是不是vLLM本身的问题。
这速度确实不正常,4090跑4bit的8B模型理论上应该每秒能出几十个token。你可以先看看是不是vLLM的max-model-len设太大导致KV cache吃满显存后触发了swap,或者检查下nvidia-smi里显卡功耗是不是没跑满。量化方式对速度影响真不大,AWQ跟GPTQ差距基本在误差范围内,倒是建议把FlashAttention打开,另外关掉流式输出会让首token延迟看着更高,但实际总生成时间应该不受影响。
4090跑4bit的8B模型,200token要20多秒确实不正常,我怀疑你vLLM的gpu_memory_utilization没调够,留太少显存给KV cache了,试试调到0.9以上。还有就是GPTQ在极端低延迟场景下确实不如AWQ,不过更建议你直接上FP8或者把max_model_len砍到1024看看,对交互场景影响不大。另外FlashAttention是得开,但更重要的是确认一下是不是CPU offload了,有时候显存看着够但碎片化严重也会导致速度暴跌。
大概率是vLLM没吃满算力,试试加个--enable-prefix-caching,顺便把block size调到128。
4090跑4bit 8B这个速度确实不对劲,我怀疑不是量化格式的问题,GPTQ和AWQ在这卡上差距没那么大。你试试把max tokens调低到512看看,有时候vLLM的预分配显存策略会拖慢首token速度。另外确认下是不是没装最新版CUDA和flash-attn,我上次就是这两个版本不匹配,装完直接快了三倍。
说实话你这个速度不太正常,4090跑4bit 8B模型应该能到50-80 tok/s的,20秒200token才10tok/s左右,像是没吃到GPU核心。GPTQ换AWQ提升有限,我建议你检查下vLLM是不是没识别到GPU,或者CUDA版本和torch不匹配,之前我遇到过类似问题重装下vllm就好了。另外batch size=1建议把continuous batching关掉,还有千万别用默认的block size,调到16或者32对长文本生成影响挺大的。最后流式输出一定得开,不然TTFT时间全算进去了,体感会快很多。
4090跑8B这速度不正常,先试试开流式输出,顺便看看是不是vLLM的tokenizer成了瓶颈。