最近在折腾本地部署,机器是4090 24G,想跑个7B或13B的模型做代码补全。先试了FP16的Llama-3-8B,加载完权重加KV cache直接OOM,后来用4bit量化(GPTQ)倒是能跑,但生成代码的质量明显下降,尤其是多步推理和长上下文场景,经常出现逻辑断裂。也试过GGUF的Q4_K_M,感觉和GPTQ差异不大。网上看很多人说用vLLM或SGLang能优化显存,但我试了vLLM,同样的量化模型吞吐确实上去了,可单次请求的延迟反而变高了?是不是我配置有问题?另外,像CodeLlama这种专门做代码的模型,量化后是不是比通用模型损失更大?有没有靠谱的折中方案,或者是我该直接换更小的模型?求过来人指点。
部署开源大模型时显存总是不够,量化后效果又变差怎么办?
全部回复
共 48 条试试AWQ量化配合vLLM的chunked prefill,延迟高多半是max-num-seqs没调好,代码模型建议保留更高精度层。
试过AWQ没,同是4bit但比GPTQ稳,8B写代码长上下文逻辑断裂会好很多。
vLLM延迟高大概率是没开chunked prefill,加上max_num_seqs调小点试试。
4090跑8B其实有点尴尬,24G说大不大说小不小,FP16吃紧但4bit又肉疼。你这情况我建议先别急着换模型,试试AWQ或者GPTQ的2-bit混合量化,有些层保留4bit关键层用8bit,效果比均匀量化好不少,而且vLLM对AWQ支持很成熟。延迟变高大概率是vLLM的continuous batching策略在单请求时反而有额外开销,你试试把max_num_seqs调小到1,或者直接关掉前缀缓存,说不定能回来。至于CodeLlama量化损失,确实比通用模型敏感,因为代码生成对token级别的概率分布更挑剔,尤其多步逻辑链上,量化误差会累积。我自己的经验是,7B模型用Q4_K_M跑代码补全,不如直接上13B的Q3_K_S,虽然单步看着笨点,但长上下文连贯性好很多,你可以拿HumanEval跑个对比,别光看生成速度。另外如果只是补全不是对话,试试8K上下文窗口下用F16+KV cache量化(比如KVQuant),省下的显存可能比模型量化更值。最后实在不行,就上Qwen2.5-Coder-7B的GGUF Q5,这模型量化后退化比CodeLlama小,我之前实测过。
4090跑8B其实不至于OOM,你试试把KV cache用PagedAttention或者直接把max length调小点,很多情况下是上下文窗口开太大导致的。延迟变高大概率是因为vLLM默认做了连续批处理,单请求要走排队调度,可以把max_num_seqs调低试试。CodeLlama量化后确实比通用模型损失大,因为代码对token级精度更敏感,尤其长依赖逻辑,建议用AWQ或把Q8的GGUF跑一下,效果比4bit强不少。实在不行就换Qwen2.5-Coder-7B,量化后依然能打,算是折中里比较稳的。
4090跑8B其实不用上量化,FP16配合vLLM开paged attention完全够,你OOM大概率是没开--max-model-len或者KV cache没调好。延迟变高可能是continuous batching导致的,单请求场景下vLLM确实没优势,试试--max-num-seqs调小点。代码模型量化损失确实更明显,因为代码对token级精确度要求高,建议用AWQ或者GPTQ的128g groupsize,比Q4_K_M好不少。实在不行就换Qwen2.5-Coder-7B,量化后表现比Llama稳。
试试把KV cache用8bit量化,或者换Qwen2.5-Coder-7B的AWQ版本,效果比GPTQ稳不少。
vLLM延迟变高大概率是没开streaming或max_num_seqs调太高了,批处理排队把单请求拖慢了,可以试试把max_num_seqs降到8以下。量化对代码模型确实更伤,因为代码对token级逻辑敏感,4bit下注意力权重精度损失会被放大。折中方案建议试试AWQ或Ollama的Q5_K_M,比GPTQ稳不少;再不行就换Qwen2.5-Coder-7B,原生支持长上下文,FP16下24G勉强能跑,代码补全质量比Llama-3-8B量化版强。
量化掉的是推理链的连续性,试试AWQ配合更长上下文窗口,延迟高可能是vLLM的chunked prefill没调好。