最近在搞一个内部知识库问答的demo,模型选的Qwen2.5-7B-Instruct。服务器是两张4090,单卡24G。刚开始直接FP16加载,单卡推理,结果上下文一长(超过4K)就OOM,后来切了张量并行,两张卡一起跑,总算能跑到8K,但吞吐量特别拉胯。想试试AWQ或者GPTQ量化到4bit,显存是降下来了,但回答质量肉眼可见下降,尤其是代码生成和数学逻辑题,经常胡说八道。
部署7B大模型显存总爆掉,量化后效果又变差,求老哥指条明路
全部回复
共 47 条试试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稳。