最近在尝试把一个7B的ChatGLM模型部署到公司一台T4(16G显存)服务器上,用vLLM加载fp16版本,理论显存占用不到15G,但实际推理时首token延迟要5秒多,生成速度只有不到5 token/s。试了调整batch size和max_num_seqs,效果不明显。是不是T4的带宽太拉了?或者需要上量化?但量化后效果会不会崩?有没有大佬分享下低成本优化推理速度的经验?先谢过了。
部署7B大模型到服务器,显存总够但推理速度慢得离谱,求助优化思路
全部回复
共 158 条T4这卡瓶颈确实在显存带宽上,fp16的7B模型跑预填充阶段特别吃亏,5秒首token已经算正常范围了。建议先试试GPTQ的4bit量化,vLLM支持得挺好,效果损失在可接受范围内,尤其ChatGLM这类模型没那么敏感。另外可以看看是不是没开continuous batching,把max_num_seqs调大点配合gpu_memory_utilization设到0.9,有时候能榨出不少吞吐。还有个偏方,如果业务允许的话,把prompt长度砍短点,或者用flash-attention的v2版本,首token能快个20%左右。你生成速度慢是不是因为输出长度太长?试试限制max_tokens看有没有变化。
T4这个卡瓶颈确实在显存带宽上,fp16的7B模型光权重就要14G左右,每次生成一个token都得把所有参数过一遍,T4的带宽只有300多GB/s,算下来理论极限也就20 token/s,但加上KV cache和中间激活,实际能跑5已经不错了。你试过把max_num_seqs调大反而会让并发请求互相抢带宽,单线程推理可能反而更快,可以试试把并发压到1看下纯串行速度。量化的话建议先试INT8或者GPTQ的4bit,7B模型量化到4bit后显存占用直接砍半,带宽压力也小很多,速度至少能翻倍,效果方面对话任务里一般损失不大,但代码生成和数学推理可能会有明显退化。另外可以看看是不是vLLM的PagedAttention没生效,老版本对ChatGLM的支持有bug,换成最新版或者试试TGI,有时候框架本身的算子优化差距比量化还大。如果实在不想量化,可以考虑把模型切到CPU offload一部分层,但T4的PCIe带宽也会成为新瓶颈,估计不划算。最后提醒下,确认一下你的输入长度,如果prompt很长,prefill阶段的计算量会拖慢首token,可以试试把输入截断或者用流式输出掩盖延迟。
T4这卡确实是瓶颈,16G显存看着够用,但它的显存带宽只有320GB/s左右,7B模型fp16光权重就要14G,每次生成一个token都得把所有权重过一遍,算力根本喂不饱。我之前用3090跑同样模型,速度能到15 token/s,差距就在带宽上。量化肯定要试,INT8基本无损,INT4的话7B模型大概能压到4G显存,速度能翻倍,但确实有概率出现逻辑变笨的情况,尤其数学和代码任务。你可以先只量化KV cache或者用GPTQ的4bit,保留attention部分精度,效果崩的话再回退。另外检查一下vLLM的gpu_memory_utilization设置,别让显存碎片化,还有把max_model_len调低,比如从2048降到1024,能省不少显存做更大的batch。如果公司允许,直接上两张T4用张量并行,带宽翻倍,比折腾量化省心。最后看看是不是CPU加载tokenizer或者预处理卡了,有时候首token慢是数据pipeline的问题,跟推理引擎无关。
T4这卡确实瓶颈在显存带宽上,16G看着够用但7B fp16的权重读取太吃带宽了,首token慢很正常。我之前试过把max_model_len调小到2K,吞吐能上来一些,但你要先确认业务场景能不能接受这个长度限制。量化的话int8基本不影响效果,可以先试AWQ或GPTQ,4bit确实会掉点但代码任务影响不大,建议直接看下lmdeploy的AWQ方案,配T4效果比vLLM稳。还有个小技巧,把KV cache的预留显存调低点,给推理留更多带宽余量,你试试看有没有改善。
T4带宽确实是瓶颈,试试4bit量化加AWQ,速度能翻倍,效果损失一般能接受。
量化到INT4试试,配合vLLM的PTQ,首token能压到1秒内,效果崩不崩看任务。
T4这个卡确实瓶颈在显存带宽上,16G的容量看着够,但300GB/s左右的带宽跑7B fp16的权重,每生成一个token都得把所有参数过一遍,算下来5 token/s基本就是物理极限了。我试过在2080Ti上跑13B,情况跟你差不多,调参根本救不回来。
量化是条路,但建议先试试AWQ或者GPTQ的4bit,效果比想象中的好,7B模型掉点大概在2-3%以内,日常对话体感不明显。vLLM本身支持量化模型加载,改动不大。另外有个取巧的办法:如果你们业务允许,可以把输入序列长度限制在512以内,配合prefill和decode阶段分开调优,首token延迟能压到2秒左右。
再就是检查下有没有开--gpu-memory-utilization,留点显存给KV cache,T4上0.85到0.9比较合适。还有个小细节,vLLM的--max-model-len别设太大,默认可能按4K算,这会占用大量KV cache显存导致实际batch变小。要是能接受损失,上4bit+小batch,跑到8-9 token/s是可能的,再往上就得换卡了。
说实话这速度在T4上挺正常的,别太指望vLLM能变魔术。7B fp16的权重读取就要14G,T4的显存带宽才320GB/s,光把权重读一遍就得40多毫秒,算上attention计算和KV cache读写,首token 5秒基本就是带宽瓶颈卡死了。
你试batch size没用是肯定的,因为单用户场景下batch=1,vLLM的continuous batching优势根本发挥不出来,除非你并发请求多才能摊薄权重读取开销。想提速度最直接的就是上INT8或者INT4量化,ChatGLM量化后效果一般不会崩太多,尤其是用GPTQ或AWQ这类校准过的量化方案,4bit下显存占用能降到6G左右,带宽压力直接减半,速度起码翻倍。
不过也别期待量化后能到20 token/s,T4的算力上限就摆在那,FP16下理论峰值才65 TFLOPS,实际利用率能到30%就算不错了。另一个思路是换更小的模型,比如Qwen2.5-7B的量化版或者干脆上4B模型,如果业务容忍度够高的话。
还有个冷门技巧,把max_model_len调小,比如默认2048改成512,能显著减少KV cache的显存占用和计算量,有时候能意外提升10%-20%的速度。你试试看,如果还不行,大概率就是T4这张卡天生不适合推理,老黄刀法太准了。
T4的显存带宽确实是个瓶颈,fp16的7B模型权重读取一次就要差不多14GB,算下来理论极限也就20 token/s左右,你现在的5 token/s明显还有优化空间。建议先试试GPTQ的4bit量化,结合vLLM的AWQ,速度能翻倍以上,而且7B模型量化后效果损失基本感知不到,特别是ChatGLM这种中文模型。另外把max_model_len调小点,比如2048,能减少KV cache占用,给batch留更多空间,有时候反而吞吐更高。如果还是慢,可以看看是不是CPU负载过高,比如tokenizer或者prefill阶段卡住了,用nsys profile一下看看热点在哪。
T4的瓶颈确实是显存带宽,16G显存跑7B fp16本身就很吃力,5 token/s算是正常水平了。我之前试过把模型量化到int8,速度能翻倍,但效果确实有轻微下降,看你对精度敏不敏感。另外可以试试把max_model_len调低一些,减少显存碎片,或者换用GPTQ的4bit量化,T4上能跑到15 token/s左右。还有个思路是看看是不是vLLM版本没开flash attention,更新到最新版有时候能白嫖20%性能。
说实话你这个情况太典型了,T4的瓶颈根本不在显存容量,而是那块16GB显存对应的只有300GB/s左右的内存带宽,7B模型光权重就有14GB,每生成一个token都得把所有参数过一遍,算下来理论极限也就20 token/s,再扣掉注意力计算和KV cache的读写,5 token/s其实不算离谱。vLLM的continuous batching在你单请求场景下帮助有限,batch size调大反而可能因为并发不够导致排队延迟更明显。
我建议你先试试GPTQ或者AWQ的4-bit量化,用vLLM直接加载量化版,显存占用能降到6GB左右,带宽压力直接砍半,生成速度大概率能翻倍到10-15 token/s。至于效果崩不崩,实测4-bit下ChatGLM这类模型在通用对话上损失很小,除非你做的是数学推理或代码生成这种对精度敏感的任务,否则基本感知不到差异。
另外你还可以开一下vLLM的--gpu-memory-utilization参数,把显存利用率推到0.95,给KV cache多留点空间,然后试试--enable-prefix-caching,如果用户输入有重复前缀能省一大笔prefill时间。还有个小技巧,把模型换成ChatGLM3的6B版本或者用Qwen1.5-7B,架构上对推理做了一些优化,实测在T4上比原版ChatGLM2能快10%-20%。
如果量化后速度还是不满意,那就得考虑换卡了,比如二手2080Ti改22G或者RTX 3090,带宽是T4的2-3倍,那才是质变。先量化试试吧,成本最低见效最快。
T4这卡跑7B fp16确实有点吃力,瓶颈基本就在显存带宽上,算力反而不是主要问题。你可以试试看把max_model_len调小点,或者开一下vLLM的continuous batching,有时候能挤出来点吞吐。量化的话建议先试INT8或者AWQ,7B模型掉点一般能接受,4bit就得留个心眼可能影响对话质量。另外你确认下是不是真跑在GPU上了,有时候pytorch会偷偷把部分op落到CPU,那个速度就完全没法看。
说实话5 token/s对T4来说不算离谱,这卡带宽就摆在那。你与其纠结推理引擎,不如看看能不能用GPTQ的4bit,显存直接砍半,留给KV cache的空间大了,batch size才能真提上去。首token慢大概率是prefill阶段算力吃紧,可以把prompt长度限制一下,或者试下flash-attention有没有装上。效果崩不崩看任务,代码生成和数学这种逻辑性强的任务4bit确实会有可感知的退化,纯对话倒还好。
T4这卡我熟,16G显存带宽只有300GB/s出头,7B模型每个token都要把所有参数过一遍,算下来理论极限也就20token/s,你还得算上其他开销,5已经算能用了。想提速的话,先把vLLM的--gpu-memory-utilization
说实话T4这个卡瓶颈基本就在显存带宽上,300GB/s左右跑7B fp16的权重,理论计算一遍权重就要快2秒,再加上KV cache和中间激活,首token 5秒真不算离谱。你换A10或者L4会好很多,但公司预算卡死的话,量化确实是唯一能立竿见影的路子。
我自己的经验是上INT8或者INT4的AWQ/GPTQ,速度能翻2-3倍,效果崩不崩得看任务。如果你做的是闲聊或者代码生成,INT4基本无感,但要是做数学推理或者长文本精确提取,确实会有掉点,建议先拿几个你业务里的hard case测一下。
另外你vLLM里可以试试把--kv-cache-dtype改成fp8(如果支持的话),能省不少显存带宽,对长上下文尤其明显。还有个小技巧,把max-model-len调低一点,比如从4096砍到2048,有时候能减少碎片化计算,吞吐会意外提升。
还有一点你可能忽略了,T4的PCIe版本如果是3.0x16,那数据从CPU传过去也有延迟,如果你输入token特别长,prefill阶段会卡在传输上。可以试试把输入切短,或者用异步预处理把tokenizer放到另一个线程里跑,别让它占住GPU的调度。
最后说句实在的,如果公司能接受,直接租个云端A100按小时跑也行,比自己折腾T4强太多。但要是只能守着这张卡,量化+调参就是你的最优解了,别想着全精度还有救,T4这带宽就这命。
说实话你这情况我太熟了,T4跑7B fp16就是这德行,瓶颈根本不在显存容量,而在那颗老掉牙的GPU核心和可怜的显存带宽。你算算,7B模型每生成一个token都要把全部权重过一遍,T4的带宽才300GB/s左右,光读权重就得花掉小一秒,首token五秒多太正常了。
量化确实是当前性价比最高的路,我建议你直接上INT4或者INT8,实测下来ChatGLM这种模型量化到INT4,速度能翻两到三倍,而且效果崩不崩主要看你的任务场景,如果是对话或摘要这种生成任务,体感质量损失很小,但如果是做数学推理或者代码生成,确实会掉点,得自己权衡。
另外vLLM在T4上有个坑,就是它默认的KV cache分配策略对老卡不友好,你可以试试把gpu_memory_utilization调到0.85以下,留点显存给碎片,同时把max_model_len调小到2048或者1024,很多时候问题出在预留长度太长导致prefill阶段计算量爆炸。
还有一个骚操作是换AWQ或GPTQ的量化格式,配合vLLM的量化推理支持,比直接加载fp16再量化要快不少,因为权重排布对硬件更友好。你要是愿意折腾,也可以用llama.cpp的GGUF格式跑CPU+GPU混合,虽然有点绕,但T4上反而可能更快。
最后提醒一下,别光盯着生成速度,测一下prefill时间是不是占了大部分,如果长prompt场景,考虑用FlashAttention或者把输入切短,这招对首token延迟提升特别明显。反正低成本路线就这几种,先量化,再调参数,实在不行再考虑换卡。
T4的带宽确实是个瓶颈,16G显存够用但HBM2的带宽撑不起7B模型的decode阶段。我之前试过把fp16换成8bit量化,速度能提到8-10 token/s,效果损失在可接受范围内,特别是对话场景。另外你试试把max_model_len调小点,别让它预分配太多显存,给KV cache留足空间,有时能减少碎片化带来的额外开销。
其实还有个思路,用flash-attention v2配合vLLM的paged attention,开启后首token延迟能降不少,特别是长上下文时。我之前在A10上试过,同样模型从4.5 token/s提到8左右,T4应该也有类似提升。不过量化建议先用GPTQ或AWQ,别用简单的INT8,质量会稳一点。
T4这块卡跑7B fp16确实瓶颈在显存带宽上,270GB/s左右,算力其实够用但数据喂不进去。我试过用AWQ或者GPTQ 4bit量化,速度能翻倍到10+ token/s,效果损失在可接受范围内,尤其是对话场景感知不明显。另外可以看看vLLM的--gpu-memory-utilization参数调高到0.95,给KV cache多留点空间,首token延迟能降不少。你用的ChatGLM是base版还是chat版?如果任务对精度要求没那么极端,试试量化加paged attention的组合,成本几乎为零。
T4的显存带宽确实是个瓶颈,16G显存跑7B fp16本来就有点吃紧,首token5秒大概率是prefill阶段算力不够。你可以试试把max_model_len调小,或者开一下vLLM的continuous batching,有时候能挤出来一点速度。量化的话建议先用GPTQ的4bit试试,效果崩不崩得看下游任务,一般对话场景影响不大。另外如果公司有闲置的P40或者2080Ti,魔改22G显存那种,带宽比T4强不少,成本也低。
T4这块卡的问题确实主要卡在显存带宽上,16G容量够用但带宽只有320GB/s,跑7B的fp16模型每个token要读一遍全部权重,算下来物理上限就6token/s左右,5不到已经接近瓶颈了。量化到int8或者int4能把权重体积砍一半以上,速度能明显翻倍,效果损失在通用任务上其实看不太出来,可以先用GPTQ的4bit版本试试,很多开源模型都有现成量化权重,不用自己折腾。另外你说的首token5秒大概率是prefill阶段没优化好,可以看看vLLM的continuous batching是不是没生效,或者把gpu_memory_utilization调到0.9以上留足KV cache空间。
学到了,感谢分享!
T4的瓶颈确实在显存带宽上,fp16的7B模型跑这个速度基本是常态。你可以试试GPTQ或者AWQ量化到4bit,显存占用砍半后留给KV cache的空间更大,吞吐能明显上来,效果损失对日常对话任务来说基本感知不到。另外检查下vLLM的gpu_memory_utilization是不是设得太保守了,我这边调到0.9之后首token延迟降了差不多1/3。还有个小技巧,如果输入长度比较稳定,可以固定max_model_len,减少动态padding的开销。
说实话T4这卡瓶颈就在显存带宽上,算力反而够用,7B fp16权重加载后大概14G,但推理时每个token都要把全部参数过一遍,T4的带宽只有300多GB/s,算下来理论极限也就20 token/s左右,你跑到5已经算正常偏下了。vLLM的continuous batching在单用户低并发场景下提升有限,不如先试试把max_model_len调小,比如从2048降到1024,能省不少KV cache的显存占用,间接减少内存搬运。量化确实是最直接的路子,不建议直接上INT4,可以先试8bit动态量化,用bitsandbytes加载,准确率掉得很少,速度能翻一倍左右。另外检查下是否用了flash attention,vLLM默认开,但如果你手动改了配置可能没生效。还有个偏方,把模型切到2个GPU上跑(如果服务器有多卡),tensor parallelism虽然会增加通信开销,但T4的PCIe带宽比显存带宽强,实测能提速30%左右。最后提醒下,如果公司有A10或者4090,哪怕显存小点,带宽翻倍,体验会好非常多。