作者:來自 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