vLLM 大模型推理引擎调研文档-性能调优

时间:2024-10-20 08:26:12

PagedAttention

参考文档:https://blog.vllm.ai/2023/06/20/vllm.html

  • 内存优化
  • 内存共享

Automatic prefix caching

参考文档同上

自动前缀缓存(Automatic Prefix Caching,简称 APC)会缓存已存在查询的 KV Cache,这样如果新查询与某个已存在查询共享相同的前缀,则可以直接重用 KV 缓存,从而让新查询跳过共享部分的计算。

Batching 策略

  1. Static Batching:传统的批处理方法,批处理大小是固定的,所有请求必须在批处理开始之前到达。
  2. Dynamic Batching:动态批处理允许在运行时动态地将请求组合成批次,相比 Static Batching 增加了时间的限制。
  3. Continuous Batching:连续批处理是一种策略,系统在处理过程中不断地将新到达的请求添加到当前批次中,直到满足特定的条件(如达到最大批次大小或超时)
  4. Inflight Batching:TensorRT-LLM 中 Continous Batching 一种叫法。

Preemption

由于 transformer 架构的自回归特性,有时 KV 缓存空间不足以处理所有批量请求。vLLM 可以抢占请求以释放 KV 缓存空间供其他请求使用,被抢占的请求在足够的 KV 缓存空间再次变得可用时会重新计算。
虽然这种机制确保了系统的鲁棒性,但抢占和重新计算可能会对端到端的延迟产生不利影响,如果经常遇到 vLLM 引擎的抢占,请考虑以下操作:

  • 增加 gpu_memory_utilization,vLLM 通过使用 gpu_memory_utilization% 的内存来预先分配 GPU 缓存,通过增加此利用率可以提供更多的 KV 缓存空间。
  • 减少 max_num_seqs 或 max_num_batched_tokens,这可以减少批量中的并发请求数量,从而需要更少的 KV 缓存空间。
  • 增加 tensor_parallel_size(加 GPU),这种方法会打散模型权重,因此每个 GPU 有更多的内存可用于 KV 缓存。

Chunked Prefill

参考:https://zhuanlan.zhihu.com/p/710165390

vLLM 支持实验性功能 Chunked Prefill,Chunked Prefill 允许将大的 Prefill 分解成更小的块,并与解码请求一起批量处理,可以通过在命令行中指定 --enable-chunked-prefill 或在 LLM 构造函数中设置 enable_chunked_prefill=True 来启用该功能。默认情况下不开启 Chunked Prefill,vLLM 调度器优先处理预填充,如果模型最大上下文长度超过 32K 就会自动开启 Chunked prefill。

  • 模型最大上下文长度超过 32K 就会自动开启其实好理解,请求上下文长度越长 prefill 阶段耗时越长,会直接让同一批的请求都等待 prefill 完成,才能开始 decode
  • 如果我们手动开启 Chunked Prefill(开启之后优先 decode,批量请求达到最大 max_num_batched_tokens 之后直接送去解码,截断还未 prefill 完成的序列),max_num_batched_tokens 的调整对性能优化是有意义的,max_num_batched_tokens 设置越小延迟会越低,但吞吐量会降低;相反 max_num_batched_tokens 越大吞吐量越高,但延迟也越高。

这两个调优参数在最后的测试分析案例有做测试,可以看看案例的结论