原文:https://zhuanlan.zhihu.com/p/755874470
前言
前一段时间sglang-v0.3.0和vllm-v0.6.0前后脚发布之后,就一直想总结梳理一下现在主流的大模型推理引擎。因为我觉得这也算是一个有意义的节点吧,从此开源大模型推理引擎总算是由"非常粗糙,但是能用"的阶段迈入到了"好用,稍微有那么点粗糙"的阶段。
大模型的推理引擎实际也就是近一两年才开始飞速发展,从最开始的tgi和vllm并驾齐驱到如今sglang、lmdeply的异军突起,整个开源社区都是非常有活力的。但是正如之前所说,从长远的一个视角看如今的开源引擎实际上都还是比较粗糙的,大家都是在摸索中前进。另一方面也是因为现在全世界的目光都聚焦在llm这里,新技术的更新换代太快了,做好一个大模型的推理引擎要做的事情实在是太太太太多了。除了要支持日新月异的新模型和新硬件,还要不断关心学术界最新的paper并且想方设法落地实现。而这些新的想法可能涉及到模型结构、计算策略、调度策略、存储策略、cuda内核、硬件加速等各个层级,这就需要开发者有非常广泛的知识范围和过硬的工程能力。我一直认为大模型推理引擎最难的地方就在于:对模型和硬件的广泛支持以及如何将各种角度的不同优化方法兼容实现。因为写paper的人可以只关心他自己的idea,在transformer库的基础上写个简单demo就行,但是在推理引擎里落地的时候往往就会与其它模块有冲突,需要想办法去做各种兼容。退一步说,即使没有冲突的情况,你也需要对其他基础的优化比较熟悉,你才能在这些的基础上完成新功能的开发。
本文主要分为两部分:
1.总结了一些现在主流推理引擎的现状,给大家在实际应用的时候一些参考吧算是。
2.总结了比较重要的大模型推理优化方法,会持续更新。
主流推理引擎现状
tgi
先从tgi说起吧,作为原本和vllm并驾齐驱的开拓者,有着huggingface的背景可以说是天时地利,但问题真的就是开发人员太不行了,目前是2个月一个版本看起来是属于放弃状态了。这让我想起一模一样的情况就是百度,可以说都是起了个大早赶了个晚集。那么tgi主要有哪些问题呢:
第一,tgi宣称使用了pagedattn技术,但实际上只是在decode时候用了名字叫做"pagedattn"的kernel。我不知道他们的开发人员是真的不明白pagedattn概念还是说开发难度太大,总之结果就是tgi的吞吐会非常差。因为没有pagedattn,预分配显存的时候是按"max_new_tokens"来分配的,导致显存的浪费会非常严重,decode的batch_size上不去。
第二,tgi的cpu和gpu调度是串行模型(vllm都已经改成优化了),导致cpu调度计算时候gpu是闲置的,这也会让吞吐变差。
第三,tgi使用了rust来实现调度逻辑。实际上我觉得没有必要,纯python的开发效果真的比rust高太多了。
最后也就是根本原因,还是开发人员投入不够,版本更新太慢了,各种新的功能都没有,提issue也没什么反馈。
vllm
vllm原本只是作为pagedattn的一个开源实现,但发展到今天已经成为llm推理引擎的标杆了。其优势在
第一,背靠ucb,有着大量且稳定的开发者,作者基本都是在读博士生,github上Contributors已经快600人了,相比于sglang的113人、tgi的134人、lmdeploy的75人、TensorRT的74人,vllm的开发人员投入是最高的。因此vllm对模型的支持和对硬件的支持都是最完善的,以及各种功能也往往是最齐全的。
第二,vllm的社区活跃度是最高的,github上issue和pr都很多。且大量paper都是以vllm作为baseline来开发demo,因此各种新技术的引入vllm是具有更大优势的。基础的各种优化以及进阶的权重量化、kv压缩、speculate decode、chunked prefill、promot cache、constrainted decoding等功能都是完备的。
同时vllm也有一些缺点:
第一,在v0.6.0版本之前,vllm中cpu和gpu的调度是串行的,导致cpu计算时候gpu是闲置的,这也会让吞吐变差。又因为vllm里合入了太多功能,这个情况又更加严重了,vllm高负载下gpu利用率甚至会降低到50%左右。而推动vllm去优化这一块也是因为看到sglang在吞吐的性能上远超于他,才会在v0.6.0里着重优化了这一部分。
第二,vllm里被合入的功能实在是太多了,代码非常臃肿复杂,导致二次开发变得非常困难。月之暗面的mooncake引擎就是基于vllm早期版本的二次开发,不确定他们是固定在那个版本不再同步更新,还是说花了大量工作来保持vllm的同步升级。总之如果你要对开源引擎大改,sglang会是比vllm更好的一个选择。
sglang
sglang也是ucb的团队,但是跟vllm是不同的