最近公司在做私有化部署,选了Qwen2.5-7B-Instruct,用vLLM跑。8张A10(24G)的卡,但业务方要求并发至少50,单卡batch size调大后显存直接爆掉,报OOM。后来试了GPTQ 4bit量化,效果还行但输出偶尔会乱码,不敢上生产。想问问大家,这种7B模型在真实业务场景下,一般怎么配置推理引擎和量化方案?还有,显存占用和并发数之间有没有一个大概的估算公式?现在完全是摸着石头过河,先谢谢各位大佬了。
部署7B大模型到生产环境,显存和并发怎么平衡?
全部回复
共 87 条说实话你们这个配置有点尴尬,8张A10看着不少,但单卡24G对7B模型做高并发确实卡脖子。我之前用类似配置跑过Qwen2.5,vLLM默认的continuous batching其实挺吃显存的,尤其是KV cache,你并发50的话,每张卡至少要分到6-7个请求,而7B模型fp16权重就占14G,剩下10G给KV和中间激活,算下来单卡最多支撑4-5个并发,所以爆OOM太正常了。
GPTQ 4bit出乱码我遇到过,多半是校准集和你们业务数据分布差太远,导致某些层量化误差被放大,建议试试AWQ或者用少量真实业务数据重新做GPTQ校准,能明显改善。另外别只盯着量化,vLLM里有个--kv-cache-dtype fp8的选项,能省不少显存,配合--max-num-seqs限制单卡并发数,比盲目调batch size更稳。
估算公式的话,你可以粗略按:单卡显存 = 权重大小 + KV cache + 激活值,7B量化后权重约4-5G,KV cache每个token大概0.5-1M(取决于head数和层数),激活值看你输入长度。比如输入1K token,并发10,每卡KV可能就要3-4G,再加上权重和开销,24G基本就是极限了。所以要么降并发到30左右,要么上量化加KV cache压缩,建议你先跑个压测脚本,看实际吞吐和延迟的拐点在哪,别凭感觉调。
另外你们业务方要50并发,有没有考虑过用张量并行?8张卡拆成2组4卡并行跑两个副本,虽然单卡显存压力小,但网络通信会拖慢速度,A10的NVLink带宽一般,可能收益不大。还是优先把量化做好,再配合vLLM的PagedAttention,应该能勉强够到50,但输出质量一定要多测几轮,特别是长文本生成,别到时候上线了才发现乱码,那可比并发不够还麻烦。
vLLM里可以试试--max-num-seqs和--gpu-memory-utilization配合调,不用一上来就上量化,先看实际token占用再压并发。另外乱码大概率是GPTQ的act-order没开或者校准集跟业务数据差太远,换个AWQ或者用llama.cpp的Q4_K_M交叉验证下。估算的话,单卡24G跑7B fp16大概14-16G权重,剩下留给KV cache,每个并发按2-4G算差不多能反推个上限,但实际还得看输入输出长度。
8张A10跑7B其实有点浪费了,我们之前用2张3090压到4bit后,并发50没问题,关键得看你的prompt长度和max tokens,这俩才是显存大头。乱码大概率是量化calibration没做好,试试AWQ或者用vLLM自带的量化格式,别用GPTQ硬刚。估算的话,单卡显存=模型权重+KV cache+激活值,7B fp16大概14G,量化后5G左右,KV cache按每token 0.5-1M算,你算下平均请求长度就差不多了。另外可以开vLLM的continuous batching,别自己调batch size,它自动调度更稳。
量化乱码大概率是校准集没选好,换个AWQ试试。并发50用7B其实8卡够了,vLLM开continuous batching比硬调batch size省显存。
这题我熟,之前我们也是7B配A10,50并发想稳就得量化+offload结合着来。GPTQ乱码大概率是校准集没选好,试试用业务真实数据重跑一遍量化,或者换AWQ,稳定性会好不少。估算的话,单卡24G刨掉KV cache和激活值,4bit大概能塞2-3个并发,50并发建议至少上6-8张卡做张量并行,别死磕单卡batch。另外vLLM的continuous batching记得开,显存利用率能再拉高一些。
这问题太真实了,7B上生产建议先上AWQ量化,vLLM开个continuous batching,显存和并发算个大概就按每token峰值来估。
我们组之前也踩过类似的坑,7B塞A10其实不用死磕4bit,可以试试AWQ或者SqueezeLLM,乱码概率比GPTQ低不少。另外vLLM里开--max-num-seqs和--gpu-memory-utilization这两个参数很关键,先把KV cache预留出来再谈并发。估算的话大概看激活参数量×2字节,7B全精度约14G,量化后每并发再加1-2GKV cache,你可以按这个粗算下。另外如果业务不是特别吃实时性,可以考虑把max batch size压到16左右,配合连续batching,50并发其实能扛住。
我之前也踩过类似的坑,7B配A10其实不用一上来就上4bit,可以先试试把max-model-len调小一点,比如4096或2048,vLLM的显存占用能掉一大截,并发50基本够用。GPTQ乱码大概率是量化参数没调好或者校准集太偏,建议换成AWQ试试,稳定性会好很多。估算的话,大概可以按每个并发请求预留200-300MB显存来粗算,但实际还是要看输入输出长度。你那边业务主要跑多长的文本?如果是长文档,可能得考虑下KV cache的优化了。
8张A10跑7B还要求50并发,说实话这配置有点紧,但也不是完全没戏。我之前用4090单卡跑7B量化版,16并发基本就是极限了,你这8卡如果走张量并行,理论上能分摊显存和算力,但关键得看vLLM的调度策略和请求长度。GPTQ乱码这事我遇到过,多半是量化时校准集没覆盖到业务数据里的长尾token,建议用你们真实prompt重新做一遍AWQ或GPTQ校准,别用默认的。估算公式其实没那么玄乎,核心就是每token显存开销乘以最大序列长度,再加上KV cache的余量,你可以在vLLM里开启--max-num-seqs和--gpu-memory-utilization参数做压力测试,一步步往上探。我个人经验是,如果业务方对延迟不敏感,可以牺牲一点并发换稳定性,比如把max-num-seqs锁在32,配合continuous batching,A10上跑4bit量化是能稳住的。另外乱码问题也可以检查下是不是采样温度太高,有时候不是量化的事,是解码参数没调好。你现在是纯文本生成还是带工具调用?如果只是对话,可以试试把输入长度限制到2K以内,能省出不少显存给并发。
量化乱码大概率是calibration数据没对齐,换awq试试,显存和并发粗略按峰值tokens×2算就行。
vLLM里可以试试把max-num-seqs调小一点,配合continuous batching其实不需要硬扛单卡大batch,8张卡做张量并行加pipeline并行反而更稳。GPTQ乱码大概率是校准集和你的业务数据分布差太多,换个AWQ或者用llama.cpp的量化试试。估算的话,显存大头是权重加KV cache,7B fp16权重大概14G,KV cache按每token几十KB算,你可以用这个粗略倒推batch上限。另外A10的带宽是硬伤,并发上去了吞吐可能还是提不起来,建议压测时盯着TTFT和TPOT看。
我们也是7B上生产,量化别用GPTQ,试下AWQ,乱码少很多,显存公式大概就是KV cache加权重,50并发凑合够。
之前跑7B也踩过同样的坑,GPTQ乱码建议换AWQ试试,我们这边AWQ的稳定性明显好一截。vLLM记得开--max-num-seqs和--gpu-memory-utilization,别让默认值吃满显存,实际调到0.9能扛住60并发不OOM。估算的话,单卡显存减去模型权重和KV cache预留,再除以峰值序列长度×2字节,大概就是能跑的并发数,但不同输入长度波动挺大的,最好压测时用业务真实数据跑一遍。另外A10带宽有限,并发高时留意一下吞吐瓶颈,可能卡在显存带宽上。
说实话8卡A10跑7B还爆显存,大概率是vLLM的KV cache和prefill阶段没调好,你试试把max-num-seqs压到16以下,再开个--enable-chunked-prefill,并发50基本够用。量化这块我建议别用GPTQ,换AWQ或者FP8动态量化,乱码问题会少很多,而且7B模型4bit损失真没你想的那么夸张。估算的话,单卡显存占用大概等于模型权重(约4.5G@4bit)+KV cache(每token约0.5M×并发数×序列长度),你拿这个公式反推下batch size就行。
看到你说GPTQ偶尔乱码,我猜可能是量化参数没调好,尤其activation和weight的bits分配,或者校准集跟生产数据分布差太远。7B模型其实用AWQ或者GPTQ的4bit,配合vLLM的tensor parallel,8张A10跑50并发理论上够,但关键在batch size别硬怼,vLLM的continuous batching其实吃不满显存,反而是KV cache占大头。你算显存可以粗略按权重+激活+KV cache来估,激活大概每token几十KB,KV cache是2num_layersnum_headshead_dimseq_len*2字节,7B的话1024长度大概每个并发吃1.5到2G,所以50并发光KV就要75到100G,你24G卡8张总共192G,权重4bit才4G,算下来其实不紧张,但A10的带宽和算力可能才是瓶颈。我建议你先监控一下实际显存峰值,看是不是paged attention没生效,或者max_num_seqs设太高了。另外乱码那个,你可以试试量化后跑一遍完整的eval set,对比perplexity变化,如果只是个别token异常,加个temperature调低或者sampling的repetition penalty可能能压住。你们业务方要求50并发是平均还是峰值?如果是峰值,可以搞个队列削峰,不用硬扛。最后想问问,你们用的vLLM版本是多少?老版本对A10的优化确实差一些,升级到0.6以后可能显存管理好很多。
我们之前也踩过类似的坑,7B用FP16跑并发确实吃紧。建议试试AWQ或者GPTQ的4bit配合vLLM的gptq分支,OOM基本能解决,乱码大概率是量化参数没调好,可以检查下校准集。估算显存的话,粗略公式是模型权重(量化后)+KV cache(大致是batch×序列长度×层数×头数×2字节),你8张卡跑50并发,单卡batch控制在4-6比较稳。另外可以把max-model-len调低些,比如2048,对显存释放帮助很大。
并发50的话,8卡A10跑7B其实够呛,建议先上AWQ量化,乱码问题比GPTQ少很多。
显存估算大概就是模型权重+KV cache,7B 4bit权重约4G,每路并发预留1-2G,你算算就知道瓶颈在哪了。
8张A10跑7B其实挺宽裕的,问题多半出在vLLM的显存分配策略上,建议试试把gpu_memory_utilization调到0.9,然后开--enable-prefix-caching,能省不少重复计算。量化这块别用GPTQ,换AWQ或者把KV cache也量化成8bit,乱码概率会低很多,我们之前测过同参数下AWQ输出稳定性明显更好。估算并发的话,7B FP16大概要14G权重加2-4G的KV cache,单卡24G跑满batch 8到10个并发没问题,8张卡理论能扛80,但实际留30%余量比较稳。
量化还是用AWQ吧,GPTQ乱码太常见了,另外并发50的话7B用vLLM加PagedAttention基本够,不用死磕batch。
这问题我太有同感了,之前我们也遇到过类似的坑。7B其实不用死磕4bit,试试AWQ或者GPTQ的3bit配合vLLM的gptq_marlin内核,显存能压到10G左右,并发50挺稳的。乱码多半是量化后某些层敏感,可以只量化attention部分试试。估算的话,大概1K token峰值显存=参数量×2字节(fp16)+KV cache的2×层数×头维度×序列长,你按这个推到50并发得留出20G余量。