在 Cloudflare,我们最近一直在思考 AI 推理。它支持聊天机器人、欺诈检测,甚至帮助自动驾驶汽车做出决策。但问题是:如果您使用大型云服务提供商,您可能最终需要从遥远的数据中心租用昂贵的 GPU。这不符合我们的模式——Cloudflare 的网络遍布全球,全球 95% 的互联网用户在我们服务器的 50 毫秒范围内。我们需要一种能够在边缘计算上比其他任何人都更快更高效地运行 AI 推理的方法。

现有工具的问题

几年前,我们开始使用 vLLM,这是一款适用于大多数情况的开源推理引擎。它在配备专用 GPU 的大型数据中心运行良好,能够处理特定模型。但随着 AI 模型规模不断扩大(例如 Llama 4 和 GPT 模型),以及我们的工作负载变得更加动态化,vLLM 也出现了一些局限性。

例如,vLLM 是用 Python 编写的,这增加了额外的步骤并降低了速度。我们还需要在同一 GPU 上运行多个模型,而无需依赖多实例 GPU (MIG) 等昂贵的工具。此外,安全性对我们至关重要——我们无法在边缘节点上运行不受信任的 Python 代码,因此我们不得不将 vLLM 封装在沙盒中,这又增加了额外的开销。

构建 Infire:我们的定制解决方案

因此,我们构建了 Infire——一个用 Rust 编写的全新推理引擎,旨在完美适配我们的边缘网络。Rust 使我们能够控制底层细节,这对于速度和效率至关重要。让我们来详细了解一下它的工作原理。

如何快速启动

当模型首次在边缘服务器上运行时,我们需要快速加载它。我们从 R2 存储中获取权重,缓存它们,并使用异步内存传输等技术将模型迁移到 GPU 上。例如,加载 Llama 3.1 8B(约 16GB 数据)只需不到 4 秒。我们还会在加载模型的同时编译 GPU 内核,以便在需要时随时可用。

使用智能批处理器处理流量

推理最重要的部分是确保 GPU 得到高效利用。Infire 使用 批处理器 将多个请求(例如聊天提示)分组并并行处理。这样,我们就能充分利用 GPU 强大的 Tensor Core 和内存带宽,这比一次运行一个请求要高效得多。

  • 预填充:当新的提示符出现时,我们会一次性处理所有标记符(因为它们都是预先已知的)。
  • 连续批处理:我们持续向批处理中填充新的提示符,直到它们填满为止,这样 GPU 就不会闲置。
  • 分页键值缓存:我们不再为每个请求预先分配大块内存,而是将缓存拆分成更小的“页面”。这使我们能够处理更多请求,而不会耗尽内存,即使是长时间的对话也是如此。

优化的 GPU 内核

由于我们掌控硬件(我们使用 Nvidia Hopper GPU),因此我们可以根据其优势编写自定义内核。例如,我们使用 CUDA 图形对内核启动进行分组,从而降低开销。我们还使用 cuBLASlt 进行快速矩阵乘法,并正在开发 Flash Attention 3 来加速注意力机制——这对于处理长对话的模型至关重要。

成果:更快、更便宜、更环保

我们在实际条件下测试了 Infire 和 vLLM。以下是我们的发现:

指标 Infire vLLM(裸机) vLLM(gvisor) vLLM(gvisor + CPU 限制)
请求数/秒 40.9 38.4 37.1 22.0
令牌数/秒 17.2k 16.2k 15.6k 9.3k
CPU 负载 25% 140% 250% 100%

Infire 每秒处理更多请求和令牌,并且 CPU 使用率显著降低。在生产环境中,这意味着所需的 GPU 更少,能源成本更低,并为其他服务提供更多资源。GPU 利用率提升至 80%,这是一个巨大的进步。

下一步是什么?

这仅仅是个开始。我们正在努力为更大规模的模型提供更好的多 GPU 支持、量化(运行速度更快的小型模型)以及真正的多租户功能,以便开发者可以安全地共享 GPU。我们的目标是让 Cloudflare 成为构建 AI 应用的最佳平台——快速、安全、高效。

归根结底,Infire 致力于解决一个简单的问题:如何让 AI 推理更贴近用户,让用户真正理解它。通过构建与我们网络量身定制的解决方案,我们不仅简化了自身的工作,还为开发者提供了构建下一代 AI 产品所需的工具。

阅后请思考

  • Infire相比vLLM的核心优化点是什么?
  • 如何实现Infire的全球边缘网络部署?
  • 低级别CUDA内核对性能提升有多大?
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐