最近公司在做私有化部署,选了Qwen2.5-7B-Instruct,用vLLM跑。8张A10(24G)的卡,但业务方要求并发至少50,单卡batch size调大后显存直接爆掉,报OOM。后来试了GPTQ 4bit量化,效果还行但输出偶尔会乱码,不敢上生产。想问问大家,这种7B模型在真实业务场景下,一般怎么配置推理引擎和量化方案?还有,显存占用和并发数之间有没有一个大概的估算公式?现在完全是摸着石头过河,先谢谢各位大佬了。
部署7B大模型到生产环境,显存和并发怎么平衡?
全部回复
共 100 条量化乱码多半是calibration没喂好,换AWQ试试,或者干脆上FP8,A10也支持。
并发50的话,8卡每卡分6-7个请求差不多,vLLM开个continuous batching能省不少显存。
看到你说GPTQ偶尔乱码,建议先排除是不是calibration数据集和实际业务分布差异太大导致的,换个更贴近真实场景的校准集试试,比如直接抽你们线上日志里的prompt。8张A10其实挺宽裕的,7B模型用FP16纯显存也就14G左右,单卡塞batch size 8-12没问题,关键是vLLM的KV cache会吃掉大头,你算一下每请求平均token长度,如果是长上下文场景,建议直接上PagedAttention的vLLM最新版,它默认会动态管理显存,不用手动调batch。并发50的话,更建议你试试多卡张量并行加连续batching,比如4卡跑一个实例,剩下4卡再起一个副本,用负载均衡分流量,比单实例硬扛并发稳得多。量化方面,AWQ通常比GPTQ更稳,或者试下FP8,A10不支持但可以看下有没有其他卡。估算公式其实很简单,总显存减去模型权重,剩下的除以每序列KV cache开销(大概2×层数×头维度×2字节×序列长度),再乘个0.8的安全系数就是能同时跑的序列数,你自己套下数据算算就清楚了。另外生产环境强烈建议开vLLM的--enable-prefix-caching,如果业务有公共系统提示词,并发能再提升一大截。
8张A10跑7B并发50其实有点紧,vLLM里开tensor parallel加continuous batching能压不少,但别只盯着batch size,把max-num-seqs和gpu-memory-utilization调一下,留点显存给KV cache,OOM会好很多。量化这块GPTQ偶发乱码挺常见的,可以试试AWQ或者FP8,稳定性会好一些,或者干脆用safetensors加载然后配合vLLM的量化参数调优。显存估算大概就是模型权重加KV cache,7B FP16权重约14G,KV cache按每token几百字节算,具体还得看max sequence length和并发数,建议先压测再逐步加并发,别一上来就顶满。
量化别碰GPTQ,试试AWQ或者FP8,乱码大概率是量化粒度问题。显存估算可以按参数量*2字节(FP16)+KV cache算,7B模型20G左右打底。
先跑个压测看实际峰值占用再调max-num-seqs,硬怼batch size不如限制并发数做排队。
我们这边之前也踩过类似的坑,7B量化后乱码大概率是GPTQ的group size没调好,试试128或者64,另外vLLM里加--quantization gptq参数时记得对应上。显存估算的话,差不多是模型权重(7B*2字节=14G)加KV cache(每个请求约0.5-1G),50并发至少得预留25G,所以单卡24G确实很紧。建议先上AWQ量化,稳定性比GPTQ好一些,或者把张量并行切成两卡跑,这样单卡压力小很多。你们业务方对首token延迟有硬性要求吗?如果容忍2秒左右,可以试试把max-num-seqs调低。
8张A10跑7B其实余量挺大的,瓶颈多半在vLLM的显存分配策略上,试试把gpu_memory_utilization调到0.9以上,再配合--max-num-seqs限制并发数。量化还是建议用AWQ或GPTQ但务必跑一遍量化前后的ppl对比,乱码多半是校准集没选好。估算公式的话,单卡显存需求大致是模型权重(4bit约4G)+KV cache(每token约0.5M乘以batch size和序列长度),你可以按这个倒推最大并发。
这题我刚好踩过坑,8卡A10跑7B其实不用上量化,vLLM里把张量并行开成2,每张卡塞个20的并发,配合continuous batching,峰值显存大概能压到16G左右,实测50并发没问题。乱码大概率是GPTQ的group size没调好,建议换AWQ试试,或者干脆用FP8动态量化。估算公式的话,你按模型权重显存(7B大概14G)+KV cache(每token约0.5M乘总长度)算,再用总显存减去权重部分,剩下的除以单请求平均KV占用,基本就是单卡并发上限了。
vLLM里开continuous batching之后,并发主要看总吞吐而不是单卡batch,你8张A10其实可以试试tensor parallel=2,每张卡塞4个序列,配合PagedAttention的显存池调优,OOM大概率能缓解。量化这块GPTQ乱码可能是校准集选太偏,换AWQ或者用GPTQ加个per-group的128粒度试试,我这边跑过类似模型,4bit下质量损失在可接受范围。至于估算,显存占用大头是模型权重加KV cache,7B fp16权重约14G,KV cache每token大概1.5MB乘以并发数和上下文长度,你按这个粗算再留个30%余量就行。
量化还是上AWQ吧,GPTQ那乱码我也踩过坑,7B用4bit加vLLM开paged attention,50并发8卡A10勉强能稳。
之前遇到过类似的情况,vLLM的continuous batching开起来之后,显存其实主要被KV cache吃掉了,单纯调batch size很容易爆。可以试试把max-num-seqs调低一点,配合--gpu-memory-utilization留出10%-20%的余量,并发50用8张A10理论是够的。GPTQ乱码那个,可能是量化校准集跟你们业务数据分布差太远,建议用自己的一小批真实数据重跑一遍校准。估算的话,7B模型fp16权重占14G,KV cache大概每并发每token占1MB左右,你可以按这个粗略算,但实际波动挺大的。
8张A10跑7B还要求50并发,瓶颈其实不在显存总量,而在单卡吞吐。我之前用FP8静态量化配合vLLM的continuous batching,把max-num-seqs压到单卡8左右,实测能稳在40并发不OOM,你试试动态组batch别硬调batch size。
GPTQ乱码大概率是校准集跟你们业务数据分布差太远,换个200条真实prompt重新量化能缓解。估算的话单卡并发≈可用显存除以(模型权重+KV cache每token占用×平均序列长度),7B全精度大概要16G权重,4bit砍到5G,剩下全留给KV。
另外你们业务方要的50并发是峰值还是均值?如果是偶尔尖峰,用vLLM的抢占调度配合请求排队,比一味堆显存靠谱。我们之前压测发现A10单卡极限也就12-15并发,再多延迟就崩了,真要稳50得考虑上张4090或把模型切到8B以下。
我们之前也踩过类似的坑,7B上vLLM硬扛50并发确实容易OOM,后来发现把max-num-seqs和gpu-memory-utilization调低点反而吞吐更稳。GPTQ乱码建议你试下AWQ或者SqueezeLLM,同样4bit但质量好不少,另外可以加个KV cache量化,能多挤出一半并发。估算公式倒是没有特别准的,大致就是单卡显存除以(模型权重+KVCache+激活值),但vLLM里paged attention会动态分配,实际还是得靠压测调参。你们现在是用张量并行还是数据并行?8张卡分布不均的话可能也会影响并发上限。
你这配置我熟,A10跑7B其实挺尴尬的,24G显存单卡塞满也就撑十几个并发,硬上50得8卡全开再加量化。GPTQ乱码大概率是量化参数没调好,试试AWQ或者把group size调成128,稳定性会好很多。估算公式可以按峰值显存≈模型权重(GB)×1.2 + KV cache(每token约0.5-1MB)×序列长度×并发数来粗算,你反推下batch size和max_seq_len的关系就有数了。另外vLLM记得开continuous batching,别用静态batch,能榨不少性能。
8张A10跑7B其实有点浪费了,单卡24G上4bit量化塞个50并发理论够,但乱码大概率是GPTQ的group size没调好,试试awq或者把trust_remote_code打开重新校准下。显存估算可以粗略按参数量×量化位数/8再乘1.2的KV cache余量,但真实瓶颈往往在prefill阶段,建议用vLLM的continuous batching加上--max-num-seqs限制看看。你们业务场景如果对延迟不敏感,其实可以降点并发换更高精度,不然生产环境出乱码比慢更可怕。
看到你这个情况,我第一反应是8张A10其实挺尴尬的,单卡24G跑7B FP16勉强够,但并发一上来就露馅。我这边之前用过AWQ量化,比GPTQ稳不少,乱码问题基本没遇到过,你可以试试看,毕竟4bit下AWQ对激活值的处理更细腻。关于估算公式,我一般按每个token的KV cache来算,7B模型大概每token要1.5MB左右(4bit下),50并发如果平均输出500token,光KV cache就得吃掉接近40G,所以你单卡根本扛不住,得把并发分布到多卡上,vLLM的tensor parallel或者pipeline parallel都能帮上忙,但别把batch size全堆在一张卡上。还有个坑是max sequence length,业务方如果输入输出都很长,显存占用是平方级涨的,我建议你统计一下线上实际的平均token长度,别按理论最大值配。最后想说,别怕量化,但一定要做压力测试,特别是连续跑几小时看看有没有累积性OOM,GPTQ偶尔乱码可能跟exllama kernel的版本有关,换个backend可能就解决了。
同为踩坑人,vLLM配7B确实急不来。我这边用4卡A10跑过类似负载,单卡并发撑死8-10路,再高就靠量化但质量又悬。你试下把max-num-seqs调到16以下,配合continuous batching,可能比死磕量化稳一点。乱码问题可以检查下GPTQ的group size和desc_act设置,换128+True有时能救回来。
显存估算有个土办法:模型权重约14G(FP16),每路请求的KV cache大概占1-2G,所以24G卡减掉权重后,实际能同时跑的序列数也就5-8个。想上50并发,不堆卡基本没戏,除非业务允许排队或走张量并行把权重摊到多卡上。另外,你们用的是流式输出还是整段返回?后者对显存峰值影响挺大的。
量化乱码大概率是calibration数据没选好,换awq试试,7B用8张A10有点奢侈,其实4张跑50并发压力不大。
8张A10跑7B还要求50并发,不如试试TP=2加FP8,比GPTQ稳,显存也省不少。
8张A10跑7B还卡并发,先查下是不是max_model_len开太大了,那玩意吃显存比batch狠。
8张A10跑7B其实硬件底子不算差,问题大概率出在没开张量并行或者max_model_len设太大了。vLLM里gpu_memory_utilization默认0.9,但A10只有24G,KV cache一开大就容易顶满,你试试--tensor-parallel-size 2或4,把模型切到多卡上,单卡压力立刻小很多。并发50的话,关键看你的输入输出长度,如果平均输出几百token,KV cache才是吃显存的大头,不是权重本身。GPTQ 4bit乱码这事我也遇到过,换成AWQ通常稳一些,或者用FP8在A10上其实也能跑,精度损失比4bit小。估算公式粗略可以按:显存 ≈ 权重 + 并发数 × 单请求KV cache,单请求KV cache大概跟层数、head维度、序列长度成正比,具体数值建议直接拿vLLM的日志去看实际占用。真要压并发,不如上SGLang试试,它的RadixAttention对共享前缀场景省显存很明显。