性能和调优

性能和调优#

抢占#

由于 Transformer 架构的自回归性质,有时 KV 缓存空间不足以处理所有批处理请求。vLLM 可以抢占请求以释放 KV 缓存空间供其他请求使用。抢占的请求将在有足够的 KV 缓存空间可用时重新计算。发生这种情况时,将打印以下警告:

` WARNING 05-09 00:49:33 scheduler.py:1057] 由于 KV 缓存空间不足,序列组 0 PreemptionMode.SWAP 模式抢占。这可能会影响端到端性能。增加 gpu_memory_utilization tensor_parallel_size 以提供更多 KV 缓存内存。total_cumulative_preemption_cnt=1 `

虽然这种机制确保了系统鲁棒性,但抢占和重新计算会对端到端延迟产生负面影响。如果你经常遇到 vLLM 引擎的抢占,请考虑以下操作:

  • 增加 gpu_memory_utilization。vLLM 使用 gpu_memory_utilization% 的内存预分配 GPU 缓存。通过增加此利用率,你可以提供更多 KV 缓存空间。

  • 减少 max_num_seqsmax_num_batched_tokens。这可以减少批次中的并发请求数量,从而减少对 KV 缓存空间的需求。

  • 增加 tensor_parallel_size。这种方法会对模型权重进行分片,因此每个 GPU 都有更多可用于 KV 缓存的内存。

你还可以通过 vLLM 公开的 Prometheus 指标监控抢占请求的数量。此外,你可以通过设置 disable_log_stats=False 来记录抢占请求的累积数量。

分块预填充#

vLLM 支持一项实验性功能,即分块预填充。分块预填充允许将大型预填充分成较小的块,并将它们与解码请求一起批处理。

你可以在命令行中指定 --enable-chunked-prefill 或在 LLM 构造函数中设置 enable_chunked_prefill=True 来启用此功能。

llm = LLM(model="meta-llama/Llama-2-7b-hf", enable_chunked_prefill=True)
# Set max_num_batched_tokens to tune performance.
# NOTE: 512 is the default max_num_batched_tokens for chunked prefill.
# llm = LLM(model="meta-llama/Llama-2-7b-hf", enable_chunked_prefill=True, max_num_batched_tokens=512)

默认情况下,vLLM 调度程序优先考虑预填充,并且不会将预填充和解码批处理到同一个批次。此策略优化了 TTFT(第一个令牌的时间),但会导致 ITL(令牌间延迟)变慢,并且 GPU 利用率低下。

启用分块预填充后,策略会更改为优先处理解码请求。它会将所有待处理的解码请求批处理到批次中,然后再调度任何预填充。当有可用的 token_budget(max_num_batched_tokens)时,它会调度待处理的预填充。如果最后一个待处理的预填充请求无法放入 max_num_batched_tokens 中,它会将其分块。

此策略有两个优点:

  • 它通过优先处理解码请求来提高 ITL 和生成解码。

  • 它通过将计算密集型(预填充)和内存密集型(解码)请求定位到同一个批次来帮助实现更好的 GPU 利用率。

你可以通过更改 max_num_batched_tokens 来调整性能。默认情况下,它设置为 512,在初始基准测试(llama 70B 和 mixtral 8x22B)中,它在 A100 上具有最佳 ITL。较小的 max_num_batched_tokens 可以实现更好的 ITL,因为有更少的预填充会中断解码。较高的 max_num_batched_tokens 可以实现更好的 TTFT,因为你可以将更多预填充放入批次中。

  • 如果 max_num_batched_tokensmax_model_len 相同,这几乎等同于默认调度策略(除了它仍然优先处理解码)。

  • 请注意,max_num_batched_tokens 的默认值(512)针对 ITL 进行了优化,它的吞吐量可能低于默认调度程序。

我们建议你将 max_num_batched_tokens 设置为大于 2048 以获得更高的吞吐量。

有关更多详细信息,请参阅相关论文(https://arxiv.org/pdf/2401.08671https://arxiv.org/pdf/2308.16369)。

请尝试使用此功能,并通过 GitHub 问题向我们反馈你的意见!