最近公司在做私有化部署,选了Qwen2.5-7B-Instruct,用vLLM跑。8张A10(24G)的卡,但业务方要求并发至少50,单卡batch size调大后显存直接爆掉,报OOM。后来试了GPTQ 4bit量化,效果还行但输出偶尔会乱码,不敢上生产。想问问大家,这种7B模型在真实业务场景下,一般怎么配置推理引擎和量化方案?还有,显存占用和并发数之间有没有一个大概的估算公式?现在完全是摸着石头过河,先谢谢各位大佬了。
部署7B大模型到生产环境,显存和并发怎么平衡?
全部回复
共 87 条试试把max-num-seqs调低配合流水并行,7B用4bit其实够用,乱码多半是采样参数问题。
量化换AWQ试试,稳定性比GPTQ好不少,8卡张量并行跑50并发压力不大。
这问题我太有同感了,之前我们上7B也踩过一模一样的坑。8张A10看着显存不小,但vLLM的prefill和decode阶段峰值差很多,你单纯按模型大小算显存肯定得炸。建议你先别急着上量化,用vLLM的continuous batching把max-num-seqs调低到16试试,配合gpu-memory-utilization留出20%冗余,并发50基本能稳住。至于GPTQ乱码,大概率是校准集和你的业务数据分布差太远,可以试试用几百条真实prompt重新跑一遍calibration,或者换AWQ,我们这边AWQ的稳定性明显好一截。估算公式的话,显存占用大概等于模型权重(7Bfp16约14G,4bit约4G)加上KV cache,每个并发序列大致要预留1到2G(看max-length),所以实际能扛多少并发,瓶颈反而不是显存总量,而是卡间通信和调度开销,A10的NVLink带宽一般,建议把tensor-parallel-size设成2,别8卡全拆。要是业务允许,也可以考虑把输入长度限制在2K以内,这一下能省不少KV cache。你们现在max-length设的多少?有时候问题就出在长文本上。
量化乱码大概率是calibration数据没对齐业务分布,换个AWQ试试。并发50其实不用硬撑batch,加个请求排队机制更稳。
量化别折腾GPTQ了,AWQ稳得多,乱码基本没有;显存估算按batchseq2bytes算,50并发得先砍max-num-seqs。
我之前也踩过类似的坑,7B用vLLM其实不用硬上4bit,可以先试试把max-num-seqs调小一点,配合tensor parallel分到两张卡上,A10互联带宽够用的话并发50反而更稳。乱码那个大概率是GPTQ的group size没调好,换AWQ或者用bitsandbytes的NF4做一下对比,花不了太多时间。显存估算的话,粗略可以按参数量的2倍加上KV cache的余量来算,7B在FP16下光权重就14G,剩下10G左右能塞的KV cache大概够10-15个并发请求,所以你要上50并发基本得靠多卡拆分或者量化,这个数学你要心里有数。另外可以看看官方文档里那个max_paddling_len的配置,有时候是它把显存吃光了。
8张A10跑7B其实挺宽裕的,问题多半出在vLLM的显存管理上,试试把gpu-memory-utilization调到0.9以上,再配合continuous batching,并发50应该能稳。量化别用GPTQ了,AWQ或者FP8对输出质量影响小很多,乱码大概率是量化参数没校准好。估算的话,7B FP16权重占14G,KV cache大概每并发要占1-2G,所以单卡24G跑4-6并发比较稳,8张卡理论能扛32-48并发,但实际还得看平均请求长度。你们业务如果长文本多,建议上StreamingLLM或者PagedAttention的优化版本,能省不少显存。
8张A10跑7B其实挺宽裕的,你这OOM大概率不是显存不够,是vLLM的KV cache和调度策略没调好。我之前用7B模型遇到过类似情况,后来把--max-num-seqs和--gpu-memory-utilization配合着调,比如把利用率压到0.85,再把max-num-seqs从默认的256降到64,并发50照样稳,单卡吞吐反而上去了。量化这块,GPTQ 4bit出乱码我猜是校准集跟你们业务数据差太远,要么换AWQ试下,要么用FP8,A10虽然不支持原生FP8但vLLM有模拟方案,效果比GPTQ稳很多。估算公式的话,显存占用大概等于模型权重(7B FP16约14G,4bit约4G)加上KV cache,而KV cache每个token大概需要2层数头数头维度2字节,你按序列长度1024算一下,再乘以并发数,基本就是峰值需求了。不过说实话,与其纠结公式,不如直接用vLLM的--max-model-len限制上下文长度,比如砍到2048,并发翻倍都不怕。另外你业务方要求50并发,是同时请求数还是吞吐量?如果是吞吐,可以开continuous batching,把请求拆成微批次,A10的算力其实够用,瓶颈经常在显存带宽上。最后建议你在测试环境把量化模型和原模型跑一遍业务样本集,对比下困惑度和关键输出,乱码这种问题大概率是量化误差被放大了,调下exllama的triton内核参数能缓解。
8张A10跑7B其实挺宽裕的,问题多半出在vLLM的调度上。我之前用AWQ量化+动态batch,单卡能稳定扛住12个并发,显存峰值也就18G左右,你可以试试把max-num-seqs调小一点,别让vLLM一次性预分配太多。乱码那个大概率是GPTQ的group size没调对,换成128试试,或者直接上AWQ,稳定性好很多。估算的话,7B 4bit大概4-5G权重+KV cache按每token 0.5G算,50并发得留出25G余量,你算算就知道瓶颈在哪了。
8张A10跑7B其实挺宽裕的,问题多半出在vLLM的显存管理上,试试把gpu_memory_utilization调到0.9以上,再配合continuous batching,50并发应该压力不大。量化这块我踩过坑,GPTQ对7B确实容易出乱码,不如试试AWQ或者直接上FP8,效果和速度都稳一点。估算公式的话,单卡并发大概等于可用显存除以(模型权重/卡数+KV cache per token×序列长度),你按这个粗算一下就能摸到边界了。另外建议把max_seq_len限制在2048,能省不少显存给batch size。
试过AWQ量化没,比GPTQ稳,乱码概率低很多,7B用4bit能压到6G左右。
并发50的话,vLLM开continuous batching,8卡撑住问题不大,关键得把max-num-seqs调准。
8张A10跑7B说实话有点奢侈了,但并发50确实卡在显存和吞吐的临界点上。GPTQ乱码大概率是量化参数没调好,试试awq或者把group size调到128,效果会稳很多。估算公式的话,主要看单卡能塞下多少KV cache,7B fp16权重约14G,剩下10G留给激活和缓存,粗略算下每并发大概占200-300M显存,但实际还得看输入长度。建议先用AWQ+动态batch,再把max-num-seqs卡到合理值,比死磕4bit稳。
说实话你这个场景我太熟了,我们之前用7B模型也踩过同样的坑。A10虽然显存有24G,但vLLM默认的continuous batching对显存管理其实挺粗放的,你直接把batch size拉满肯定爆,建议先看看vLLM的gpu_memory_utilization参数,留个10%-15%给KV cache以外的开销,再配合max_num_seqs限制并发数,别让引擎盲目堆batch。量化这块我建议别碰GPTQ,7B模型4bit下确实容易出诡异token,试试AWQ或者FP8,我们最后是AWQ配合vLLM的awq_marlin内核,稳定性和速度都还不错,乱码基本没再出现过。关于估算公式,核心就是显存占用约等于模型权重加KV cache加激活值,模型权重7B在FP16下是14G,4bit就是3.5G,KV cache大概每并发每token要几百KB,你50并发、输出长度512的话,光KV cache就得预留2-3G,算下来24G单卡其实是能塞下的,关键是要控制好max_model_len和并发上限的乘积。你那边业务方对响应时间有硬性要求吗?如果允许P95到2秒以上,其实可以把并发压到30左右,用两张卡做tensor parallel,剩下卡做replica,这样稳定性会好很多。还有个思路是上vLLM的自动前缀缓存,如果你们业务里system prompt或者few-shot内容重复多,能省下不少显存,实测能提升20%以上的有效并发。最后想问下,你们量化后有没有跑过完整的benchmark集,还是只拿几个case验证的?我担心乱码问题可能不是量化本身,而是calibration数据集选得太偏了。
试试看开PagedAttention和continuous batching,vLLM默认就有,batch大小别硬顶,卡多的话用tensor parallel切分更稳。
看到你这个问题我太有同感了,我们之前用7B模型也踩过类似的坑。vLLM吃显存主要看KV cache和中间激活,8张A10跑50并发确实有点极限,但你这配置其实够用,关键在别把batch size当唯一杠杆。我们后来是直接砍了max sequence length,把输入输出长度从默认的2K压到1K,显存立马松快不少,因为KV cache是跟序列长度线性走的。量化方面,GPTQ乱码大概率是calibration dataset没选好,你试试用业务真实数据重新跑一遍量化,AWQ有时候在这类场景下更稳,我们换完基本没再见过乱码。估算公式的话,你按单并发大概占1-1.5G显存(7B 4bit)来算,再加上模型权重本身8G左右,所以24G卡每张跑4-5个并发、batch size控制在8以内,差不多是安全线,但具体还得看你的输入长度波动。还有个土办法是开vLLM的自动分块KV cache功能,让它自己调度,比手调省心很多。另外你业务峰值是持续的还是突发的?如果是突发,可以接受排队的话,把并发上限设低点,用请求队列平滑一下,比硬顶着OOM强。最后问下,你们有没有试过把8张卡拆成两个4卡服务,分别挂不同模型副本?有时候比单服务硬扛更灵活,还能灰度测试量化版本。
看到你这配置我第一反应是有点奢侈啊,8张A10跑7B其实算力绰绰有余,瓶颈全在显存带宽和调度上。vLLM默认的continuous batching其实吃显存挺狠的,你试试把max-num-seqs调小点,比如16或20,同时开paged attention的swap到CPU,这样并发50主要靠排队而不是同时塞进显存,延迟会稍微高一点但能稳住不OOM。GPTQ乱码大概率是量化参数没校准好,建议你用AWQ试试,或者老老实实上FP8,A10虽然不支持原生FP8但vLLM有模拟层,效果比4bit稳得多。估算公式的话,单卡能承载的并发大概等于(显存减模型权重再减KV cache预留)除以每个请求的平均KV cache大小,7B FP16光权重就14G,剩下10G给KV cache,每个请求如果max-length设2048大概占1.5G左右,所以单卡也就6-7个并发,8卡理论50刚好卡线,但实际要留20%冗余,所以建议你把max-length压到1024或者上量化把权重降到7G,这样每卡能到10-12并发。另外你注意下业务方的50并发是不是峰值,如果只是平均,完全可以靠请求排队加超时重试来扛,vLLM的queue机制比硬塞显存聪明多了。我这边之前用7B跑过类似场景,最后是FP16加max-len 1500,单卡8并发,四卡扛40,宁可让用户等200ms也别冒乱码风险,生产环境稳定性优先。
8张A10跑7B其实挺宽裕的,瓶颈不在显存总量而在单卡并发。我建议试试vLLM的continuous batching配合PagedAttention,把max-num-seqs调到32左右,实测单卡能扛20+并发,8卡分摊50完全够。量化别碰GPTQ,试试AWQ或者FP8,乱码概率低很多,而且速度还快。估算公式的话,7B FP16权重占14G,KV cache每token大概0.5M,你按单卡24G减去权重再除以单序列平均token数就能算出大概并发上限,但实际还要看输入输出长度分布。
8张A10跑7B还撑不起50并发?试试PagedAttention+continuous batching,量化先用AWQ别碰GPTQ。
并发和显存大概按峰值token数×2.5倍算,vLLM里调gpu-memory-utilization到0.9基本能稳住。
我们之前也踩过类似的坑,7B用FP16在A10上跑满并发确实吃力。后来换成AWQ量化,配合vLLM的--quantization awq,乱码基本没出现过,但建议量化后拿业务数据集专门跑一遍回归测试。显存估算可以粗算:模型权重占4G左右(4bit),KV cache大概每并发占0.5-1G,加上激活和碎片,50并发保守得预留30G+,所以8卡分摊下来单卡压力不小。你们GPTQ乱码是不是校准集选得太随意?换用真实prompt分布重新校准一下可能会好。另外如果业务允许,可以考虑把max_seq_len限制到2048,能省不少显存给batch。
遇到过类似的坑,A10跑7B确实得抠着显存用。你这并发50的话,建议试试vLLM的continuous batching开大点,配合FP8或者AWQ量化,GPTQ乱码大概率是校准集没弄好,换AWQ试试稳定性会好很多。估算的话,7B FP16大概14G显存,KVCache按每token约200KB算,50并发加2048长度得预留20G+,所以单卡塞不下,得用张量并行拆到两张卡上。我们之前是4卡A10跑两个副本,每个副本25并发,压测下来挺稳的。
我们生产环境也踩过这坑,7B用8张A10其实有点浪费,但并发50的话单卡塞4个请求基本就到头了。建议试试vLLM的continuous batching加PagedAttention,开起来后显存利用率能提不少,另外量化别用GPTQ,换AWQ或者FP8试试,乱码概率低很多。估算的话,模型权重大概14G(FP16),KV cache按每token 1.2KB算,加上激活显存,单卡能跑几个并发你拿这个算下就清楚了。