本文翻译自 BentoML 工程团队 原文链接:https://www.bentoml.com/blog/benchmarking-llm-inference-backends
选择适宜的推理后端来服务大型语言模型 (LLMs) 至关重要。它不仅可以确保用户通过快速生成速度获得最佳体验,还可以通过 token 的高生成率和资源利用率降本增效。如今,开发者可以选择多种由知名研究和行业团队创建的推理后端。但是,为特定用例选择最佳后端可能具有挑战性。
为了帮助开发者做出明智的决策,BentoML 工程团队在 BentoCloud 上,分别使用 vLLM、LMDeploy、MLC-LLM、TensorRT-LLM 和 Hugging Face TGI 搭建了 Llama 3 推理服务,并对推理性能进行了全面的基准测试。
这些推理后端使用以下两个关键指标进行评估:
1. Benchmark 核心洞见
我们在 BentoCloud 上使用 A100 80GB GPU 实例( gpu.a100.1x80 )对 Llama 3 8B 和 70B 4-bit 量化模型进行了基准测试,涵盖了三种不同的推理负载(10、50 和 100 个并发用户)。以下是我们的一些主要的发现:
Llama 3 8B
Llama 3 8B: 不同后端的 Time to First Token(TTFT)
Llama 3 8B: 不同后端的 token 生成速率
LLama3 70B 4bit 量化
Llama 3 70B Q4: 不同后端的 Time to First Token (TTFT)
Llama 3 70B Q4: 不同后端的 Token 生成速率
我们发现,token 生成率与推理后端实现的 GPU 利用率之间存在很强的相关性。能够维持高 token 生成率的后端也显示出接近100%的 GPU 利用率。相反,GPU 利用率较低的后端似乎受到了 Python 进程的限制。
2. 性能之外
在为 LLMs 服务选择推理后端时,除了性能,还有其他一些重要考虑因素。以下是我们认为在选择理想推理后端时需要考虑的关键维度:
3. 开发者体验
用户友好的推理后端应该为在 LLMs 上运行的 AI 应用提供快速开发能力和代码的高可维护性。
稳定版本:LMDeploy、TensorRT-LLM、vLLM 和 TGI 均提供稳定版本。MLC-LLM 目前没有稳定的标记版本,只有夜间构建;一种可能的解决方案是从源代码构建。
模型编译:TensorRT-LLM 和 MLC-LLM 需要明确的模型编译步骤,这可能会在部署期间引入额外的冷启动延迟。
文档:
4. 概念
Llama 3
Llama 3 是 Llama LLM 系列的最新版本,有多种配置可供选择。我们在基准测试中使用了以下模型大小。
BentoML 和 BentoCloud
我们确保使用 BentoML 提供的推理后端与使用 Python 原生提供的推理后端相比,只增加了极小的性能开销。开销是由于提供了扩展、可观察性和 IO 序列化功能。使用 BentoML 和 BentoCloud 为我们提供了适用于不同推理后端的一致 RESTful API,从而简化了基准测试设置和操作。
推理后端(Inference backends )
不同的后端提供各种方式来服务 LLM,每种方式都有独特的功能和优化技术。我们测试的所有推理后端均遵循 Apache 2.0 许可证。
将 BentoML 与各种推理后端集成以自托管 LLM 非常简单。BentoML 社区在 GitHub 上提供了以下示例项目来协助您完成整个过程。
BentoVLLM:
https://github.com/bentoml/BentoVLLM
BentoMLCLLM:
https://github.com/bentoml/BentoMLCLLM
BentoLMDeploy:
https://github.com/bentoml/BentoLMDeploy
BentoTRTLLM:
https://github.com/bentoml/BentoTRTLLM
BentoTGI:
https://github.com/bentoml/BentoTGI
5. 基准测试设置
我们按如下方式设置测试环境。
模型
我们测试了 Meta-Llama-3-8B-Instruct 和 Meta-Llama-3-70B-Instruct 4-bit 量化模型。对于 70B 模型,我们执行了 4-bit 量化,以便它可以在单个 A100-80G GPU 上运行。如果推理后端支持本机量化,我们将使用推理后端提供的量化方法。例如,对于 MLC-LLM,我们使用 q4f16_1 量化方案。否则,我们使用 Hugging Face 的 AWQ 量化 casperhansen/llama-3-70b-instruct-awq模型。
请注意,除了启用常见的推理优化技术(例如连续批处理、flash attention 和前缀缓存)之外,我们没有针对每个后端微调推理配置(GPU 内存利用率、最大序列数、分页 KV 缓存块大小等)。这是因为随着我们服务的 LLM 数量越来越多,这种方法无法扩展。提供一组最佳的推理参数是后端性能和易用性的隐性衡量标准。
基准测试客户端
为了准确评估不同 LLM 后端的性能,我们创建了一个自定义基准测试脚本。该脚本通过改变用户负载并在不同并发级别下发送生成请求来模拟真实场景。
我们的基准客户端可以在 20 秒内生成目标数量的用户,之后它会通过发送带有随机选择提示词的并发生成请求来对 LLM 后端进行压力测试。我们测试了 10、50 和 100 个并发用户,以评估系统在不同负载下的表现。
每次压力测试都持续了5分钟,在此期间,我们每5秒收集一次推理指标。这个持续时间足以观察到潜在的性能下降、资源利用瓶颈或其他在较短测试中可能无法显现的问题。
欲了解更多信息,请查看我们基准测试客户端的源代码:https://github.com/bentoml/llm-bench
提示词数据集
我们的测试提示词是从 databricks-dolly-15k 数据集提取的。对于每个测试会话,我们从该数据集中随机选择提示词。我们还测试了有系统提示和无系统提示的文本生成。一些后端可能通过启用前缀缓存来优化常见的系统提示场景。
库版本(Library versions)
6. 建议
LLM 推理优化领域正在迅速发展,并得到了大量研究。当今最好的推理后端可能很快就会被新来者超越。根据我们在撰写本文时进行的基准测试和可用性研究,我们针对在各种情况下为 Llama 3 模型选择最合适的后端提出了以下建议。
Llama 3 8B
对于 Llama 3 8B 模型,LMDeploy 在所有用户负载下始终提供较低的 TTFT 和最高的 token 生成速度。它的易用性是另一个重要优势,因为它可以动态将模型转换为 TurboMind 引擎格式,从而简化部署过程。在撰写本文时,LMDeploy 对使用滑动窗口注意机制的模型(例如 Mistral 和 Qwen 1.5)提供有限的支持。
即使用户负载增加,vLLM 也能始终保持较低的 TTFT,这使其适用于保持低延迟至关重要的场景。vLLM 提供轻松集成、广泛的模型支持和广泛的硬件兼容性,所有这些都由强大的开源社区提供支持。
MLC-LLM 在较低用户负载下提供最低的 TTFT,并在最初保持较高的 decoding 速度。经过长时间的压力测试后,其 decoding 速度明显下降。尽管面临这些挑战,MLC-LLM 仍显示出巨大的潜力。解决这些性能问题并实施稳定版本可以大大提高其有效性。
Llama 3 70B 4-bit 量化
对于Llama 3 70B 4 bit 量化,LMDeploy 在所有用户负载下都展现出了令人印象深刻的性能,其 TTFT 最低。它还保持了较高的 token 生成速度,使其成为在需要低延迟和高吞吐量应用中理想的选择。LMDeploy 还因其易用性而脱颖而出,它可以在无需进行大量设置或编译的情况下快速转换模型,使其成为快速部署场景的理想选择。
TensorRT-LLM 在吞吐量方面与 LMDeploy 相当,但在高用户负载场景下的延迟表现不如 LMDeploy。由于 TensorRT-LLM 由 Nvidia 支持,我们预计这些差距将很快得到解决。然而,它对模型编译的内在需求以及对 Nvidia CUDA GPU 的依赖是有意的设计选择,这可能在部署时带来限制。
vLLM 能够在用户负载增加的情况下保持较低的 TTFT,其易用性对于许多用户来说是一个显著的优势。然而,截至撰写本文时,后端对于 AWQ 量化的优化不足,导致量化模型的 decoding 性能不尽理想。