Lucene 和 Elasticsearch 中更好的二进制量化 (BBQ)

作者:来自 Elastic Benjamin Trent

Lucene 和 Elasticsearch 中更好的二进制量化 (BBQ)。

嵌入模型输出 float32 向量,通常对于高效处理和实际应用来说太大。Elasticsearch 支持 int8 标量量化,以减小向量大小,同时保持性能。其他方法会降低检索质量,并且不适用于实际使用。在 Elasticsearch 8.16 和 Lucene 中,我们引入了更好的二进制量化 (BBQ),这是一种新方法,从新加坡南洋理工大学的研究人员提出的一项最新技术 “RaBitQ” 中汲取的见解中发展而来。

BBQ 是 Lucene 和 Elasticsearch 在量化方面的一次飞跃,将 float32 维度缩减为位,在保持高排名质量的同时减少约 95% 的内存。BBQ 在索引速度(量化时间减少 20-30 倍)、查询速度(查询速度提高 2-5 倍)方面优于乘积量化 (Product Quantization - PQ) 等传统方法,并且不会额外损失准确性。

在本博客中,我们将探索 Lucene 和 Elasticsearch 中的 BBQ,重点关注召回率、高效的按位运算和优化的存储,以实现快速、准确的向量搜索。

更好的二进制量化中的 “更好” 是什么意思?

在 Elasticsearch 8.16 和 Lucene 中,我们引入了所谓的 “Better Binary Quantization - 更好的二进制量化”。简单的二进制量化具有极高的损耗,要实现足够的召回率,需要收集 10 倍或 100 倍的额外邻居来重新排序。这根本行不通。

更好的二进制量化来了!以下是更好的二进制量化和简单的二进制量化之间的一些显著差异:

  • 所有向量都围绕质心(centroid)进行归一化。这解锁了量化中的一些良好属性。
  • 存储了多个错误校正值。其中一些校正用于质心归一化,一些用于量化。
  • 非对称量化。在这里,虽然向量本身存储为单个位值(bit value),但查询仅量化为 int4。这显著提高了搜索质量,而无需额外的存储成本。
  • 用于快速搜索的按位操作。查询向量以允许高效按位操作的方式进行量化和转换。

使用更好的二进制量化进行索引

索引很简单。请记住,Lucene 会构建单独的只读段。随着向量进入新的段,质心(centroid)会逐渐计算。然后,一旦段被刷新,每个向量都会围绕质心进行规范化和量化。

这是一个小例子:

当量化到位级时,8 个浮点值会转换为单个 8 位字节。

然后,将每个位打包成一个字节,并与所选向量相似性所需的任何错误校正值一起存储在段中。

对于每个向量,存储的字节是 dims/8 字节数,然后是任何错误校正值;欧几里得的 2 个浮点值,或点积的 3 个浮点值。

让我们快速讨论一下我们如何处理段合并

当段合并时,我们可以利用先前计算的质心。只需对质心进行加权平均,然后重新量化新质心周围的向量。

棘手的是确保 HNSW 图质量并允许使用量化向量构建图。如果你仍然需要所有内存来构建索引,量化有什么意义?!

除了将向量附加到现有最大的 HNSW 图之外,我们还需要确保向量评分可以利用非对称量化。HNSW 有多个评分步骤:一个用于初始邻居集合,另一个用于确保只有不同的邻居连接。为了有效地使用非对称量化,我们创建了一个临时文件,其中包含所有量化为 4 位查询向量的向量。

因此,当将向量添加到图中时,我们首先:

  • 获取存储在临时文件中的已量化查询向量。
  • 使用已经存在的位向量正常搜索图。
  • 一旦我们有了邻居,就可以使用先前的 int4 量化值进行多样性和反向链接评分。

合并完成后,临时文件将被删除,仅留下位量化向量。

临时文件将每个查询向量存储为一个 int4 字节数组,该数组采用 dims/2 字节数、一些浮点误差校正值(欧几里得为 3,点积为 4)以及向量维数和的短值。

非对称量化,有趣的部分

我提到了非对称量化以及我们如何布局查询以构建图形。但是,向量实际上是如何转换的?它是如何工作的?

“Asymmetric - 非对称” 部分很简单。我们将查询向量量化为更高的保真度。因此,doc 值是位量化的,查询向量是 int4 量化的。更有趣的是这些量化向量如何转换为快速查询。

以上面的示例向量为例,我们可以将其量化为以质心为中心的 int4。

有了量化向量,乐趣就开始了。因此,我们可以将向量比较转换为按位点积,位移位。

最好只是直观地了解正在发生的事情:

这里,每个 int4 量化值的相对位置位都移位到单个字节。请注意,所有第一位都是先打包在一起的,然后是第二位,依此类推。请注意上面的各个颜色组成的信的字节。如果你想搞明白,上面的最终字节值是从右向左来进行组织的,比如从右向左,绿色的值依次为 1100 0111

但这实际上如何转化为点积?请记住,点积是组件积的总和。对于上面的例子,让我们完整地写出来:

我们可以看到,它只是查询组件的总和,其中存储的向量位为 1。由于所有数字都只是位,因此当使用二进制扩展表示时,我们可以移动一些位置以利用按位运算。

在 & 之后将被翻转的位将是构成点积的数字的各个位。在这种情况下,15 和 10。

记住我们最初存储的向量:

现在我们可以计算位数,移位并求和。我们可以看到剩下的所有位都是 15 和 10 的位置位。

与直接对维度求和的答案相同。

以下是示例,但简化了 Java 代码:

byte[] bits = new byte[]{6};
byte[] queryBits = new byte[]{202, 14, 26, 199};
for (int i = 0; i < 4; i++) {sum += Integer.bitCount(bits[0] & queryBits[i] & 0xFF) << i;
}

好吧,给我看看这些数字

我们已经在 Lucene 和 Elasticsearch 中直接对 BBQ 进行了广泛的测试。以下是一些结果:

Lucene 基准测试

这里的基准测试是在三个数据集上进行的:E5-small、CohereV3 和 CohereV2。这里,每个元素表示召回率@100,过采样率为 [1, 1.5, 2, 3, 4, 5]。

E5-small

这是从 quora 数据集构建的 E5-small 的 500k 个向量。

quantizationIndex TimeForce Merge timeMem Required
bbq161.8442.3757.6MB
4 bit215.1659.98123.2MB
7 bit267.1389.99219.6MB
raw249.2677.81793.5MB
令人惊讶的是,我们仅用一位精度就获得了 74% 的召回率。由于维度较少,BBQ 距离计算并不比我们优化的 int4 快多少。

CohereV3

这是 1M 1024 维向量,使用 CohereV3 模型。

quantizationIndex TimeForce Merge timeMem Required
bbq338.97342.61208MB
4 bit398.71480.78578MB
7 bit437.63744.121094MB
raw408.75798.114162MB
这里,1 位量化和 HNSW 仅通过 3 倍过采样就能获得 90% 以上的召回率。

CohereV2

这是 1M 768 维向量,使用 CohereV2 模型和最大内积相似度。

quantizationIndex TimeForce Merge timeMem Required
bbq395.18411.67175.9MB
4 bit463.43573.63439.7MB
7 bit500.59820.53833.9MB
raw493.44792.043132.8MB
看到 BBQ 和 int4 与此基准同步的程度真的很有趣。BBQ 只需 3 倍过采样就能在内积相似度下获得如此高的召回率,这真是太棒了。

更大规模 Elasticsearch 基准测试

正如我们在更大规模向量搜索博客中提到的,我们有一个用于更大规模向量搜索基准测试的 rally track。

该数据集有 138M 个 1024 维浮点向量。如果没有任何量化,使用 HNSW 需要大约 535 GB 的内存。如果使用更好的二进制量化,估计会下降到大约 19GB。

对于此测试,我们在 Elastic 云中使用了一个 64GB 的节点,具有以下 track 参数:

{"mapping_type": "vectors-only","vector_index_type": "bbq_hnsw","number_of_shards": 2,"initial_indexing_bulk_indexing_clients": 12,"standalone_search_clients": 8,"aggressive_merge_policy": true,"search_ops": [[10, 20, 0], [10, 20, 20], [10, 50, 0], [10, 50, 20], [10, 50, 50], [10, 100, 0], [10, 100, 20], [10, 100, 50], [10, 100, 100], [10, 200, 0], [10, 200, 20], [10, 200, 50], [10, 200, 100], [10, 200, 200], [10, 500, 0], [10, 500, 20], [10, 500, 50],[10, 500, 100],[10, 500, 200],[10, 500, 500],[10, 1000, 0], [10, 1000, 20], [10, 1000, 50], [10, 1000, 100], [10, 1000, 200], [10, 1000, 500], [10, 1000, 1000]]
}

重要提示:如果你想要复制,下载所有数据将花费大量时间,并且需要超过 4TB 的磁盘空间。需要所有额外磁盘空间的原因是此数据集还包含文本字段,并且你需要磁盘空间来存储压缩文件及其膨胀大小。

参数如下:

  • k 是要搜索的邻居数
  • num_candidates 是 HNSW 中每个分片用于探索的候选数
  • rerank 是要重新排序的候选数,因此我们将收集每个分片的多个值,收集总重新排序大小,然后使用原始 float32 向量对前 k 个值重新评分。

对于索引时间,大约需要 12 小时。这里不显示所有结果,而是显示三个有趣的结果:

k-num_candidates-rerankAvg Nodes Visited% Of Best NDGCRecallSingle Query LatencyMulti-Client QPS
knn-recall-10-100-5036,079.80190%70%18ms451.596
knn-recall-10-2015,915.21178%45%9ms1,134.649
knn-recall-10-1000-200115,598.11797%90%42.534ms167.806

这表明了平衡召回率、过采样、重新排序和延迟的重要性。显然,每个都需要针对你的特定用例进行调整,但考虑到这在以前是不可能的,而现在我们在单个节点中拥有 138M 个向量,这非常酷。

结论

感谢你花一点时间阅读有关 Better Binary Quantization 的文章。我来自阿拉巴马州,现在住在南卡罗来纳州,BBQ 在我的生活中已经占据了特殊的地位。现在,我有更多的理由爱上 BBQ!

我们将在 8.16 中将其作为技术预览版发布,或者现在以 serverless 器形式发布。要使用它,只需在 Elasticsearch 中将你的 density_vector.index_type 设置为 bbq_hnsw 或 bbq_flat。

准备好自己尝试一下了吗?开始免费试用。
Elasticsearch 和 Lucene 提供强大的矢量数据库和搜索功能。深入了解我们的示例笔记本以了解更多信息。

原文:Better Binary Quantization (BBQ) in Lucene and Elasticsearch - Search Labs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/885841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Odoo:免费开源的钢铁冶金行业ERP管理系统

文 / 开源智造 Odoo亚太金牌服务 简介 Odoo免费开源ERP集成计质量设备大宗原料采购&#xff0c;备件设材全生命周期&#xff0c;多业务模式货控销售&#xff0c;全要素追溯单品&#xff0c;无人值守计量物流&#xff0c;大宗贸易交易和精细化成本管理等方案&#xff1b;覆盖…

Linux设置socks代理

公司里绝大多数主机已经禁止外网访问&#xff0c;仅保留一台主机设置socks作为代理服务器。如下为对socks这一概念的学习整理 什么是socks 是一种OSI模型下会话层的协议&#xff0c;位于表示层与传输层之间&#xff0c;作用是&#xff1a; exchanges network packets between…

MySQL数据库:SQL语言入门 (学习笔记)

SQL&#xff08;Structured Query Language&#xff09;是结构化查询语言的简称&#xff0c;它是一种数据库查询和程序设计语言&#xff0c;同时也是目前使用最广泛的关系型数据库操作语言。&#xff08;95%适用于所有关系型数据库&#xff09; 【 SQL是关系型数据库通用的操作…

视频会议接入GB28181视频指挥调度,语音对讲方案

传统的视频会议指挥调度系统目前主流的互联网会议大部分都是私有协议&#xff0c;功能都很独立。目前主流的视频监控国标都最GB平台&#xff0c;新的需求要求融合平台要接入监控等设备&#xff0c;并能实现观看监控接入会议&#xff0c;实时语音设备指挥现场工作人员办公实施。…

萤石设备视频接入平台EasyCVR海康私有化视频平台监控硬盘和普通硬盘有何区别?

在现代安防监控领域&#xff0c;对于数据存储和视频处理的需求日益增长&#xff0c;特别是在需要长时间、高稳定性监控的环境中&#xff0c;选择合适的存储设备和监控系统显得尤为重要。本文将深入探讨监控硬盘与普通硬盘的区别&#xff0c;并详细介绍海康私有化视频平台EasyCV…

一学就废|Python基础碎片,字符串编码

Unicode 万国码 在 Python 3 中&#xff0c;字符串由 Unicode 表示&#xff0c;而不是字节。ASCII 码是定义字符数字代码的最著名的标准。数字值最初只定义 128 个字符&#xff0c;因此 ASCII 只包含控制代码、数字、小写字母、大写字母等。然而&#xff0c;我们不足以表示世界…

npm list @types/node 命令用于列出当前项目中 @types/node 包及其依赖关系

文章目录 作用示例常用选项示例命令注意事项 1、实战举例**解决方法**1. **锁定唯一的 types/node 版本**2. **清理依赖并重新安装**3. **设置 tsconfig.json 的 types**4. **验证 Promise 类型支持** **总结** npm list types/node 命令用于列出当前项目中 types/node 包及其…

Qt--命令行终端程序开发

提示&#xff1a;本文为学习记录&#xff0c;若有错误&#xff0c;请联系作者&#xff0c;谦虚受教。 文章目录 前言一、头文件二、cpp文件三、使用流程如图所示 总结 前言 Constant dropping wears the stone. 一、头文件 #ifndef TERMINALWIDGET_H #define TERMINALWIDGET_…

【Linux】常用命令(2.6万字汇总)

文章目录 Linux常用命令汇总1. 基础知识1.1. Linux系统命令行的含义1.2. 命令的组成 2. 基础知识2.1. 关闭系统2.2. 关闭重启2.3. 帮助命令&#xff08;help&#xff09;2.4. 命令说明书&#xff08;man&#xff09;2.5. 切换用户&#xff08;su&#xff09;2.6.历史指令 3.目录…

video2gif容器构建指南

一、介绍 1.项目概述 Video2Gif 项目旨在提供一种便捷的方式&#xff0c;让用户能够将视频中的精彩片段快速转换为 GIF 动画。GIF 动画因其循环播放、文件体积小等特点&#xff0c;在社交媒体、聊天工具中广泛应用&#xff0c;用于表达情感、分享趣事等。 2.核心功能 视频导…

《人工智能网络安全现状(2024)》深度解读:机遇、挑战与应对策略

在当今数字化浪潮汹涌澎湃的时代&#xff0c;人工智能&#xff08;AI&#xff09;与网络安全已然深度交融&#xff0c;二者相互作用所塑造的发展态势正深刻重塑着我们的信息安全格局。《人工智能网络安全现状&#xff08;2024&#xff09;》这份报告恰似一盏明灯&#xff0c;为…

JVM(二、类加载系统)

类加载器 JVM的类加载通过classLoader及其子类完成的 类加载器&#xff1a; 启动类加载器&#xff08;Bootstrap ClassLoader&#xff09;&#xff1a; 负责加载存放在 <JAVA_HOME>\lib 目录中的核心类库&#xff0c;如rt.jar、resources.jar等&#xff08;或者被 -Xboot…

九、HttpMessageConverter

文章目录 1. RequestBody2. RequestEntity3. ResponseBody4. SpringMVC处理json5. SpringMVC处理ajax6. RestController注解7. ResponseEntity 1. RequestBody 2. RequestEntity 3. ResponseBody 4. SpringMVC处理json 5. SpringMVC处理ajax 6. RestController注解 7. Response…

PaddleYOLO目标检测训练(集成SwanLab可视化全过程)

PaddleYolo 是飞桨&#xff08;PaddlePaddle&#xff09;框架下的一个目标检测库&#xff0c;主要用于图像和视频中的物体检测。PaddleYOLO包含YOLO系列模型的相关代码&#xff0c;支持YOLOv3、PP-YOLO、PP-YOLOv2、PP-YOLOE、PP-YOLOE、RT-DETR、YOLOX、YOLOv5、YOLOv6、YOLOv…

移动电源测试中最核心的测试项目有哪些?-纳米软件

移动电源在如今的生活中扮演着重要的角色&#xff0c;对其进行准确的测试至关重要。以下是移动电源测试中一些较为核心的测试项目&#xff1a; 一、容量测试 内部电池容量测试&#xff1a;通过设计大量整机及内部电池容量测试实验&#xff0c;可以准确了解移动电源的实际容量…

跟着尚硅谷学vue2—进阶版4.0—Vuex1.0

5. Vuex 1. 理解 Vuex 1. 多组件共享数据-全局事件总线实现 红线是读&#xff0c;绿线是写 2. 多组件共享数据-vuex实现 vuex 不属于任何组件 3. 求和案例-纯vue版 核心代码 1.Count.vue <template><div><h1>当前求和为&#xff1a;{{ sum }}</h1&…

ChatGPT 搜索 vs Google 搜索

原文&#xff1a;Amanda Caswell - 2024.11.01 随着 OpenAI 推出的实时搜索功能&#xff0c;ChatGPT 正在逐步成为像 Google 这样的传统搜索引擎的竞争对手。ChatGPT 以其对话式的回答方式而闻名&#xff0c;它能够在没有广告干扰的情况下提供实时的上下文信息。 我迫不及待地…

LeetCode【0017】电话号码的字母组合

本文目录 1 中文题目2 最优解法&#xff1a;迭代法2.1 方法思路2.2 Python代码2.3 复杂度分析 3 题目总结 1 中文题目 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下&#xff08;与电话按键相…

iOS 18.2 重磅更新:6个大动作

根据外媒报道&#xff0c;iOS 18.2迎来重磅更新&#xff0c;将带来6个大动作&#xff0c;这是一次非常实用的更新。不过要注意的是&#xff0c;其中涉及到AI的功能&#xff0c;国行iPhone 暂时还不可用&#xff0c;只能等审核通过了。 1&#xff0c;Safari下载进度 过去通过S…

《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项

《TCP/IP网络编程》学习笔记 | Chapter 9&#xff1a;套接字的多种可选项 《TCP/IP网络编程》学习笔记 | Chapter 9&#xff1a;套接字的多种可选项套接字可选项和 I/O 缓冲大小套接字多种可选项getsockopt & setsockoptSO_SNDBUF & SO_RCVBUF SO_REUSEADDR发生地址绑定…