
刚做推理部署那会我总觉得动态批处理是万能的只要把请求攒到一起批量处理就能最大化利用GPU算力并发量自然就上去了。直到有一次做线上活动用户请求突然暴涨我开了最大的批处理窗口结果系统直接崩了——有的用户请求是10个字的短问题有的用户请求是要生成几千字的长文档把它们硬凑到一个batch里短请求要等长请求全部跑完才能返回不仅首字延迟炸了整个GPU的算力还被长请求占着后面的请求全堵在了队列里。那天凌晨两点我在机房里盯着监控看着队列里的请求越积越多用户的投诉消息一条接一条弹出来急得满头大汗。我临时把动态批处理的窗口调小又手动把长请求和短请求分开调度折腾了快一个小时才把系统慢慢拉回稳定状态。那次事故之后我才明白根本没有什么通用的万能调度策略你得根据自己业务里的请求特点量身定制调度逻辑才能真正把GPU的算力用满。后来我花了一周时间把过去三个月的所有用户请求全拉出来做了统计发现我们的业务里70%的请求都是生成长度不超过200字的短对话20%是生成500字左右的中等长度请求只有不到10%是超过1000字的长文档生成。之前的动态批处理完全不区分这些请求把它们混在一起处理相当于让短请求白白给长请求“陪跑”浪费了大量算力。我重新写了一套调度逻辑把请求分成了三个独立的队列短请求队列的批处理窗口设得很小最多攒3个请求就立刻处理保证首字延迟不超过500ms中等长度的请求队列批处理窗口设到8个平衡延迟和吞吐量长请求队列单独处理最多同时跑2个避免它占满所有算力拖慢其他请求。我还加了一个错峰机制在白天用户请求高峰的时候优先调度短请求把长请求尽量往深夜低峰期挪实在不能挪的就给它单独分配一块GPU资源不和短请求抢位置。改完之后第一次上线我心里还特别没底怕哪里出问题结果监控一打开所有人都惊了之前最多同时支撑12个并发现在轻轻松松跑到了50个平均首字延迟还从之前的1.2s降到了400msGPU的平均利用率从之前的40%涨到了75%。那天我们团队几个人去楼下吃夜宵老板都笑我们说之前天天愁眉苦脸今天终于舍得出来放松了。中间我还踩过一个特别有意思的坑一开始我给队列加了优先级短请求优先级最高结果有一次长请求在队列里等了半小时都没排上队用户直接投诉到了运营那里。后来我又加了一个“饥饿保护”机制不管什么请求在队列里等待超过1分钟就自动提升它的优先级保证不会有请求被无限期插队。就这么一个小小的补丁直接解决了长请求饿死的问题线上再也没出现过类似的投诉。现在很多教程讲推理部署上来就跟你说“用vLLM、用连续批处理就万事大吉了”但你真的放到自己的业务里跑就会发现根本不是那么回事。不同的业务场景请求的长度分布完全不一样做智能客服的大部分都是短请求你可以把批处理窗口设大一点做长文档生成的大部分都是长请求你就得限制同时并发的长请求数量不能贪多。你不先去统计自己的业务数据直接套别人的现成方案最后肯定要出问题。我始终觉得模型优化到最后拼的根本不是你用了多少最新的技术而是你对自己业务的理解有多深。你把用户的请求习惯摸透了把每一秒的GPU时间都安排明白不用什么高大上的新技术靠一套简单的错峰调度就能得到远超预期的效果。很多时候优化的天花板根本不是硬件而是你有没有真的沉下心去了解自己的业务。