1.请教关于使用vLLM加速推理的原理,是以空间(GPU显存)换时间(推理时间)吗?
作者:Vincent Zhu
链接:https://www.zhihu.com/question/651333187/answer/3465476891
- 先说答案,不是以空间换时间.
- vllm是利用类似操作系统的分页机制管理多batch推理的k v cache,通过让某些Batch还没用到的kvcache被其他Batch使用,来达到提高显存利用率的效果。这里需要区分,提高已分配显存的利用率,和降显存使用量是有区别的,vllm会把单卡显存先全部占住(有个系数可以配置比例),再分配给k v cache用,没什么降内存可言。
- 从上面的机制看,vllm反而使得单个batch的推理更复杂了,模型还要处理k v cache内存块的间接映射,因此推理时延理论上是变慢的,不过vllm实现了paged attention cuda等融合算子,使得这种劣化并不明显.
- 那么,vllm的优势在哪?它的核心优势是:通过提高已分配显存的利用率,来动态提高多batch推理的batch数.
- 举个例子,推理模型用32k seq len,就需要先预留对应32k的k v cache,但是实际对话场景prompt就很短,比如几十字符(没人愿意多敲键盘),这样的话,预留的32k,后面很大一部分很可能用不到,很浪费,vllm就是把32k分块管理,比如按1k分,当字符长度小于1k时,后面的块就可以动态腾出来,给其它batch先用着,等这个序列刚超过1k时,再给它分配一个新的块。vllm属于对显存资源的高效利用,忽略时延的稍微裂化,算是free luanch了.
- 最后回答下qwen 32k报错的问题,虽然没看具体代码,但个人猜测,vllm会检查当前显卡的显存,能不能跑下单batch 32k,如果这都不行,它就要主动报错了。因为它擅长的是把单batch多余的kv cache给其它batch用,来增大batch数,结果1个batch都跑不下,这属于它的corner case了,没有腾挪余地,跑起来也会随机报错. - 如果是推理速度的话,可以说绝大多数情况要好,但是可以构造vllm更差的场景,比如对长文本进行总结,长输入短输出场景,vllm不一定好,原因1: 是decode推理次数太少,没啥block块的腾挪机会,vllm发挥不了长处,2: 是promopt过长,导致paged attention算子计算要遍历的block块次数很多,每一次间接索引都是额外成本.可以看一下vllm原论文中用的公开数据集,用的是短输入长输出,正好规避了上面两点劣势.
2. Gumbel-softmax 重参数化技巧
在一些论文中,**经常看到关于网络不可求导操作的处理方法,**大致可分为:次梯度和重参数化两类。在看完凌青老师的凸优化课程后,关于次梯度的方法很自然地就理解了(第48节课开头有关于次梯度的讲解),即不可导处的次梯度可能有多种取值,选择不可导点的左梯度和右梯度区间范围内的任意梯度值即可。但是,在阅读论文的过程中,发现关于重参数化方法中Gumbel-Softmax方法的应用更加广泛,但对于这一类方法依然难以理解,特别是其为什么可以求导的本质,不像次梯度直接分配了一个梯度那么直接。直到看到如下两篇笔记解释才恍然大悟,这里推荐给大家:
https://zhuanlan.zhihu.com/p/144140006