Int4:Lucene 中的更多标量量化

作者:来自 Elastic Benjamin Trent, Thomas Veasey

在 Lucene 中引入 Int4 量化

在之前的博客中,我们全面介绍了 Lucene 中标量量化的实现。 我们还探索了两种具体的量化优化。 现在我们遇到了一个问题:int4 量化在 Lucene 中是如何工作的以及它是如何排列的?

存储量化向量并对其进行评分

Lucene 将所有向量存储在一个平面文件中,从而可以根据给定的序数检索每个向量。 你可以在我们之前的标量量化博客中阅读对此的简要概述。

现在 int4 为我们提供了比以前更多的压缩选项。 它将量化空间减少到只有 16 个可能的值(0 到 15)。 为了更紧凑的存储,Lucene 使用一些简单的位移操作将这些较小的值打包到单个字节中,在 int8 已经节省 4 倍空间的基础上,还可以节省 2 倍空间。 总之,使用位压缩存储 int4 比 float32 小 8 倍。

图 1:这显示了 int4 所需的字节数减少,压缩后大小比 float32 减少了 8 倍。

int4 在计算延迟方面也有一些好处。 由于已知值在 0-15 之间,因此我们可以利用准确了解何时担心值溢出并优化点积计算。 点积的最大值为 15*15=225,可以容纳在一个字节中。 ARM 处理器(如我的 MacBook)的 SIMD 指令长度为 128 位(16 字节)。 这意味着对于 Java Short,我们可以分配 8 个值来填充通道。 对于 1024 维,每个通道最终将累积总共 1024/8=128 次乘法,最大值为 225。所得的最大和 28800 完全符合 Java 短值的限制,我们可以迭代更多值​​一次比。 下面是 ARM 的一些简化代码。

// snip preamble handling vectors longer than 1024
// 8 lanes of 2 bytes 
ShortVector acc = ShortVector.zero(ShortVector.SPECIES_128);
for (int i = 0; i < length; i += ByteVector.SPECIES_64.length()) {// Get 8 bytes from vector aByteVector va8 = ByteVector.fromArray(ByteVector.SPECIES_64, a, i);// Get 8 bytes from vector bByteVector vb8 = ByteVector.fromArray(ByteVector.SPECIES_64, b, i);// Multiply together, potentially saturating signed byte with a max of 225ByteVector prod8 = va8.mul(vb8);// Now convert the product to accumulate into the shortShortVector prod16 = prod8.convertShape(B2S, ShortVector.SPECIES_128, 0).reinterpretAsShorts();// Ensure to handle potential byte saturationacc = acc.add(prod16.and((short) 0xFF));
}
// snip, tail handling

计算误差修正

有关误差校正计算及其推导的更详细说明,请参阅误差校正标量点积。

这是一个简短的总结,遗憾的是(或高兴的是)没有复杂的数学。

对于存储的每个量化向量,我们还跟踪量化误差校正。 回到标量量化 101 博客中,提到了一个特定的常数:

该常数是从基本代数导出的简单常数。 但是,我们现在在存储的浮点数中包含与舍入损失相关的附加信息。

在这里,i 是每个浮点向量维度,i^{^{'}} 是每个浮点向量维度,且 \alpha = \frac{max-min}{(1<<bits)-1}

这有两个后果。 第一个是直观的,因为这意味着对于给定的一组量化桶,我们会稍微更准确,因为我们考虑了量化的一些损耗。 第二个结果有点微妙。 现在这意味着我们有一个受量化分桶影响的纠错措施。 这意味着它可以被优化。

寻找最佳分桶

进行标量量化的简单而简单的方法可以让你走得很远。 通常,你选择一个置信区间,从中计算向量值允许的极端边界。 Lucene 和 Elasticsearch 中的默认值是

1−1/(dimensions+1) 。图 2 显示了一些 CohereV3 嵌入样本的置信区间。 图 3 显示了相同的向量,但使用静态设置的置信区间进行标量量化。

图 2:CohereV3 维度值的样本。

图3:CohereV3 维度值量化为 int7 值。 最后的那些尖峰是什么? 嗯,这就是量化过程中截断极值的结果。

但是,我们留下了一些不错的优化。 如果我们可以调整置信区间来移动存储桶,从而允许更重要的维度值具有更高的保真度,该怎么办? 为了优化,Lucene 执行以下操作:

  • 从数据集中采样大约 1,000 个向量并计算它们真正的最近 10 个邻居。
  • 计算一组候选上分位数和下分位数。 该集合是通过使用两个不同的置信区间来计算的:1−1/(dimensions+1) 及 1−(dimensions/10)/(dimensions+1)。这些间隔处于相反的极端。 例如,具有 1024 个维度的向量将搜索置信区间 0.99902 和 0.90009 之间的候选分位数。
  • 对这两个置信区间之间存在的分位数子集进行网格搜索。 网格搜索找到使量化得分误差的确定系数与之前计算的真实 10 个最近邻相比最大的分位数。
图 3:Lucene 搜索置信区间空间并测试 int4 量化的各种存储桶。

图 4:为此 CohereV3 样本集找到的最佳 int4 量化桶。

有关优化过程和优化背后的数学原理的更完整说明,请参阅优化截断间隔。

量化速度与大小

正如我之前提到的,int4 为你提供了性能和空间之间有趣的权衡。 为了说明这一点,以下是 CohereV3 500k 向量的一些内存要求。

图 5:CohereV3 500k 向量的内存要求。

当然,我们看到常规标量量化典型地减少了 4 倍,但使用 int4 又减少了 2 倍。 将所需内存从 2GB 减少到 300MB 以下。 请记住,这是启用压缩的情况。 解压缩和压缩字节在搜索时确实会产生开销。 对于每个字节向量,我们必须在进行 int4 比较之前对其进行解压缩。 因此,当在 Elasticsearch 中引入这一功能时,我们希望让用户能够选择压缩或不压缩。 对于某些用户来说,更便宜的内存要求是不容错过的,而对于其他用户来说,他们关注的是速度。 Int4 提供了调整设置以适合你的用例的机会。

图 6:CohereV3 500k 向量的速度比较。

结束 ?

在过去的两篇大型技术博客文章中,我们回顾了有关优化的数学和直觉以及它们给 Lucene 带来的影响。 这是一段漫长的旅程,我们还远远没有完成。 请在未来的 Elasticsearch 版本中关注这些功能!

准备好将 RAG 构建到你的应用程序中了吗? 想要尝试使用向量数据库的不同 LLMs?
在 Github 上查看我们的 LangChain、Cohere 等示例笔记本,并参加即将开始的 Elasticsearch 工程师培训!

原文:Int4: More Scalar Quantization in Lucene — Elastic Search Labs

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

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

相关文章

微服务之并行与分布式计算

一、概述 1.1集中式系统vs分布式系统 集中式系统 集中式系统完全依赖于一台大型的中心计算机的处理能力&#xff0c;这台中心计算机称为主机&#xff08;Host 或 mainframe &#xff09;&#xff0c;与中心计算机相连的终端设备具有各不相同非常低的计算能力。实际上大多数终…

【ARM 裸机】BSP 工程管理

回顾一下上一节&#xff1a;【ARM 裸机】NXP 官方 SDK 使用&#xff0c;我们发现工程文件夹里面各种文件非常凌乱&#xff1b; 那么为了模块化整理代码&#xff0c;使得同一个属性的文件存放在同一个目录里面&#xff0c;所以学习 BSP 工程管理非常有必要。 1、准备工作 新建…

校车车载4G视频智能监控系统方案

一、项目背景 随着社会的快速发展&#xff0c;校车安全问题日益受到人们的关注。为了提高校车运营的安全性&#xff0c;保障学生的生命安全&#xff0c;我们提出了一套校车车载4G视频智能监控系统方案。该系统能够实时监控校车内部和外部环境&#xff0c;及时发现并处理潜在的…

selenium 自动化测试课上实操指南1——百度搜索

1.环境准备 下面的所有资源可以从超星班级资料中下载&#xff0c;机房的同学在收到的文件夹中可以找到文件 非本校同学&#xff0c;免费加入学银在线课程&#xff0c;就可以在资料 根目录 > 02 课件新 > week09 web自动化测试02 里下载本次实操资料 1&#xff09;安…

【打工日常】云原生之搭建私有化web在线聊天软件LumenIM

一、LumenIM介绍 1.LumenIM简介 Lumen IM 是一个网页版在线聊天项目&#xff0c;前端使用 Naive UI Vue3&#xff0c;后端采用 GO 开发。 2.LumenIM功能 基于 WebSocket 服务做消息即时推送 支持私聊及群聊 支持多种聊天消息类型 例如:文本、代码块、图片及其它类型文件&…

15.接口自动化学习-Mock(挡板/测试桩)

场景&#xff1a; 新需求还未开发时&#xff0c;使用mock提早介入测试&#xff0c;等后边开发后&#xff0c;进行调试 三方接口返回效率低&#xff0c;使用mock技术走通流程 1.mock方式 &#xff08;1&#xff09;如果会写django或flask,可以写简单对应的代码 &#xff08;…

Mysql--基础知识点--0.1--脏读、不可重复读、幻读

1 脏读、不可重复读、幻读 1.1 脏读 如果一个事务读到了另一个事务已修改且未提交的数据&#xff0c;则发生了脏读现象。 1.2 不可重复读 在一个事务里面多次读取同一个数据&#xff0c;若前后两次读到的数据不一致&#xff0c;则发生不可重复读现象。 1.3 幻读 在一个…

redis7 for windows的安装教程

本篇博客主要介绍redis7的windows版本下的安装教程 1.redis介绍 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的&#xff0c;基于内存的数据结构存储系统&#xff0c;可用作数据库、缓存和消息代理。它支持多种数据结构&#xff0c;如字符串、哈希表、列…

【软考高项】二十六、范围管理基础内容

一、管理基础 产品范围和项目范围 产品范围强调结果&#xff0c;项目范围强调结果 管理的新实践 &#xff1a;需求一直是项目管理的关注重点&#xff0c;需求管理过程结束于需求关闭&#xff0c;即把产品、服务或成果移交给接收方&#xff0c;以便长期测量、监控、实现并维持收…

three.js 学习笔记 | 光线投射技术 - 包围盒(碰撞检测)

文章目录 three.js 学习笔记光线投射技术实现3D场景交互事件 THREE.Raycaster坐标系的转换案例&#xff1a;选中的模型变为红色 包围盒Box3 - 碰撞检测AABB包围盒辅助器Box3Helper案例1&#xff1a;创建AABB包围盒/包围球computeBoundingBox与boundingBox 搭配使用&#xff0c;…

vivado Aurora 8B/10B IP核(1)

Aurora 8B/10B IP 支持 Kintex -7, Virtex -7 FPGA GTP 和 GTH 收发器&#xff0c;Artix -7 FPGA GTP 收发器, Zynq -7000 GTP and GTP 收发器。Aurora 8B/10B IP core 可以工作于单工或者全双工模式。IP CODE的使用也非常简单&#xff0c;支持 AMBA总线的 AXI4-Stream 协议。…

字符串函数及其模拟实现

目录 strlen函数介绍模拟实现 strcpy函数介绍模拟实现 strcat函数介绍模拟实现 strcmp函数介绍模拟实现 strncpy函数介绍模拟实现 strncat函数介绍模拟实现 strncmp函数介绍模拟实现 strtokstrstr函数介绍模拟实现 strerrorperror strlen 函数介绍 函数介绍&#xff1a; 字符串…

Leetcode 17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits “23” 输出&#xff1a;[“a…

React真的好难用

我发现React就像个宗教一样&#xff0c;网络上总有一群信徒。信徒&#xff1a;React天下第一&#xff0c;谁也不能说他不好。 网络上大佬对React的评价一般有几类&#xff1a; React跟Vue比就是手动档和自动档的区别&#xff0c;高手都开手动档。—— 就一个破打工的&#xf…

cJSON的使用

文章目录 一、CJSON初识二、CJSON解析器基础三、CJSON解析数据JSON解析基础CJSON解析数组数据CJSON解析嵌套数据 五、创建JSON数据 一、CJSON初识 JSON (JavaScript Object Notation)是一种轻量级的数据交换格式&#xff0c;常用于在网络之间传输数据。它是一种文本格式&#…

河南新办灌溉排涝乙级资质预算分析

河南新办灌溉排涝乙级资质的预算分析是一个涉及多方面因素的综合考量。以下是对该预算的详细分析&#xff1a; 首先&#xff0c;人员费用是预算中的重要组成部分。这包括聘请符合资质要求的技术人员、工程师和其他相关人员的薪酬、社保等费用。这些费用会根据所需人员的数量、资…

JavaScript云LIS系统源码 前端框架JQuery+EasyUI+后端框架MVC+SQLSuga大型医院云LIS检验系统源码 可直接上项目

JavaScript云LIS系统源码 前端框架JQueryEasyUI后端框架MVCSQLSuga大型医院云LIS检验系统源码 可直接上项目 云LIS系统概述&#xff1a; 云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序&#xff0c;可协助区域内所有临床实验室相互协调并完成日常检验工作&#xff…

Unity类银河恶魔城学习记录15-5,6 p157 Audio time limiter p158 Area sound

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili​​ AreaSound.cs using System.Collections; using System.Collections.G…

视频输入c++ 调用 libtorch推理

1、支持GPU情况 libtorch 支持GPU情况比较奇怪&#xff0c;目前2.3 版本需要在链接器里面加上以下命令&#xff0c;否则不会支持gpu -INCLUDE:?ignore_this_library_placeholderYAHXZ 2 探测是否支持 加一个函数看你是否支持torch&#xff0c;不然不清楚&#xff0c;看到…

Hive函数详解

Hive 是一个建立在 Hadoop 上的数据仓库基础架构&#xff0c;它提供了类似于 SQL 的查询语言&#xff0c;称为 HiveQL&#xff0c;用于对存储在 Hadoop 分布式文件系统中的数据进行查询和分析。 1.函数简介 Hive会将常用的逻辑封装成函数给用户进行使用&#xff0c;类似于Jav…