最近公司在做私有化部署,选了Qwen2.5-7B-Instruct,用vLLM跑。8张A10(24G)的卡,但业务方要求并发至少50,单卡batch size调大后显存直接爆掉,报OOM。后来试了GPTQ 4bit量化,效果还行但输出偶尔会乱码,不敢上生产。想问问大家,这种7B模型在真实业务场景下,一般怎么配置推理引擎和量化方案?还有,显存占用和并发数之间有没有一个大概的估算公式?现在完全是摸着石头过河,先谢谢各位大佬了。
部署7B大模型到生产环境,显存和并发怎么平衡?
全部回复
共 87 条vLLM里开--max-num-seqs控制并发批次,8卡A10跑7B其实不用上4bit,FP16加--gpu-memory-utilization 0.9,再把--max-model-len调小到2048,50并发基本能稳住。乱码大概率是GPTQ的group size没调好,换AWQ试试。显存估算粗略按参数两倍加KV cache算,7B FP16大概14G固定,剩下10G留给KV,每token约100KB,50并发2000长度就得预留10G,刚好卡线。
这问题我也踩过坑,7B用vLLM其实没必要死磕单卡batch,可以试试张量并行拆到2卡上,A10的NVLink虽然一般但24G*2跑16的max_batch_size是稳的。量化的话GPTQ乱码大概率是校准集没喂对,换个AWQ或者用vLLM自带的FP8 E4M3试试,效果和速度都比4bit稳。显存估算你就按单token约2KB算,加上KV cache的20%余量,50并发差不多得预留60-70G,8张卡拆两组并行刚好够。
量化乱码大概率是校准集没选好,换AWQ试试,稳定很多。并发50的话8卡A10跑7B其实够,但记得开continuous batching。
8张A10跑7B还要求50并发,这配置本身有点紧啊。我们之前用2张L40S配AWQ量化,压到30并发勉强稳,主要靠vLLM的continuous batching兜底,但显存得预留20%给KV cache波动。GPTQ乱码大概率是校准集没选好,试下用业务真实数据重新跑一遍量化,别用默认的c4。估算的话,单卡能塞多少并发≈(24G-模型权重)/(平均输出token数×2KB),你这场景大概率卡在输出长度上。要不先砍掉流式输出改成全量返回,并发能上来一截。
我们团队之前也踩过这个坑,7B用vLLM硬刚并发确实容易OOM。后来试了AWQ量化配合gptq_model并行,显存占用能压到12G左右,输出稳定性比GPTQ好不少,可以试试。估算的话,单卡显存大致是模型权重(量化后)加KV cache,7B fp16大概14G,4bit大概5G,KV cache按每token约1.5KB算,50并发乘上平均序列长度,再留20%冗余就差不多了。另外A10的带宽有限,建议把max_num_seqs调低点,用pipeline parallel分担,别死磕单卡batch。
我们生产上用的方案是FP16+Tensor Parallel,8卡刚好跑满,并发50靠vLLM的continuous batching撑住,显存峰值能看到每卡20G左右。你那个GPTQ乱码大概率是量化校准集没选好,换用业务数据重新做校准能缓解。公式的话,经验值是:显存 ≈ 权重大小 × 1.2 + 并发数 × 最大序列长度 × 2 × 每个token的KV cache大小(7B大概1.5KB),按这个算完再加10%余量。别迷信4bit,有时候8bit加KV cache量化反而更稳。
遇到过类似问题,建议先明确业务场景的输入输出
我们组之前也踩过类似的坑,A10其实挺尴尬的,24G跑7B原版加长上下文确实紧张。建议先别急着上4bit,试试vLLM的continuous batching配合paged attention,把max-num-seqs调小到16左右,并发50靠排队也能扛住,单卡吞吐反而更稳。量化的话GPTQ要校准集,AWQ对7B更友好些,乱码大概率是校准数据没覆盖到业务场景,拿真实prompt重新跑一遍能改善。显存估算你可以按模型权重+KV cache(大约每token 1.2MB for 7B)+激活值来粗算,但实际最好用vLLM的--gpu-memory-utilization动态调,别用固定公式。
我们之前也踩过这个坑,7B用FP16跑并发确实紧,后来换了AWQ量化配合vLLM的continuous batching,A10上单卡并发能到15左右还不爆显存。乱码大概率是GPTQ的校准集跟业务数据分布差太远,建议自己采样些真实prompt重新校准一下。估算的话,显存大头是模型权重加KV cache,粗略按每并发1-1.5G算比较稳,8张卡撑50并发其实有戏,关键得把max-seq-len压下来。另外可以试试把vLLM的gpu-memory-utilization调到0.9,再开个swap空间兜底,会比直接上4bit稳很多。
量化乱码大概率是calibration数据没选好,换awq试试,另外并发50用8卡A10其实挺紧的,建议压到32再谈。
我们之前7B用fp16+动态batching,单卡撑到8并发没问题,你这8张卡分两批部署,别硬怼单卡batch size。
这题我熟,之前我们也是vLLM+7B,8张A10跑50并发确实紧,但GPTQ乱码大概率是量化参数没调好,试下AWQ或者把group size调成128,效果会稳很多。估算的话,单卡吞吐大概等于显存带宽除以模型大小,24G卡跑4bit约7G模型,并发主要看prefill和decode的显存峰值,建议先用vLLM的--max-num-seqs限制单卡batch,再配合continuous batching,50并发其实能压出来。
我们这边也是类似配置,7B上生产直接上FP8或者AWQ量化会稳很多,GPTQ偶尔乱码可能是校准集跟你们业务数据偏差太大。显存估算可以粗略按模型权重+KV cache来算,7B FP16权重大概14G,每并发KV cache大概几百M到1G,你8张卡总共192G,极限并发其实远不止50,但A10带宽是瓶颈,建议先压测看吞吐而不是死磕显存。我们后来是把max_num_seqs调低,配合continuous batching,并发50完全够用,乱码问题换量化方案后基本没再出现过。
这题我熟,之前我们部署13B也踩过同样的坑。并发50的话,光看显存你得按单卡同时吃下几个序列来算,24G跑7B满血大概也就同时4-6个请求,vLLM的continuous batching能帮你压榨不少,但建议把max-num-seqs调低点,OOM往往是预留给KV cache的空间不够。GPTQ乱码大概率是量化校准集和你们业务数据分布差太远,换个AWQ或者用SmoothQuant试试,实在不行就上FP8,A10虽然不支持但可以看下H20。另外别死磕单卡,8张卡用张量并行加数据并行混着来,把请求数摊开,比硬怼单卡batch size稳得多。
量化乱码大概率是校准集没选好,换AWQ试试,显存公式很难算准,直接拿真实流量压测最靠谱。
看到你说GPTQ偶尔乱码,这个其实挺常见的,4bit下某些敏感token确实容易崩,尤其Qwen系列对量化粒度比较敏感。我最近在搞类似的事,用的是AWQ,配合vLLM的kv_cache管理,明显比GPTQ稳,你可以试试。
显存和并发的估算,其实核心是看每序列的上下文长度,batch size翻倍,显存不是线性涨的,因为kv_cache占大头。粗略算的话,7B fp16大约14G权重,4bit后大概4-5G,剩下每并发大概按1-2G预留(取决于max_len),8张24G卡理论上跑50并发有余量,但要看你的平均token长度是不是很长。
我这边实际配置是vLLM + AWQ 4bit,max_num_seqs设64,gpu_memory_utilization调到0.9,用tensor parallel=4,单卡batch在8-10左右,峰值显存大概20G,没再爆过。不过你那个乱码问题,如果确定是量化引入的,建议用fp8试试,A10支持不好,但可以转bf16 + 动态量化,效果比4bit好很多。
另外你的业务对延迟要求高不高?如果只是内部工具,可以牺牲一点并发,把batch size压到4,用pipeline并行把请求分散到8张卡上,这样显存压力小很多,50并发也能顶住。还有个小坑,vLLM的continuous batching有时候会预分配显存,你最好把max_model_len设小一点,比如2048,能省不少。
量化别用GPTQ,试试AWQ或者FP8,乱码问题大概率是量化粒度太粗。显存估算按每token约2KB算,50并发就得预留100GB以上,A10得全上才稳。
量化乱码大概率是校准集跟你们业务数据偏差太大,GPTQ换AWQ试试,或者用KV Cache量化配合FP8,效果会稳很多。估算的话,显存大头是权重+KV Cache,7B FP16权重约14G,每并发预留1-2G KV Cache,50并发保守要30G+,单卡24G肯定卡脖子。建议vLLM开PagedAttention,batch size别贪,用2张卡做张量并行,剩下6张分摊请求,再把max-token限制在512以内,实际并发做到30-40问题不大。你们业务是长文本还是短问答?这个影响很大。
我们生产上也是7B,8张A10,但用AWQ量化加vLLM的continuous batching,并发能稳在80左右,显存峰值大概单卡19G。GPTQ乱码可能是calibration数据集没选好,试试用业务真实数据重新量化。估算公式的话,大概可以按显存=模型权重+KV cache+激活值来算,7B fp16权重14G,量化后减半,KV cache就看每个请求的序列长度了,一般并发50的话得留8-10G给cache。你那个OOM会不会是max_num_seqs设太高了,vLLM里调低点就能缓解。
之前我们试过7B上生产,A10其实瓶颈不在显存总量,在带宽和并发之间的拉扯。vLLM里可以试试把max-num-seqs调小到16左右,再把gpu-memory-utilization设到0.9,配合continuous batching效果会好很多。
GPTQ乱码那个大概率是量化校准集没选好,换AWQ或者用llama.cpp的Q5_K_M可能更稳,实在不行就保留FP16但把并发拆到两台机器上。估算公式的话,单卡大概能扛的并发≈可用显存/(模型权重KV cache加激活值),7B FP16权重就占14G,剩下10G给KV cache,每用户按2-4K上下文算,大概留1-1.5G,你自己算下就知道20并发左右是极限了。
8张A10跑7B还要50并发,确实紧巴,试试AWQ量化加更长prompt缓存,乱码多半是量化粒度问题。
并发别硬怼batch,上continuous batching,显存公式大概就是模型权重加KV cache,按每请求序列长度估个峰值。
8张卡跑50并发还要稳,建议试试AWQ量化,乱码概率比GPTQ低不少。
你这需求其实paged attention调好就能顶住,先看看vLLM的gpu_memory_utilization设了多少。
我们生产上用的方案是AWQ 4bit配合vLLM,比GPTQ稳很多,乱码基本没遇到过,你可以试试。估算的话,7B模型4bit大概4-5G显存,加上KV cache,50并发建议至少留2G/请求,8张A10理论上够用但得开PagedAttention。你OOM可能是batch size开太猛了,vLLM里调下max-num-seqs和gpu-memory-utilization试试,别让显存吃满。另外如果输出质量敏感,其实可以考虑下FP8,A10不支持但有些卡能跑,效果比4bit好不少。