最近在搞llama2-70B的本地部署,手头有4张A100(40G),用vLLM加载FP16版本,不管怎么调tensor-parallel-size都报OOM,后来改用AWQ 4bit量化勉强跑起来,但生成质量明显下降,尤其是中文长文本逻辑混乱。我看了半天官方文档,说是要开--quantization参数配合GPTQ,但试了还是不行。想问问有经验的老哥:是不是我加载方式有问题?还是说40G单卡根本玩不动70B?如果非要本地跑,有什么靠谱的量化方案或者offload策略推荐吗?不求速度,只求别崩,能跑通就行。
4张A100部署70B模型老爆显存,量化后效果又拉胯,求指点
全部回复
共 29 条4张40G的A100跑70B FP16确实太勉强了,光权重就要140G,张量并行还得额外留KV cache和激活的空间,OOM很正常。你换成AWQ掉质量也不意外,4bit对中文长文本的语义连贯性损伤本来就大,很多人只测英文基准所以没发现这问题。建议试试GPTQ with act-order,配合vLLM的--quantization gptq参数,但要注意AWQ和GPTQ的校准数据集不同,中文场景最好自己准备一批语料重新校准。另外可以开--swap-space,把部分KV cache offload到CPU内存,虽然会慢但至少能跑,或者考虑用llama.cpp的Q5_K_M量化,CPU+GPU混合推理对70B更友好。还有个思路是换更激进的策略,比如用exllamav2的8bit权重加4bit缓存,显存占用会比纯FP16低不少。最后提醒下,如果只是跑通,可以试试把max-model-len调小到2048,减少KV cache预留,但长文本生成就废了。
4张40G的A100跑70B FP16确实很紧,光是权重就要140G,还得算上KV cache和中间激活,OOM太正常了。你试过把max-model-len调小点吗?比如4096,再把gpu-memory-utilization设到0.95,有时候能挤出来。AWQ掉质量的话,不如试试GPTQ用128的group size,实测中文长文本比AWQ稳不少,速度慢点但至少逻辑不乱。另外可以看下llama.cpp的量化版,虽然跑得慢但不容易崩,适合不求速度的场景。
这问题我也踩过坑,4卡A100跑70B想不量化基本没戏,除非你用offload把一部分层扔到CPU,但那样速度会掉到惨不忍睹。你那个爆显存可能还有个原因,vLLM的tensor parallel对显存分配有额外开销,试试把--max-num-batched-tokens和--max-num-seqs都调低,能省出几个G。量化这块我建议优先试GPTQ 4bit 128g,别用AWQ,中文效果差距挺明显的。如果还不行,就考虑用ExLlamaV2,它对70B的支持比vLLM更省显存,加载方式也简单。
看到你说GPTQ也试了不行,确认下是不是用的AutoGPTQ库?v
说实话你这情况我太熟了,之前用8张A100跑65B也碰过类似坑,vLLM的tensor-parallel-size不是越大越好,4卡必须设成4,但关键是显存碎片和KV cache的预留,你试试把--max-model-len调低到2048或者干脆开--gpu-memory-utilization 0.9,有时候能救回来。AWQ掉质量很正常,尤其中文长文本它本来就不擅长,你可以换GPTQ的4bit但用--group-size 128,比默认的256能好不少,不过也别指望太多。真要稳定跑通,我建议走huggingface的bitsandbytes 8bit加载,配合accelerate的device_map='auto',虽然慢点但显存占用能压到35G左右,4卡刚好塞下。另外你也可以考虑把模型切成两半手动offload到CPU,用transformers的offload_folder参数,就是推理速度会掉到每秒几个token,但起码不崩。最后提醒一句,中文逻辑混乱很多时候不是量化的问题,是温度参数和top_p没调好,你试试temperature 0.6,top_p 0.85,效果可能比换量化方案更明显。
4张40G的A100跑70B FP16确实极限了,光权重就要140G,张量并行还要算上KV cache和激活值,OOM不奇怪。AWQ掉精度这事我遇到过,中文尤其明显,建议试试GPTQ的group size调成128,配合vLLM的--quantization gptq参数,能比AWQ稳一些。真要稳跑,可以上llama.cpp的Q4_K_M加offload到CPU,速度慢但至少不崩,或者考虑下把模型切分层部署到多机,虽然麻烦但显存压力小很多。你试过把max-model-len调小点吗?有时候默认配置太吃显存了。
说实话FP16的70B光权重就要140G,4张40G的卡把KV cache和激活值算进去肯定爆,这不是tensor-parallel调参能解决的。你试下把max-model-len设小点,比如2048,同时开--gpu-memory-utilization 0.95,vLLM能省不少显存。AWQ掉精度是正常的,中文长文本尤其明显,建议试试GPTQ用group-size 128,比AWQ在语言连贯性上稍好点。另外实在不行就上offload,vLLM现在支持CPU offload,虽然慢但至少不崩,或者考虑用llama.cpp的GGUF Q5_K_M,感觉比AWQ稳。
说实话FP16的70B光权重就要140G,4张40G的卡显存上限就160G,加上KV cache和激活值肯定爆,这跟tensor-parallel-size没关系。你试试把max-model-len调小到2048,再配合--gpu-memory-utilization 0.95,应该能挤进去,但batch size基本只能设1。AWQ中文效果差大概率是校准集用的英文,建议换成llama.cpp的Q4_K_M加中文语料重新量化,或者直接用safetensors格式的GGUF,在CPU和GPU混合offload下跑,速度慢点但不会崩。另外vLLM对GPTQ支持确实不如ExLlamaV2,要不你换个推理框架试试?
4张40G的A100跑FP16的70B,显存确实卡在临界点上,vLLM的tensor-parallel对70B要求挺苛刻的,建议试试把max-model-len调低点,比如2048,能省不少KV cache。AWQ掉精度在长文本上确实明显,可以试试GPTQ with act-order,或者用exllama加载4bit,效果比vLLM自带的量化稳一些。另外如果愿意牺牲点速度,offload到CPU加--cpu-offload-gb 40,虽然慢但至少不崩,中文逻辑会好很多。
实在不行就上GGUF的Q5_K_M,配合llama.cpp走CPU+GPU混合推理,我试过70B在4卡上能跑通,质量比AWQ强,就是速度感人,但你说不求速度,这路子可以试下。
40G单卡跑70B确实够呛,试试把max-model-len调小点,或者开offload到CPU,能救一点是一点。
我试过GPTQ和AWQ,中文确实容易崩,要不换GGUF的Q5_K_M配合llama.cpp,显存压力小很多。
4张40G跑70B FP16理论够啊,你tensor-parallel-size设8试试,别用默认值。
试试EXL2 4bit量化,中文表现比AWQ稳,配合vLLM的offload参数能压住显存。
说实话FP16在4卡A100上跑70B确实太勉强了,光权重就140G,就算张量并行也要每卡35G以上,再加上KV cache和中间激活,不爆才怪。你试AWQ掉点严重其实正常,可以看看GPTQ的4bit配合vLLM的--quantization参数,但记得要先用AutoGPTQ把模型转换好,直接加载原版AWQ文件可能不兼容。另外如果追求中文长文本质量,可以考虑offload到CPU,比如用accelerate的device_map='auto',虽然慢但能保证精度不降,或者干脆试下llama.cpp的Q5_K_M量化,CPU推理也能跑,效果比4bit好不少。
试试把tensor-parallel-size调到2,配合vLLM的CPU offload,虽然慢但能稳跑,量化用GPTQ别用AWQ,中文会好不少。
40G单卡确实悬,我4卡跑70B时开--max-num-seqs=1加上--gpu-memory-utilization=0.9才勉强不崩,你参数再调细点试试。
40G单卡跑70B FP16本来就悬,4卡张量并行显存是够了但通信开销和显存碎片容易炸,试试把max-model-len调低点,或者用--gpu-memory-utilization 0.9强制占满。AWQ质量掉得厉害的话,可以换GPTQ的4bit但用--quantize gptq配合exllama内核,效果比vLLM自带的好一些。另外实在不行就上GGUF的Q5_K_M配合llama.cpp,速度慢点但中文长文本逻辑比AWQ强不少,还能offload到CPU。
楼上说的GGUF确实是个路子,不过你4卡A100不用全offload,可以试试把70B拆成一半GPU一半CPU跑,llama.cpp开--split配合--memory-fraction 0.85,比纯量化保真多了。还有你vLLM报OOM的时候看下是不是KV cache没手动设,默认值在70B上很容易爆,--kv-cache-dtype fp16或者直接--block-size 8能救一下。AWQ掉质量建议换GPTQ的3bit加--sym,中文逻辑会稳点,但速度别期待。
我怀疑你tensor-parallel-size没配合--worker-size用,4卡得设成4但vLLM有时候会重复分配权重,试试先跑一遍--profile
说实话4张40G跑70B FP16确实卡在临界点上,张量并行要吃掉额外显存,建议直接上8bit或者4bit的GPTQ别用AWQ,中文场景下AWQ的量化误差就是更大。你可以试试ExLlamaV2加载GPTQ,开--cache-8bit,显存占用能压到30G左右,质量比AWQ好一截。另外vLLM对70B支持确实不太行,换个推理框架可能立竿见影。
4张40G跑70B FP16本来就不够,tensor并行还吃显存,试试GQA+KV cache offload,或者换GGUF的Q5_K_M,质量比AWQ稳。
4张40G跑70B FP16本来就悬,tensor并行得设4且开KV cache offload,不然必爆。
4张40G的A100跑70B FP16,光权重就快140G了,你tensor-parallel-size调到4也只是把模型切到4张卡上,但每张卡还要留KV cache和激活内存,所以OOM很正常,不是加载姿势的问题。AWQ 4bit质量下降在中长文本上特别明显,因为量化误差会在生成过程中累积,尤其是中文这种信息密度高的语言,逻辑容易崩。建议试试GPTQ用group-size=128,不要用默认的32,能保留更多精度,同时配合vLLM的--quantization gptq参数,记得先确认你的模型权重是GPTQ格式,不是AWQ转的。如果还是拉胯,可以上ExLlamaV2,它对4bit的支持比vLLM更成熟,而且支持设备缓存offload,能把部分层放CPU,虽然慢但能抗住不崩。另一个思路是改用llama.cpp的Q5_K_M量化,实测中文效果比AWQ稳不少,配合--n-gpu-layers参数把部分层塞进GPU,剩下放内存,4张卡全用上应该能跑。速度别指望了,但至少逻辑能连贯起来,你可以先拿个几百条中文测试集对比下不同方案的困惑度,再决定用哪个。
说实话70B FP16光权重就要140G,4张40G即使全塞进去也只剩20G给KV cache和激活值,vLLM的显存管理再优化也顶不住。我之前试过把tensor-parallel-size设成4配合--gpu-memory-utilization 0.95,勉强能加载但一长上下文就崩。
AWQ掉精度在中文上确实明显,尤其长文本,建议试试GPTQ的group-size 128加desc_act,比AWQ稳一点。如果还是不行,干脆用llama.cpp的GGUF Q5_K_M加offload到CPU,速度慢但至少不崩,或者考虑用exllama的8bit head加4bit权重混合方案。
你检查过vLLM版本吗?老版本对70B的支持有bug,升级到0.4.2以上会好很多。另外确认下是不是开了--enforce-eager,有时候默认的CUDA graph会额外吃几个G显存。
4张40G的A100跑70B FP16确实太勉强了,光权重就要140G,张量并行也救不了。AWQ掉精度正常,可以试试GPTQ用2的幂次group size,或者干脆上GGUF的Q4_K_M配合llama.cpp,用CPU offload几层,虽然慢点但能稳。另外检查下vLLM的gpu-memory-utilization,默认可能留太少给KV cache。
说实话40G×4跑70B FP16本身就卡在显存带宽瓶颈上,权重都快70G了,tensor-parallel再切也是白搭。建议试试exllama2的8bit或者用llama.cpp的Q5_K_M,中文效果比AWQ稳不少。offload的话可以考虑把KV cache留在GPU,权重扔CPU用--cpu-offload-gb指定,就是速度会掉到个位数tokens/s,但至少不崩。另外GPTQ对70B这种大模型量化损失确实比AWQ小,你可以用AutoGPTQ重新跑一遍group_size=128的4bit,效果会好一截。
说实话你这配置跑70B FP16确实极限了,4卡40G的显存带宽和容量都不够,vLLM的tensor-parallel对70B要求至少80G*4才稳。我建议试试exllamav2的4bit,它的量化损失比AWQ小,中文长文本会好不少,而且支持offload到CPU,慢是慢点但基本不崩。另外检查下是不是显存碎片化,可以开--gpu-memory-utilization 0.9试试。