https://www.youtube.com/watch?v=4HPRf9nDZ6Q

主流 LLM 推理框架的运行时开销大致来自:

  1. Python 性能:考虑用户易用性和开发效率,业界主流框架都采用 Python 为主要开发语言、C++实现模型和算子的方式。Python 一直存在让人诟病的 GIL 问题,框架中很多的代码无法有效并行。这导致在高并发场景,Python 执行速度成为了显著的瓶颈。
  2. 通信开销:为了规避 Python GIL 的限制来提升框架的并行度,即使是在单机内,主流框架通常都会引入多进程的设计。此外大模型推理也逐渐扩展至分布式推理,系统模块可能存在多个 Prefill、Decode 实例。系统在运行过程中,不同的模块、实例间需要频繁进行交互。而进程间的通信、消息的序列化和反序列化也不可避免的成为了瓶颈。
  3. 同步执行逻辑:主流的推理框架都会采用分页的 KV Cache 管理,执行流程是严格按照 KV Cache Block 分配、模型计算、KV Cache Block 更新的迭代式的过程。目前业界主流框架都是基本按照同步的设计,各个组件的开销不能被掩盖,当并发变大后累计的开销可能会达到模型计算的量级。

近期,大模型推理社区(vLLM,SGLang 等)普遍开始关注框架运行时开销,提出了多步调度、异步输出处理、独立 API Server 进程等工作,来分摊或掩盖部分开销。在实际业务场景中,也观察到高额的框架开销严重限制了系统吞吐,特别是在高并发(>1k)场景下,运行时开销已经接近或高于 GPU 运行时间,导致资源严重浪费和性能下降。

vLLM社区致力于提升性能,主要通过以下几个方面:

  1. 矩阵乘法优化:使用cuda kernel和cutlass库优化矩阵乘法,实现kernel fusion等功能。
  2. 层级优化:针对特定层(如ffn层)优化Triton内核,提升性能。
  3. 通信性能优化:开发定制的all-reduce CUDA内核,优化数据传输和内存访问,提高并行度。
  4. 注意力机制优化:采用基于CUDA的内核和其他注意力内核,如Flash Attention和FlashInfer。
  5. 量化支持:开发通用量化方法抽象层,实现并优化多种量化方法(FP8、IN8、GPTQ、AWQ等),引入高效量化内核如Marlin。
  6. 模型压缩:LLM Compressor工具支持多种量化方法,高效地将模型量化为vLLM可理解的格式,以提升性能。

image.png

CUDA Graph

Cuda Graph对vLLM的性能提升很大,毕竟vLLM是采用pytorch原生的op配合拓展op搭建的,有很多额外的消耗:user-written logic, PyTorch dispatcher logic, memory allocation overhead, and GPU driver/kernel overhead。使用了cuda graph可以避免掉这些开销。

We find that without CUDA graphs, LLaMA-7B inference executes at 30 tokens/sec, but with CUDA graphs enabled it executes at 69 tokens/sec for a 2.3x speedup.

image.png

唯一可能的缺点就是因为要适配dynamic shape,占用的显存相比之前大些,同时启动时间也因为要捕获graph慢了些。