作者:来自 Elastic Chris Hegarty 及 Hemant Malik
由 NVIDIA cuVS 提供支持,此次合作旨在为开发者在 Elasticsearch 中的向量搜索提供 GPU 加速。
在 Elastic Engineering 组织内,我们一直致力于优化向量数据库的性能。我们的使命是让 Lucene 和 Elasticsearch 成为最优秀的向量数据库。通过硬件加速的 CPU SIMD 指令、引入新的向量数据压缩创新(Better Binary Quantization,简称 BBQ),以及进一步优化 BBQ 的算法以带来更大收益,同时加速 Filtered HNSW —— 总之,我们正在为开发者构建一个更快、更优、更高效的向量数据库,以帮助他们解决 RAG 相关问题!
在追求极致效率的过程中,我们也在探索这些有趣的计算芯片——NVIDIA GPU!(说真的,你不会没听说过吧?)。
当我们专注于性能优化时,需要解决多个问题:如何索引指数级增长的数据、如何高效检索数据、以及如何在涉及机器学习模型时优化整个流程。有了 GPU,你应该能够充分利用所有可能的优势。
在本文中,我们将深入探讨与 NVIDIA 向量搜索团队的合作,探索在 Elasticsearch 中实现 GPU 加速的向量搜索。这项工作为开发者在实际应用中结合 GPU 和 CPU 运行 Elasticsearch 提供了新的可能性。令人振奋的时代已经到来!
Elasticsearch:你好,GPU!
我们很高兴与大家分享,Elasticsearch 工程团队正在帮助构建开源 cuVS Java API,为开发者提供向量搜索算法的绑定接口。这项工作利用了我们在 Panama FFI 方面的经验。Elasticsearch 和 Apache Lucene 通过 NVIDIA cuVS API 在索引过程中构建图结构。好吧,我们说得有点快了,让我们稍微回顾一下。
NVIDIA cuVS 是一个开源 C++ 库,是此次合作的核心。它旨在通过 GPU 加速向量搜索,提高吞吐量、降低延迟,并加快索引构建时间。但 Elasticsearch 和 Apache Lucene 是用 Java 编写的,这如何实现呢?
这就是 lucene-cuvs 以及 Elastic-NVIDIA-SearchScale 合作的意义所在,我们正在将 GPU 加速的向量搜索引入 Lucene 生态系统,并探索其在 Elasticsearch 中的应用。在最近发布的 NVIDIA cuVS 25.02 版本中,我们新增了 cuVS 的 Java API。该 API 目前仍处于实验阶段,并将持续优化,但已经可供使用。也许你会问:Java 调用本地函数不是很慢吗?现在不再是问题!我们使用了新的 Panama FFI(外部函数接口)来绑定 cuVS,它能使 Java 到本地代码的调用开销降到最低。
我们已经在 Elasticsearch 和 Lucene 中使用 Panama FFI 一段时间了,它真的很棒!但是……总有个 “但是”,对吧?FFI 在不同 Java 版本上的可用性存在一定挑战。为了解决这个问题,我们将 cuVS API 编译到 Java 21,并将实现封装在一个面向 Java 22 的多版本 JAR 包中。这使得 cuVS Java 可以直接用于 Lucene 和 Elasticsearch。
好了,现在我们已经有了 cuVS Java API,接下来还需要什么?
两个算法的故事
Elasticsearch 目前支持 HNSW 算法来实现可扩展的近似 KNN 搜索。然而,为了充分利用 GPU 的性能,我们采用了另一种专为 GPU 高度并行计算设计的算法 —— CAGRA(CUDA ANN GRAph)。
在探讨如何为 CAGRA 添加支持之前,先来看一下 Elasticsearch 和 Lucene 如何通过 “编解码格式”(codec format)访问索引数据。它包括以下部分:
- 磁盘上的数据表示,
- 读写数据的接口,
- 处理 Lucene 段式架构的机制。
我们正在实现一种新的 KNN(k 近邻)向量格式,该格式在内部使用 cuVS Java API 在 GPU 上进行索引和搜索。然后,我们将此编解码类型与 Elasticsearch 的映射机制集成,使其成为索引中的一种字段类型。因此,无论底层索引使用的是 CAGRA 还是 HNSW 图,你的现有 KNN 查询都能继续正常工作。当然,这里省略了许多细节,我们计划在后续博客中详细介绍。以下是 GPU 加速 Elasticsearch 的高层架构图。
这种新的编解码格式默认使用 CAGRA,但同时支持将 CAGRA 图转换为 HNSW 图,以便在 CPU 上进行搜索。
索引与搜索:做出 “核心” 决策
在 Elasticsearch Serverless 的 stateless 架构下,索引与搜索被明确分离,各自承担独立的职责,使我们能够选择最优的硬件配置来满足不同需求。
我们预计用户会考虑两种主要的部署策略:
- 在 GPU 上索引和搜索:在索引过程中构建 CAGRA 图,并在搜索时直接使用它 —— 适用于需要极低延迟搜索的场景。
- 在 GPU 上索引,在 CPU 上搜索:在索引过程中构建 CAGRA 图,并将其转换为 HNSW 图。转换后的 HNSW 图存储在索引中,供后续 CPU 搜索使用。
这种灵活性支持不同的部署模式,在成本与性能之间提供平衡。例如,索引服务可以利用 GPU 高效地构建和合并图结构,而搜索服务则可在低功耗 CPU 上运行,以降低成本。
计划如下,Stan!
我们期待通过优化部署策略,为用户带来性能提升和更大的灵活性,并提供多种调节方式,以在成本和性能之间取得最佳平衡。以下是 NVIDIA GTC 2025 会议的相关内容,在会上,我们详细介绍了这一工作。
我们要感谢 NVIDIA 和 SearchScale 工程团队的出色合作!在即将发布的博客中,我们将深入探讨实现细节和性能分析。请保持好奇心 🎩!
Elasticsearch 还原生集成了行业领先的 生成式 AI 工具和提供商。欢迎查看我们的网络研讨会,了解如何超越 RAG 基础,或如何使用 Elastic Vector Database 构建生产级应用。
要为你的业务场景打造最佳搜索解决方案,现在就开始 免费云试用 或在本地运行 Elastic 吧!
原文:Exploring GPU-accelerated Vector Search in Elasticsearch with NVIDIA - Elasticsearch Labs