周五下午那个演示,十几个人差不多是同一分钟点的。
最开始是有人发了句"怎么转圈了",接着连着三四个人跟着发问号。我这边还准备回一句"大伙试试",手停在键盘上没打完。
我这边看着日志,前几个还正常,越往后越慢:
| 同时在问的人数 | 平均等到第一个字 |
|---|---|
| 1 | 1.2 秒 |
| 3 | 2.8 秒 |
| 6 | 6.4 秒 |
| 9 | 19 秒 |
| 12 | 有人直接超时了 |
一个人的时候挺快,人一多就不是"慢一点",是塌了。
原因说白了一点都不玄。模型加载进来占着显存,就那一份,每来一个请求都要用它算一遍。默认配置下请求是排着队来的,前面那个还在往外蹦字,后面的就得等。而且每个请求还得留一块地方放上下文,人越多,这块地方越挤,挤到一定程度就开始有人被挤掉。
那我之前测的时候怎么没发现?因为我是一个人在测。
后来换的东西
vLLM 这类推理框架,管的就是这一摊。它做的事情里,最值钱的是"别让显存碎着用"和"把能一起算的凑一批"。
后面那句稍微解释一下:模型往外吐字是一个一个吐的,第一批里有人问得短,两句就答完了,按老办法这个位置得空着等整批都结束。改成谁答完就撤、立刻把空位补上新请求,卡就一直没闲着。名字叫连续批处理,听着唬人,道理跟食堂收餐盘差不多。
装起来倒不麻烦,包一装,把原来的启动命令换成它提供的那个服务,接口还是 OpenAI 那套,业务代码基本没动:
pip install vllm
vllm serve Qwen/Qwen2.5-7B-Instruct --port 8000
再压一次,同样十二个人,最慢的那个 4 秒多出第一个字。这个提升不是模型变聪明了,纯粹是排队方式变了。
一句不太严谨的话
那个 19 秒,我后来没再复现出来。第二天又压了一轮,同样是九个人,最慢 11 秒,可能是当晚那台机器上还跑着别的东西,也可能是我第一次没记全。
写在这儿是想说,这种数字别太当真,尤其只有一次的时候。倒是"人多就塌"这个现象,两次都很明显。
下载通道排队那回事,VidDown 技术博客里也记过,道理差不多。
哦还有,那次之后我们把演示的人数上限顺手改了,改成了 8 个人一批。改完没再出过事,也就没再动过。