在 Elasticsearch 中探索基于 NVIDIA 的 GPU 加速向量搜索
作者:来自 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
相关文章:
在 Elasticsearch 中探索基于 NVIDIA 的 GPU 加速向量搜索
作者:来自 Elastic Chris Hegarty 及 Hemant Malik 由 NVIDIA cuVS 提供支持,此次合作旨在为开发者在 Elasticsearch 中的向量搜索提供 GPU 加速。 在 Elastic Engineering 组织内,我们一直致力于优化向量数据库的性能。我们的使命是让 Lucen…...
2025年图生视频模型技术全景解析
一、开源图生视频模型 阿里通义万象Wan2.1系列 I2V-14B-480P: 14B参数基础模型支持480P分辨率图生视频显存需求16GB以上 I2V-14B-720P: 高清增强版模型采用分帧渲染技术,输出分辨率达1280720 技术特性: 支持中文提示词自动解析内置…...
Docker build 会在本地产生巨大的文件
Docker build 会在本地产生巨大的文件, 比如 用 这个命令列出本地镜像 docker images 可见size都是很大的, 到docker目录下,看到ext4.vhdx的大小 80多G 那只能用这个命令把不用的镜像删掉了: (rmi后面是镜像id&a…...
使用LLaMA Factory微调导出模型,并用ollama运行,用open webui使用该模型
本篇记录学习使用llama factory微调模型的过程,使用ollama运行微调好的模型,使用open webui前端调用ollama的模型; 测试机信息: 系统:Ubuntu 24.04.2 LTS(桌面版) cpu:i9-14900KF …...
Git远程拉取和推送配置
Git进行远程代码拉取和推送时候提示配置user.name 和 user.email 背景:换新电脑后使用Git进行代码拉取和推送过程中,提示“Make sure you configure your “user.name” and “user.email” in git.”。这个配置针对git的正常使用仅需要配置一次…...
正则魔法:解码 return /^\d+$/.test(text) ? text : ‘0‘ 的秘密
🚀 正则魔法:解码 return /^\d$/.test(text) ? text : 0 的秘密 🌟 嘿,技术探险家们!👋 今天我们要破解一段看似简单的代码:return /^\d$/.test(text) ? text : 0。它藏在一个 Vue 前端组件中…...
[023-01-47].第47节:组件应用 - GetWay与 Sentinel 集成实现服务限流
SpringCloud学习大纲 一、需求说明: 实现网关cloudalibaba-sentinel-gateway9528模块保护cloudalibaba-provider-payment9001 二、编码实现: 2.1.建module: 新建模块,名称是:cloudalibaba-sentinel-gateway9528 2.2.改pom &l…...
【自用】NLP算法面经(5)
一、L1、L2正则化 正则化是机器学习中用于防止过拟合并提高模型泛化能力的技术。当模型过拟合时,它已经很好地学习了训练数据,甚至是训练数据中的噪声,所以可能无法在新的、未见过的数据上表现良好。 比如: 其中,x1和…...
AI视频生成产品体验分享(第2趴):Vidu、Hailuo、Runway、Pika谁更胜一筹?
hi,大家,继上次体验完可灵、即梦和pixverse,今天打算从产品经理的角度再研究下Vidu、Hailuo、Runway、Pika这几款产品!欢迎加入讨论! 一、产品简介 1. Vidu:国产自研的「一致性标杆」 📌官网…...
火绒终端安全管理系统V2.0——行为管理(软件禁用+违规外联)
火绒终端安全管理系统V2.0:行为管理策略分为软件禁用和违规外联两部分,能够管理终端用户软件的使用,以及终端用户违规连接外部网络的问题。 l 软件禁用 软件禁用策略可以选择软件名单的属性、添加软件名单以及设置发现终端使用禁用软件时的…...
台式机电脑组装---电脑机箱与主板接线
台式机电脑组装—电脑机箱与主板接线 1、机箱连接主板的跳线一般主要有USB 2.0、USB 3.0、前置音频接口(HD_AUDIO)以及POWER SW、RESET SW、POWER LED、HDD LED四个主板跳线,这些跳线分别的含义如下。 RESET SW:机箱重启按键;注:…...
【总结】常用API架构类型
引言 在现代软件开发中,API(应用程序编程接口)已经成为各类系统之间交互的核心。不同的 API 架构类型适用于不同的业务需求和技术场景,选择合适的架构可以提高系统的性能、可维护性和扩展性。本文将介绍几种常见的 API 架构类型,并分析它们的…...
ffmpeg库视频硬解码使用流程
FFmpeg 的硬解码(Hardware Decoding)通过调用 GPU 或专用硬件的编解码能力实现,能显著降低 CPU 占用率。 一、FFmpeg 支持的硬件解码类型 FFmpeg 原生支持多种硬件加速类型,具体由 AVHWDeviceType 定义,包括&…...
两个常用的用于读写和操作DXF文件C#库:netDxf 和 DXF.NET
netDxf 和 DXF.NET 是两个常用的C#库,用于读取、写入和操作DXF文件。以下是它们的详细介绍和用法示例。 1. netDxf 简介 netDxf 是一个开源的DXF文件读写库,支持AutoCAD DXF格式的读取和写入。它支持大多数DXF实体和对象,并且易于使用。 Gi…...
jmeter吞吐量控制器-Throughput Controller
jmeter吞吐量控制器-Throughput Controller 新增吞吐量控制器名词解释测试场景场景1:场景2:场景3场景4场景5场景6场景7场景8 测试结论 根据百分比执行不同的接口测试场景测试结果 新增吞吐量控制器 名词解释 Based on: Total Executions(总执行数)/Perc…...
windows 平台编译openssl
文章目录 准备环境安装perl安装NASM获取源码 源码编译配置编译 准备环境 安装perl 下载Perl 5.40.0.1 Portable zip strawberryperl 解压后设置系统环境变量 测试安装是否成功 perl --versionThis is perl 5, version 40, subversion 0 (v5.40.0) built for MSWin32-x64-m…...
【Linux】Makefile秘籍
> 🍃 本系列为Linux的内容,如果感兴趣,欢迎订阅🚩 > 🎊个人主页:【小编的个人主页】 >小编将在这里分享学习Linux的心路历程✨和知识分享🔍 >如果本篇文章有问题,还请多多包涵&a…...
Python散点图(Scatter Plot):数据探索的“第一张图表”
在数据可视化领域,散点图是一种强大而灵活的工具,它能够帮助我们直观地理解和探索数据集中变量之间的关系。本文将深入探讨散点图的核心原理、应用场景以及如何使用Python进行高效绘制。 后续几篇将介绍高级技巧、复杂应用场景。 Python散点图(Scatter Plot):高阶分析、散点…...
Spring AI Alibaba快速使用
AI 时代,Java 程序员也需要与时俱进,这两个框架必须掌握。 一个是 Spring AI一个是 Spring Alibaba AI。 Spring AI 是一个AI工程领域的应用程序框架,它的目标是将 Spring生态系统的设计原则应用于人工智能领域。 但是, Spring…...
Redis 跳表原理详解
一、引言 在 Redis 中,有序集合(Sorted Set)是一种非常重要的数据结构,它可以实现元素的有序存储和高效查找。而实现有序集合的底层数据结构之一就是跳表(Skip List)。跳表是一种随机化的数据结构ÿ…...
安全地自动重新启动 Windows 资源管理器Bat脚本
安全地自动重新启动 Windows 资源管理器脚本 可以直接运行的 Windows 批处理脚本,用于安全地自动重新启动 Windows 资源管理器。该脚本会在杀死资源管理器之前检查是否有其他进程正在使用资源管理器相关的文件。 Bat脚本 echo off title 资源管理器安全重启工具 co…...
【C++模板】
模板初阶 前言1.定义模板2.函数模板2.1定义2.2实例化函数模板2.3模板参数的匹配原则 3.类模板3.1类模板实例化 前言 模板是C中泛型编程的基础,一个模板就是一个创建类和函数的蓝图或公式。 1.定义模板 假定我们希望编写一个函数来比较两个值,并指出第…...
基于Debian搭建FTP服务器
操作系统 Debian-9.6.0-amd64,图形化安装 基础操作 1.软件安装管理 命令方式: 在线安装 sudo apt-get install vim/ifconfig 查看安装软件 dpkg -l 图形化桌面方式 : 通过“软件管理”工具管理 2.网络管理 /etc/network/interfaces 3.文本…...
如果我的项目是用ts写的,那么如何使用webpack的动态导入功能呢?
在 TypeScript 项目中使用 Webpack 的动态导入(Dynamic Imports)功能,需要结合 TypeScript 的语法和 Webpack 的配置。以下是具体实现方法和注意事项: 一、基础配置 1. 修改 tsconfig.json 确保 TypeScript 支持动态导入语法&am…...
构建高效的LinkedIn图像爬取工具
一. 项目背景与目标 LinkedIn上的用户头像数据可以用于多种场景,例如: 人才招聘:通过分析目标职位候选人的头像,了解其职业形象。市场调研:收集特定行业从业者的头像,用于分析职业群体的特征。学术研究&a…...
在windows下安装windows+Ubuntu16.04双系统(下)
这篇文章的内容主要来源于这篇文章,为正式安装windowsUbuntu16.04双系统部分。在正式安装前,若还没有进行前期准备工作(1.分区2.制作启动u盘),见《在windows下安装windowsUbuntu16.04双系统(上)》 二、正式安装Ubuntu …...
浅分析 PE3R 感知高效的三维重建
"近期,二维到三维感知技术的进步显著提升了对二维图像中三维场景的理解能力。然而,现有方法面临诸多关键挑战,包括跨场景泛化能力有限、感知精度欠佳以及重建速度缓慢。为克服这些局限,我们提出了感知高效三维重建框架&#…...
调和Django与Sql server2019的关系
数据库升级成sqlserver2019后,用户发现一些APP不能用了,检查发现是Django连接sqlserver的APP全部不能用了,页面打开都是500错误,进入Pycharm调试发现: 1.遇到错误1:django.db.backends.XXX错误 File "…...
【canvas】一键自动布局:如何让流程图节点自动找到最佳位置
一键自动布局:如何让流程图节点自动找到最佳位置 引言 在流程图、拓扑图和系统架构图设计中,节点布局往往是最令人头疼的问题。如果手动调整每个节点位置,不仅耗时费力,还难以保证美观性和一致性。本文将深入解析如何实现自动布…...
Flutter 学习之旅 之 flutter 使用 SQLite(sqflite) 实现简单的数据本地化 保存/获取/移除/判断是否存在 的简单封装
Flutter 学习之旅 之 flutter 使用 SQLite(sqflite) 实现简单的数据本地化 保存/获取/移除/判断是否存在 的简单封装 目录 Flutter 学习之旅 之 flutter 使用 SQLite(sqflite) 实现简单的数据本地化 保存/获取/移除/判断是否存在…...
[unity 组件] Content Size Fitter 横向填充不满解决办法
可以看到,当只有3个或者4个元素的时候,布局组件并没有将横向宽度占满来布局。之所以有此困惑的原因是我以为他的布局策略是,从左到右,从上至下,尽量占满空间,不够了再换行,其实不然。 5到6个元…...
Dify 项目开源大模型应用开发平台
Dify 是一款开源的大语言模型(LLM)应用开发平台,旨在简化生成式 AI 应用的创建、部署和持续优化流程。以下从多个维度对该项目进行详细介绍: 一、项目定义与核心功能 Dify 的核心定位是结合 后端即服务(BaaSÿ…...
使用 `pytest` 框架时,可以通过极限封装将 YAML 文件的读取、解析
在使用 pytest 框架时,可以通过极限封装将 YAML 文件的读取、解析和测试用例的通用逻辑封装成共享的方法或 fixture,从而减少重复代码。以下是详细的实现步骤和示例。 1. 封装 YAML 文件读取和解析 将 YAML 文件的读取和解析逻辑封装到一个工具函数中,供所有测试用例调用。…...
算法刷题记录——LeetCode篇(2) [第101~200题](持续更新)
(优先整理热门100及面试150,不定期持续更新,欢迎关注) 101. 对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入&am…...
ruoyi 小程序使用笔记
1.上传图片 页面 <uni-forms-item label"退休证明(退休证)" name"retire"><uni-file-picker ref"imageUploadRetire" :limit"1" :auto-upload"false" select"upload"/> </uni-forms-item>js …...
计算机网络——总结
01. 网络的发展及体系结构 网络演进历程 从1969年ARPANET的4个节点发展到如今覆盖全球的互联网,网络技术经历了电路交换到分组交换、有线连接到无线覆盖的革命性变革。5G时代的到来使得网络传输速度突破10Gbps,物联网设备数量突破百亿级别。 网络体系…...
Stable Diffusion lora训练(一)
一、不同维度的LoRA训练步数建议 2D风格训练 数据规模:建议20-50张高质量图片(分辨率≥10241024),覆盖多角度、多表情的平面风格。步数范围:总步数控制在1000-2000步,公式为 总步数 Repeat Image Epoch …...
再学:ERC20-Permit2、SafeERC20方法 详解ERC721,如何铸造一个NFT以及IPFS的作用
目录 1.Permit2 2.尽量使用Safe方法 3.ERC721 4. 铸造NFT 1.Permit2 针对没有permit的代币实现的线下签名方式 通过approve方法,让Permit2拿到无限次数的授权。拿到授权之后,Permit2会生成签名。 当用户需要转账的时候,Permit2会发送签…...
Docker 存储
目录挂载 在执行run时设置参数-v即可实现目录映射, 实现原理会在宿主机器创建一个空文件夹 # 挂载宿主机的 /data 目录到容器的 /app 目录 docker run -d -v /data:/app --name my-app my-image # 挂载 docker 内的 /usr/share/nginx/html 目录到本地机的 /app/nghtml docker…...
详细介绍VUE,带你了解VUE!!!
Vue.js 是一个渐进式的 JavaScript 框架,用于构建用户界面。它的核心库专注于视图层,易于与其它库或现有项目进行集成,同时也可以与现代工具链和支持库结合使用,成为一个完整的开发框架。 以下是关于 Vue.js 的详细资料ÿ…...
C++语法之命名空间二
A.h头文件中代码: namespace a {void 输出(); }; A.cpp源文件中代码: #include <iostream> #include "A.h" void a::输出() {std::cout << "A.h里的输出函数" << std::endl; } B.h头文件中代码: …...
【STM32】I²CC通信外设硬件I²CC读写MPU6050(学习笔记)
相关文章笔记: 【STM32】I2C通信协议&MPU6050芯片-学习笔记-CSDN博客 【江协科技STM32】软件I2C协议层读写MPU6050驱动层-CSDN博客 IC通信外设 IC外设简介 STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答…...
Android Room 框架公共模块源码深度剖析(四)
一、引言 在 Android 开发中,数据持久化是一个常见的需求。Android Room 框架作为 Android Jetpack 组件的一部分,为开发者提供了一个抽象层,使得在 SQLite 数据库上进行数据操作变得更加简单和高效。Room 框架包含多个模块,其中…...
NumPy系列 - 创建矩阵
目录 前传直接创建数组就只是创建数组1. np.array()2. np.arange()3. np.ones()4. numpy.ones_like()5. np.zeros()6. numpy.zeros_like() 定义数据类型 参考资料 前传 由于,某人在上智能相关课程的时候,总想着一大堆的事情,统计股市涨跌&am…...
能“嘎嘎提升”提升用户居住体验的智能家居物联网框架推荐!
智能家居在日常生活中给我们的带来了更多的便利,更让有些用户切实地体会到了科技的魅力,对于想要打造属于自己的智能家居氛围感的用户们,以下是一些能够帮助提升居住体验的智能家居物联网框架及应用: 1. 涂鸦智能(Tuy…...
python-leetcode 60.分割回文串
题目: 给定一个字符串S,请将S分割成一些子串,使每个子串都是回文串,返回S所有可能的分割方案 方法一:回溯深度优先搜索 1. 主要思想 使用 深度优先搜索(DFS) 遍历 s 的所有可能划分方式。使用 回溯&…...
Android Jetpack Compose介绍
Android Jetpack Compose Android Jetpack Compose 是 Google 推出的现代 UI 工具包,用于以声明式的方式构建 Android 应用的 UI。它摒弃了传统的 XML 布局方式,完全基于 Kotlin 编写,提供了更简洁、更强大的 UI 开发体验。以下是 Compose 的…...
文档搜索引擎项目测试
目录 设计测试用例 功能测试 文档搜索功能 具体的逻辑 文档显示搜索结果功能 自动化测试 功能类介绍 最终测试套件的测试结果 性能测试 查看聚合报告 每秒处理事务数/吞吐量(TPS) 响应时间 生成测试报告 界面测试 初始页面 搜索页面 总结 后续改进: 设计测试…...
Vue3项目技术点记录
vue3项目技术点笔记 1 环境变量 - 不同环境用不同的配置 环境变量命名:.env.produciton .env.development Vite.config.ts 配置 envDir:‘’ 链接: VUE3+Vite 环境变量配置 2 axios的封装 http请求拦截,响应拦截。 src下建立公共文件夹Utils下建立request.ts import axios…...
一和零 (leetcode 474
leetcode系列 文章目录 一、核心操作二、外层配合操作三、核心模式代码总结 本题是一个01背包问题,只是背包是一个二维数组的背包,分别为0的个数不能超过m,1的个数不能超过n,而物品就是题目中的字符串,其容量为0和1的…...