最近在搞llama2-70B的本地部署,手头有4张A100(40G),用vLLM加载FP16版本,不管怎么调tensor-parallel-size都报OOM,后来改用AWQ 4bit量化勉强跑起来,但生成质量明显下降,尤其是中文长文本逻辑混乱。我看了半天官方文档,说是要开--quantization参数配合GPTQ,但试了还是不行。想问问有经验的老哥:是不是我加载方式有问题?还是说40G单卡根本玩不动70B?如果非要本地跑,有什么靠谱的量化方案或者offload策略推荐吗?不求速度,只求别崩,能跑通就行。
4张A100部署70B模型老爆显存,量化后效果又拉胯,求指点
全部回复
共 29 条说实话FP16跑70B本来就得8卡80G才稳,4张40G算力够但显存就是卡死瓶颈,tensor-parallel调参救不了物理上限。AWQ掉质量太正常了,中文长文本尤其吃量化精度,建议试试GPTQ用group-size 128,别用默认的256,能稍微好些。另外可以看下OFFLOAD方案,把部分层放CPU内存,配合vLLM的--cpu-offload-gb参数,速度慢点但至少不崩,我之前这么跑过33B效果还行,70B没试过但理论上可行。你量化后有没有跑一下perplexity对比?有时候生成质量差不是量化的问题,是采样参数和prompt格式没调对。
试试把tensor-parallel-size设成2,剩下两张卡用pipeline并行,vLLM对多卡并行策略很敏感。
4张40G的A100跑70B FP16确实太极限了,光权重就要140G,vLLM的显存管理再高效也扛不住。AWQ掉精度在长文本上特别明显,我试过用GPTQ的4bit配合vLLM的--quantization gptq参数,但得确保模型本身是GPTQ格式,别用AWQ的权重去硬套。另外你可以试试把max-model-len调小点,比如2048,能省不少KV cache显存,中文长文本逻辑混乱跟上下文长度被压缩也有关系。还有个野路子是开offload到CPU,虽然慢但至少能跑完整,不过你要有心理准备,生成速度会感人到怀疑人生。
4张40G的A100跑70B FP16确实很极限,光权重就要140G,还得算上KV cache和激活值,tensor parallel切到4张也扛不住。AWQ掉精度在长文本上尤其明显,中文更是重灾区。建议试试GPTQ的4bit加--kv-cache-dtype fp8,或者用exllama2的8bit权重+动态量化,显存占用能压到80G左右。实在不行就上llama.cpp的mmap+offload到CPU,速度慢点但至少不崩,之前用这招跑过130B,效果比AWQ强不少。
说实话你这配置跑70B FP16确实够呛,4张A100 40G加起来才160G显存,但70B模型光权重就要140G,加上KV cache和激活值,vLLM再优化也塞不下,OOM是必然的。我之前试过用8张40G跑FP16才勉强稳,你这情况要么上80G版本,要么就只能走量化路线。
AWQ 4bit效果拉胯我太理解了,中文长文本逻辑混乱基本是量化粒度太粗导致的,尤其llama2的tokenizer对中文支持本来就一般,你再一量化,语义损失直接放大。建议试试GPTQ的3bit或者2bit混合量化,比如用AutoGPTQ配合exllama内核,虽然速度慢点但能保一些精度,或者干脆用bitsandbytes的8bit加offload到CPU,牺牲速度换稳定性。
另一个思路是别硬刚vLLM,改用TGI或者exllama2的加载器,它们对显存管理更灵活,支持流式offload,就算显存不够也能跑,就是慢得离谱。你既然不求速度,可以试试把模型切一半到CPU,用accelerate的device_map自动分配,虽然推理延迟可能到分钟级,但至少不会崩。
还有个坑是--quantization参数得跟模型格式严格匹配,AWQ和GPTQ的kernel不一样,你光改参数不换模型文件肯定报错。建议直接用HuggingFace上的预量化版本,比如TheBloke的GPTQ模型,省得自己折腾。最后问下你tensor-parallel-size具体设的多少,有时候设成2反而比4更稳,因为通信开销小了。
40G单卡跑70B本来就不现实,四卡得开offload或者换70B的GGUF分片试试。
4张40G跑70B FP16确实太极限了,光权重就占140G,张量并行还得考虑激活和KV cache,OOM很正常。AWQ掉精度这事儿我试过,中文长文本尤其明显,不如试试GPTQ用128的group size,配合vLLM的--gptq-marlin选项,显存占用能压到35G左右,质量比AWQ稳一些。另外可以开--cpu-offload-gb,把部分层放CPU,虽然慢但至少不崩,你反正说不在乎速度,这方案值得试。
4张40G的A100跑70B FP16确实勉强,光权重就要140G,张量并行也得看显存带宽够不够。我建议你试试把vLLM的gpu-memory-utilization调到0.9,再把max-model-len砍到2048,能挤出不少空间。AWQ效果差可能是校准集没选好,换个中文数据集重新量化看看。实在不行就上llama.cpp的GGUF Q5_K_M,配合CPU offload,速度慢点但至少不会崩。
说实话FP16的70B光权重就要140G,4张40G卡就算全塞进去也没留给KV cache和中间激活的空间,OOM太正常了。我之前试过把tensor-parallel-size调到4配合--max-model-len砍到2048才勉强不崩,但生成长度一上来还是不行。AWQ掉质量确实明显,尤其是中文,建议试试GPTQ的group-size调到128,或者用EXL2 4bit,比AWQ稳不少。另外vLLM里记得开--gpu-memory-utilization 0.95,把剩余显存全吃满,offload到CPU虽然慢但至少能跑长文。