使用 NVIDIA cuVS 将 Elasticsearch 中的向量索引速度提升高达 12 倍:GPU 加速(第二章)

了解 Elasticsearch 如何借助 GPU 加速的向量索引和 NVIDIA cuVS,实现近 12 倍的索引吞吐量提升。

从向量搜索到强大的 REST API,Elasticsearch 为开发人员提供了最全面的搜索工具包。探索 GitHub 上的示例笔记本,尝试新事物。您也可以立即开始免费试用在本地运行 Elasticsearch

今年早些时候,Elastic 宣布与 NVIDIA 合作,为 Elasticsearch 引入 GPU 加速功能,并与 NVIDIA cuVS 集成 — 相关详情可参阅 NVIDIA GTC 大会的相关会议以及多篇博文。本文主要介绍我们与 NVIDIA 向量搜索团队在联合工程方面的最新进展。

回顾

先简单回顾一下最新动态。Elasticsearch 现已确立其作为强大向量数据库的地位,在大规模相似性搜索方面提供了丰富的功能和强劲的性能。凭借标量量化、Better Binary Quantization (BBQ)、SIMD 向量运算以及 DiskBBQ 等在磁盘利用方面更高效的算法,Elasticsearch 已经为管理向量工作负载提供了高效而灵活的多种选项。

通过将 NVIDIA cuVS 集成为可调用的向量搜索模块,我们希望大幅提升向量索引的性能和效率,从而更好地支撑大规模向量工作负载。

挑战

构建高性能向量数据库的最大挑战之一,就是构建向量索引,即 HNSW 图。随着每个向量都要与大量其他向量进行比对,索引构建很快就会被数以百万乃至数十亿次的算术运算所主导。此外,压缩、合并等索引生命周期操作还会进一步增加索引的整体计算开销。随着数据量和相关向量嵌入呈指数级增长,专为大规模并行和高吞吐量数值运算而设计的加速计算 GPU 非常适合处理这些工作负载。

进入 Elasticsearch-GPU 插件

NVIDIA cuVS是一个开源的 CUDA-X 库,用于 GPU 加速的向量搜索和数据集群,能够为 AI 和推荐工作负载快速构建索引和嵌入检索。

Elasticsearch 通过 cuvs-java 使用 cuVS,这是一个由社区开发并由 NVIDIA 维护的开源库。cuvs-java 库十分轻量,基于 cuVS C API 构建,并借助 Panama 外部函数接口,以符合 Java 习惯用法的方式暴露 cuVS 功能,同时兼具现代性和高性能。

cuvs-java 库被集成到一个新的 Elasticsearch 插件中;因此,GPU 上的向量索引可在同一 Elasticsearch 节点和同一进程内完成,无需部署任何外部组件或额外硬件。在索引构建过程中,如果已安装 cuVS 库且存在已正确配置的 GPU,Elasticsearch 会利用 GPU 加速向量索引过程。向量会被传递给 GPU,由 GPU 构建 CAGRA 图。随后将该图转换为 HNSW 格式,使其能够立即在 CPU 上用于向量搜索。构建完成的图,其最终格式与在 CPU 上构建的图完全一致;这使得在底层硬件支持的情况下,Elasticsearch 可以利用 GPU 实现高吞吐量的向量索引,同时释放 CPU 算力,用于并发搜索、数据处理等其他任务。

索引构建加速

作为将 GPU 加速集成到 Elasticsearch 的一部分,对 cuvs-java 进行了多项增强,重点是高效的数据输入/输出和函数调用。一项关键增强是使用 cuVSMatrix 对向量进行透明建模,无论它们位于 Java 堆中、堆外还是 GPU 内存中。这使数据可以在内存与 GPU 之间高效传输,避免对可能多达数十亿个向量进行不必要的复制。

由于这种底层的零拷贝抽象,数据传输到 GPU 内存以及从中检索图时都可以直接完成。在索引过程中,向量首先缓存在 Java 堆内存中,然后发送到 GPU,以构建 CAGRA 图。随后,从 GPU 中取回该图,将其转换为 HNSW 格式,并持久化到磁盘。

在合并时,向量已经存储在磁盘上,完全绕过了 Java 堆。索引文件采用内存映射,数据直接传输到 GPU 内存中。该设计还能轻松适应不同的位宽,如 float32 或 int8,并自然扩展到其他量化方案。

话不多说,那它的实际表现如何呢?

我们的初步基准测试结果非常令人鼓舞。我们在 AWS g6.4xlarge 实例上运行了基准测试,该实例具有本地连接的 NVMe 存储。我们将单个 Elasticsearch 节点配置为使用默认的最佳索引线程数(8 个,每个物理核心一个),并关闭合并限速功能(在使用快速 NVMe 磁盘时,这一功能的适用性较低)。

对于数据集,我们使用了 OpenAI Rally 向量赛道中的 260 万个、每个具有 1,536 维的向量,将其编码为 base64 字符串,并以 float32 hnsw 结构进行索引。在所有场景中,构建的图都能达到最高约 95% 的召回率。以下是我们的发现:

  • 索引吞吐量:通过在内存缓冲区刷新期间将图构建移交给 GPU 处理,我们将吞吐量提高了约 12 倍。
  • 强制合并:索引完成后,GPU 继续加速分段合并,将强制合并阶段加快约 7 倍。
  • CPU 使用率:将图构建任务分流到 GPU,可显著降低 CPU 的平均和峰值利用率。以下图表展示了索引和合并期间的 CPU 使用情况,凸显了在 GPU 上运行这些操作时 CPU 使用率的显著降低。GPU 索引期间降低 CPU 使用率,可释放 CPU 周期并重新分配,从而提升搜索性能。
  • 召回率:在 CPU 与 GPU 的运行结果中,准确性几乎一致,而 GPU 所构建的图在召回率方面略胜一筹。

再从价格这个维度来进行比较

先前的对比刻意保持硬件配置完全相同,唯一的区别在于索引过程中是否使用了 GPU。这有助于了解原始计算效果,但我们也可以从成本角度进行比较。在成本大致相同的前提下,我们可以配置约两倍数量的可比 vCPU 和内存。也就是说,采用 32 个 vCPU(AMD EPYC)和 64GB 内存,同时将索引线程数加倍至 16 个。

正如您所预期的那样,更强大的 CPU 实例与上述部分的基准测试相比,性能确实有所提高。然而,将这一性能更强的 CPU 实例与最初的 GPU 加速结果进行对比后可以看到,GPU 依然带来显著性能提升:索引吞吐量提高约 5 倍,强制合并阶段加速约 6 倍,同时构建的图其召回率最高可达 95%

结论

在端到端场景中,使用 NVIDIA cuVS 进行的 GPU 加速使索引吞吐量提高了近 12 倍,将强制合并延迟降低到原来的 1/7,同时显著降低了 CPU 利用率。这表明向量索引和合并工作负载从 GPU 加速中受益显著。在成本调整后的对比中,GPU 加速依然带来显著的性能提升:索引吞吐量约提升 5 倍,强制合并操作的速度提升约 6 倍。

GPU 加速的向量索引目前计划在 Elasticsearch 9.3 的技术预览版中推出,该版本计划于 2026 年初发布。

敬请关注更多内容。

相关内容

准备好打造最先进的搜索体验了吗?

足够先进的搜索不是一个人的努力就能实现的。Elasticsearch 由数据科学家、ML 操作员、工程师以及更多和您一样对搜索充满热情的人提供支持。让我们联系起来,共同打造神奇的搜索体验,让您获得想要的结果。

亲自试用