原文towardsdatascience.com/load-testing-self-hosted-llms-29ca8a4cf43a当一群用户突然开始使用只有你和你的开发团队之前使用过的应用程序时感觉如何这是从原型到生产的百万美元问题。就 LLMs 而言你可以在预算和可接受的品质内进行几十种调整来运行你的应用程序。例如你可以选择量化模型以降低内存使用。或者你可以微调一个小型模型击败大型 LLMs 的性能。我微调了 Tiny Llama 3.2 1B 以替代 GPT-4o你甚至可以调整你的基础设施以获得更好的结果。例如你可能想将使用的 GPU 数量加倍或选择最新一代的 GPU。但你怎么能说选项 A 比选项 B 和 C 表现更好呢在进入生产阶段的最早期这是一个重要的问题。所有这些选项都有它们的成本——基础设施成本或丢失的最终用户体验。这个关键问题的解决方案并不新颖。负载测试在所有软件发布中都已被实践。在这篇文章中我将讨论如何使用免费的 Postman 应用程序快速进行负载测试。我们还将尝试在单个 A40 GPU、2 倍于此或升级到 L40S GPU 之间选择最佳的基础设施。计划我们如何决定基础设施这是我们的目标。我们为推理服务托管了Llama 3.1 8B并使用 Ollama 来部署我们的模型。然而我们不知道托管此模型的硬件是否足够。我们目前部署了一个A40 GPU拥有 48 GB 的 VRAM50 GB 的 RAM 和一个 9vCPU 来服务于推理引擎。我们租用这个基础设施的费用为每月 280.8 美元。在我们上线之前我们需要确保这足以至少服务于 100 个用户。让我们假设其他选项是拥有相同 GPU 的另一个实例成本加倍和租用一个L40S GPU拥有 48 GB VRAM62 GB RAM 和 16 个 vCPU。后者每月费用为 741.6 美元。如果你已经决定租用 GPU你将拥有比这两个更多的选择。但现在让我们只考虑这两个。我们将通过给它们相同的任务来测试这些选项。我们还将模拟 50 个虚拟用户并将数量增加到 100以查看它如何影响响应时间和错误率。让我们开始吧。设置 Postman 进行 LLM 负载测试您可以从他们的网站免费下载 Postman 应用程序。我不会详细介绍安装说明。假设我们的 LLM 公开了一个api/generate端点我们将使用它来生成提示的输出。以下是一个 cURL 示例。curl--locationhttps://api-host/api/generate--headerContent-Type: application/json--data {model:llama3.1:8b,prompt:Write a 100 word essay about a random public figure,stream:false}上述示例要求我们的服务器上的 Llama3.1:8b 创建一篇 100 字的随机文章。让我们在 Postman 上完成这个任务。打开 Postman 应用创建一个新的集合并给它命名。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/40814742c07a0124f759684f030decdf.png在 Postman 中创建新集合 – 作者截图。然后点击新创建的集合上方的导入按钮并将示例 cURL 粘贴以与您的 LLM 服务器通信。确保您已选择了正确的集合。然后点击导入到集合中。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/fe2b5bc13d6180ec136d6d7d593753fc.png将 cURL 导入集合中 – 作者截图。如果您的 API 端点是受保护的并且需要令牌您可以在新出现的窗口中进行配置。如果需要我们还可以编辑请求正文。让我们发送一个请求看看它是否按预期工作https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/25d0294e8c6d1c863c5e8c6a99b0f0fd.png从 Postman 调用 Llama 3.1 8b – 作者截图。工作正常。我们准备好开始对这个服务器进行第一次负载测试。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/615bb654075a59d6c42e3b79186a4935.png在 Postman 中创建负载测试运行器 – 作者截图。首先点击集合名称旁边的三个点然后点击“运行集合”如图所示。现在我们有几个负载配置文件可供选择。我经常使用固定负载配置文件和 Ramp-Up 配置文件。固定负载配置文件正如其名所示这种测试模拟了配置的虚拟用户数量并开始发送请求。在整个测试过程中保持相同的用户水平。Ramp-Up 配置文件这种技术在整个测试过程中逐渐增加虚拟用户数量并收集请求处理时间和错误率。对于我的测试我将使用带有 50 个初始用户的 Ramp Up 配置文件并将其增加到 100。就这样现在点击运行以进行负载测试。负载测试运行和结果 – 单个 A10 GPU。Postman 现在将开始使用虚拟用户发送请求。您可以监控这个过程。以下是结果可能看起来像什么。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a40ede488209d87ff44631dc49d66b5d.pngLlama3.1:8b 在 A10 GPU 上的负载测试结果 – 作者截图。这是我们基线基础设施一个 A10 GPU。截图表明Postman 在 3 分钟内发送了 318 个请求。也就是说我们的服务器每秒响应大约 1.71 个请求。然而请求的平均处理时间为 34 秒。这意味着用户将不得不等待半分钟才能从我们的服务器获得响应。此外2.2%的请求没有获得响应。图表还显示响应时间最初较短但随着服务器接收更多请求而恶化。根据我们的情况我们可能可以接受这种性能或尝试改进它。但让我们也尝试其他基础设施看看我们可以实现多少改进。使用更多 GPU 进行负载测试 – 2X A10 GPU现在我们切换到另一台服务器该服务器配备了两个相同的 A10 GPU。我们继续使用相同的负载测试任务。下面是结果的样子。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a32958fc73bcca119f36b550e610dbfd.pngLlama3.1:8b 在 2X A10 GPU 上的负载测试结果 – 作者截图结果显示我们的基线基础设施有所改善。响应时间从 34 秒降至 31 秒——微不足道。然而错误率飙升至 5.19%。从外观上看花费双倍的成本并不值得这种改进。使用更好的 GPU 进行负载测试 – L40SL40S 是 NVIDIA 最新一代 GPU 之一。尽管如此它的 VRAM 与 A10 大致相同。让我们看看它在类似情况下的表现。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/38028b33f9aa74b487dcf19164e786c4.pngLlama3.1:8b 在 L40S GPU 上的负载测试结果 – 作者截图结果是深刻的。平均处理时间已降至 26 秒——仍然太长。错误率也降至 1.11%。最大的缺点是 L40S 的成本比 2X A10 高得多。这可能对于关键任务推理需求是必要的。然而根据通用用途的结果我更倾向于坚持使用单个 A10。最有价值的 LLM 开发技能易于学习但实践成本高昂最后的想法负载测试有助于我们了解服务器在不同流量水平下的行为。这对于开发 LLM 应用程序至关重要。我们应该精确知道发送到服务器的每个请求的处理时间。进行负载测试最简单的方法是使用 Postman。它是免费的操作简单。当然它也有不足之处。在这篇文章中我使用了 Postman 进行负载测试并在三个基础设施选项之间做出选择。我得出结论对于我的任务来说单个 A10 GPU 比更多 GPU 或升级到最新一代 GPU 更好。在实际应用中我们必须在几个选择之间做出决定——基础设施和设计。对它们进行负载测试将给我们一个准确的情况即服务器在类似现实生活中的情况下会如何表现。感谢阅读朋友除了Medium我还在LinkedIn和X,上*