最近在搞一个内部知识库问答的demo,用的Qwen2-7B,用LoRA微调后想部署成API服务给测试组用。单卡A100 40G,用vLLM加载AWQ量化后的模型,跑单轮对话没问题,但一旦并发超过3个请求,或者输入上下文超过2K,就疯狂OOM报错。试过GPTQ和FP16,反而更吃显存。看网上说7B模型4bit量化后只需要8G显存,但我实测光权重就占了11G,KV cache一开再乘个4并发直接爆。想问下是我量化参数没设对(比如group_size、sym这些),还是说7B模型做服务端部署本来就得预留20G以上?另外,有没有办法在vLLM里动态调整KV cache的显存上限?求有实战经验的老哥指点一下,孩子已经被OOM折磨两天了。
部署7B模型微调API总OOM,是量化方案不对还是显存规划有问题?
全部回复
共 76 条我前阵子也踩过这坑,7B AWQ实际吃显存真不是网上说的8G那么理想,光权重加额外开销就快12G了。你试试vLLM里设--kv-cache-dtype fp8,或者干脆把--max-num-seqs调小到2,再配合--gpu-memory-utilization设成0.85,能好不少。另外group_size不用动,sym设成True反而省显存,你这情况大概率是显存规划问题,毕竟40G卡扣掉权重和激活,留给KV cache的余量本来就不多。
你这情况我太熟了,A100 40G跑7B AWQ并发3个爆掉太正常,网上说的8G显存是纯权重静态占用,没算KV cache和激活值,实际部署预留25G以上才稳。你试试vllm里设--kv-cache-dtype fp8或者调低--gpu-memory-utilization到0.85,然后max-num-seqs限制一下并发,group_size设128比64省显存但掉点精度。动态调整KV cache上限官方没直接参数,但可以换PagedAttention的版本,老版本对长上下文支持烂得很。
AWQ权重4bit差不多就11G,网上8G是理论值别全信。vLLM可以调gpu_memory_utilization限制KV cache,先压到0.85试试。
vLLM里用gpu_memory_utilization调下就行,默认0.9太激进,降到0.8试试。7B 4bit权重11G正常,别信8G那套。
KV cache这块确实容易被低估,7B模型4bit权重11G正常,AWQ对group_size敏感,但更关键的是vLLM默认gpu_memory_utilization是0.9,KV cache按剩余显存全吃,并发一上来就炸。你可以试试调低gpu_memory_utilization到0.7左右,再配合max_model_len限制到2K,能明显缓解。另外enable_prefix_caching开起来对知识库这种重复前缀场景挺有用,别死磕量化参数了。
这个思路不错,收藏了。
AWQ 4bit权重占11G不太正常,正常7B量化完应该7-8G左右,你确认下是不是加载时没走量化权重,或者vLLM的dtype没设成float16导致反量化了。40G卡跑7B并发3个就OOM,KV cache确实是大头,2K上下文加4并发大概要十几G,建议把gpu_memory_utilization调到0.85,再限制max_model_len别默认拉满。vLLM里可以用--max-num-seqs控制并发,KV cache上限靠block数间接管,没法直接设硬上限。
你这个情况我大概能猜到,权重占11G其实挺正常的,AWQ 4bit的7B模型理论值确实是7G左右,但实际加载时embedding层和lm_head通常还是fp16,加上vLLM自己的框架开销,11G不离谱。真正搞你的应该是KV cache,vLLM默认会吃掉gpu_memory_utilization剩下的几乎所有显存,40G卡你给个0.9就是36G,权重占完还剩25G全给KV cache,并发一上来或者上下文拉长直接撑爆。你可以先把gpu_memory_utilization压到0.7左右试试,或者用max_model_len限制单请求长度,再把max_num_seqs调小。group_size和sym这些量化参数影响的是权重精度和速度,跟OOM基本没关系,别往那个方向查了。另外vLLM的KV cache是按block预分配的,没有直接动态上限的开关,只能靠上面那几个参数间接控制。说实话单卡40G跑7B做多并发服务挺紧的,测试组用的话建议直接上两张卡做TP,或者换成更激进的量化加限制并发数。
AWQ权重占11G这个数挺正常的,别被网上那个“7B 4bit只要8G”忽悠了,那个数一般是纯权重理论值,没算embedding、lm_head还有各种buffer,vLLM加载完实际占用普遍比标称高两三G。你真正爆的应该不是权重,是KV cache那块,2K上下文加4并发,按7B的KV头数和层数算下来很容易吃掉十几G,A100 40G确实会紧张。量化参数像group_size、sym这些主要影响精度和一点加载开销,跟并发OOM关系不大,别往那个方向折腾了。vLLM里可以调gpu_memory_utilization,默认0.9,你降到0.85左右能给它留点余量,另外max_model_len也压一压,别让它按模型最大长度去预分配。还有个坑是enable_prefix_caching和chunked prefill,长上下文场景开着能省不少峰值显存,值得试试。真要说结论,7B做服务端部署留20G以上是常态,40G卡跑3并发2K已经算勉强,想稳一点要么上两张卡,要么把上下文和并发再砍。
AWQ 4bit权重占11G不太正常,Qwen2-7B量化后一般7-8G左右,你是不是没开--quantization awq或者加载时dtype没设对?另外vLLM可以用--gpu-memory-utilization控制总显存占比,配合--max-model-len压低上下文能明显缓解KV cache压力。40G卡跑7B AWQ,单并发留20G以上比较稳,并发3个以上基本就是KV cache在吃显存了,调小block size或者限制max-num-seqs试试。
vLLM有个gpu_memory_utilization参数,调低点给KV cache留空间,再控制max_model_len别太大。
你这情况大概率不是量化参数的问题,AWQ权重占11G挺正常的,网上说的8G是纯权重理论值,实际加载还有激活和框架开销。KV cache才是并发和长上下文的隐形杀手,2K上下文×4并发在40G卡上确实容易爆。vLLM可以用gpu_memory_utilization调低预留比例,或者直接限制max_model_len和max_num_seqs,先压住峰值再谈优化。
AWQ 4bit权重11G不太对劲,正常7B量化完应该4-5G左右,你是不是加载的时候没指定量化配置,或者vLLM版本把dtype默认成fp16了?40G卡跑7B并发3个还OOM,基本就是KV cache没管住,vLLM里可以调gpu_memory_utilization和max_model_len,把KV cache的显存卡死一点会稳很多。另外AWQ对长上下文本来就不太友好,2K以上建议还是用FP8或者干脆多卡张量并行,别硬扛。
vLLM的gpu_memory_utilization调低到0.85试试,KV cache别让它默认吃满,另外AWQ实际权重确实11G左右,8G那是理论值。
AWQ 4bit权重大概就是7G出头,你看到11G我猜是vLLM默认的gpu_memory_utilization=0.9把大部分显存预留给KV cache了,权重本身没那么大。并发一上来OOM主要就是KV cache不够分,2K上下文加4并发,按Qwen2-7B的GQA配置算下来其实挺吃显存的,40G看着多但vLLM会预分配。可以试试调低gpu_memory_utilization到0.8左右,再用max_model_len限制一下上下文长度,别让它按模型最大长度去预留。另外enable_prefix_caching开着对知识库这种重复prefix的场景帮助挺大,能省不少KV。量化参数group_size一般128就够,sym对显存影响不大,别在这上面纠结。真想压并发成本,可以考虑TP=2或者换更小的模型,7B做生产服务留20G以上是常态,网上那个8G是纯权重理论值,别信。
你这情况我遇到过类似的,先说结论:大概率不是量化参数的问题,是vLLM的显存预分配策略把你坑了。vLLM默认会拿gpu_memory_utilization去卡总显存,但KV cache是按最大并发和最大模型长度预先切好的,你上下文2K加上并发3,它可能直接按你启动参数里的max_model_len去预留,一下就把剩余显存吃光了。AWQ权重11G其实正常,7B在4bit下加上embedding和lm_head那些不量化的部分,10G出头很常见,网上说的8G是纯理论值。你可以试试启动时把max_model_len压到实际需要的大小,比如2048或3072,再把gpu_memory_utilization设成0.85左右,别拉满。KV cache上限在vLLM里没有直接动态调的接口,但可以通过block_size和swap_space间接控制,或者用enable_prefix_caching减少重复占用。真要扛并发,建议上两张卡做tensor parallel,或者换SGLang试试,它的radix attention对长上下文更友好。