最近在搞一个内部知识库问答的demo,模型选的Qwen2.5-7B-Instruct。服务器是两张4090,单卡24G。刚开始直接FP16加载,单卡推理,结果上下文一长(超过4K)就OOM,后来切了张量并行,两张卡一起跑,总算能跑到8K,但吞吐量特别拉胯。想试试AWQ或者GPTQ量化到4bit,显存是降下来了,但回答质量肉眼可见下降,尤其是代码生成和数学逻辑题,经常胡说八道。
部署7B大模型显存总爆掉,量化后效果又变差,求老哥指条明路
全部回复
共 55 条试试vLLM的FP8 KV cache或者投机采样,长上下文吞吐能救回来不少,量化掉点用GPTQ-INT4再加点LoRA微调补偿下。
你这情况我太熟了,之前做rag也是被长上下文卡得要死。我个人感觉7B量化到4bit确实掉点厉害,尤其是推理链长的任务,要不试试kv cache量化或者干脆上vllm的paged attention,能省不少显存。另外如果非要量化,建议只量化attention部分,或者用autoawq跑一下校准集,别直接拿默认参数,质量能回来一点。还有,两张4090其实可以考虑下offload到cpu,虽然慢点但至少不爆。
说实话你这个问题我太有同感了,之前做rag的时候也被7b的显存折磨得够呛。你提到awq和gptq掉点,我猜你大概率是直接用的现成量化权重,没做calibration对吧?这俩方法对校准数据集特别敏感,你用通用数据校准的4bit,跑代码和数学这种分布外的内容,几乎必然崩。我后来自己用训练集里抽了500条知识库相关问答重新跑了一遍gptq的校准,效果明显好了不少,虽然还是比fp16差一点,但至少逻辑题不会瞎编了。
另外你说两张卡张量并行吞吐拉胯,我怀疑是不是没开continuous batching,或者卡间通信没走nvlink?4090没有nvlink的话,pp和tp的通信开销会吃掉大量性能。要是能换思路,干脆试试vllm的fp8动态量化,它支持在推理时动态选择缩放因子,对敏感层的精度损失比静态4bit小很多,而且显存占用也就比fp16少个30%左右,两张卡跑8k上下文应该够。
还有个小坑,qwen的attention计算对内存峰值影响特别大,你要是能接受改模型,试试用flash attention替换原来的实现,单卡4k上下文可能直接变8k。最后想问下,你的知识库是不是纯文本?如果涉及代码题库,要不要考虑混合部署,比如代码问题走8b的qwen coder,其他走7b,这样可能比硬调一个模型划算。
试试vLLM跑FP16,开continuous batching,两张卡张量并行能撑到16K,吞吐也够。别先量化,效果崩了不划算。
说实话你这个问题我太有同感了,之前搞RAG的时候也卡在同样的地方。4090看着24G挺大,但7B模型FP16光权重就14G,KV cache和中间激活一上来,4K上下文确实顶不住。不过你切张量并行只跑到8K还掉吞吐,大概率是通信开销没优化好,可以试试vLLM或者SGLang,它们对张量并行的调度做得比裸transformers强不少,吞吐能翻倍。量化这边我倒觉得不是无解,AWQ和GPTQ对数学和代码的伤害确实明显,但你有没有试过把量化粒度改成128-group或者用HQQ?另外有个取巧的办法,就是FP16跑基础推理,但把系统提示词和常用知识库片段单独embedding缓存起来,减少实际输入长度,这样比纯量化保质量多了。还有个思路是直接上Qwen2.5-14B的AWQ,虽然模型更大但量化后显存反而比7B FP16宽松,而且14B的4bit智商比7B FP16强不少,代码和逻辑题应该能救回来。最后提醒下,检查下是不是max_new_tokens设太高了,有时候生成阶段爆显存比预填充更隐蔽。
试试vLLM+PagedAttention,FP16两张卡能稳跑16K,吞吐比张量并行高不少。
量化掉点正常,试试AWQ加vLLM跑,4090上7B 4bit吞吐能翻好几倍,质量也比GPTQ稳。
4bit量化掉点其实挺看校准集的,你拿通用语料跑的AWQ对代码数学这种任务本来就不友好,试试用自己业务数据混一批代码题做校准,会好不少。另外两张4090跑张量并行通信开销大,吞吐拉胯正常,不如单卡+4bit+FlashAttention先把显存压住。如果还OOM就上vLLM的PagedAttention,8K上下文单卡24G基本能吃下。真要保质量,可以试试GPTQ的group_size调到128配合act_order,比默认配置稳一些。
两张4090跑7B其实够用了,OOM大概率是KV cache没管好。试试vLLM或者SGLang部署,开个gpu_memory_utilization=0.9,PagedAttention能省不少显存,8K上下文单卡就能扛。量化掉点这事我也踩过,AWQ对代码和数学确实伤,可以考虑用FP8或者干脆INT8,4bit拿来跑知识库问答还行,逻辑题就别指望了。另外你张量并行吞吐拉胯可能是没开continuous batching,换推理框架比换量化方案管用。
量化掉点很正常,试试AWQ配vLLM的paged attention,显存和吞吐能兼顾不少。
你这情况太典型了,7B模型在4K上下文OOM基本就是KV cache吃掉的显存,权重才占多少啊。两张4090张量并行吞吐拉胯,多半是卡间通信成瓶颈了,PCIe那点带宽跑TP真的不划算。量化掉点这事,AWQ和GPTQ对代码和数学确实不太友好,这两类任务对权重精度特别敏感,你换个量化校准集可能能救回来一点,但别指望无损。我自己的经验是,与其硬上4bit,不如试试8bit或者用vLLM的PagedAttention,KV cache分页管理能把长上下文的显存压得很狠,而且不用动权重精度。另外你确认下是不是开了重复的tokenizer或者没限制max_new_tokens,有时候生成停不下来也会把显存拖爆。实在要4bit的话,可以试试GPTQ配Exllama2的kernel,比原版快也稳一些,但代码题该错还是错,这个得认。
两张4090跑7B其实挺宽裕的,你FP16 OOM大概率是KV cache没管好,不是模型权重本身的问题。Qwen2.5-7B的权重也就15G左右,单卡塞得下,长上下文爆显存基本都爆在KV上。可以试试vLLM或者SGLang,开paged attention加gpu_memory_utilization调一下,8K上下文单卡应该能扛住,吞吐比张量并行好看多了,TP=2在两张卡之间同步KV开销不小,吞吐掉得厉害很正常。
量化掉点这个事,AWQ/GPTQ对代码和数学确实不太友好,这两类任务对数值精度敏感。你要真在意质量,可以看看FP8,4090虽然没原生FP8算力但跑权重加载问题不大,或者试试GPTQ的group size调小一点、act_order打开,能挽回一些。另外校准集很关键,别用默认的通用语料,拿你自己的知识库问答数据去做校准,效果会好不少。
还有个思路是别死磕量化,直接上KV cache量化,比如fp8 e4m3存KV,权重保持FP16,显存省下来一大块,质量基本不掉。vLLM现在支持这个,配一下就行。你要是就想demo跑通,8K上下文两张4090完全够,别被量化坑了质量。
量化掉智商太正常了,试试AWQ配vLLM的paged attention,显存和效果能平衡不少。
两张4090跑7B其实挺宽裕的,问题多半出在KV cache没管好。你FP16单卡跑4K就OOM,大概率是没开flash attention或者没限制max_model_len,vllm里把gpu_memory_utilization调到0.9、max_num_seqs压小一点,8K上下文单卡应该能撑住。量化掉点这事我也有体会,AWQ对代码和数学确实不太友好,可以考虑换FP8,4090虽然不支持原生FP8计算但用marlin kernel跑W8A8精度损失比4bit小很多,显存也就比FP16少一半。另外张量并行两张卡跑7B,通信开销占比太高,吞吐拉胯是正常的,不如单卡加量化实在。真要在24G上跑长上下文,建议试试chunked prefill配合PagedAttention,再不行就上ntk-aware的rope scaling把上下文拉长但别硬扩。还有个偏方是用Qwen2.5-7B的base加LoRA微调一个领域适配版本,量化后再补一点SFT,掉点能回来不少。你要不先贴下具体用的推理框架和启动参数,大家帮你看看到底卡在哪。
试试vLLM加GPTQ-Int8,比4bit稳不少,显存也够用。