Int4:Lucene 中的更多标量量化

这篇具有很好参考价值的文章主要介绍了Int4:Lucene 中的更多标量量化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者:来自 Elastic Benjamin Trent, Thomas Veasey

在 Lucene 中引入 Int4 量化

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

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

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

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

Int4:Lucene 中的更多标量量化,Elasticsearch,AI,Elastic,lucene,全文检索,搜索引擎,大数据,人工智能,elasticsearch
图 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 a
  ByteVector va8 = ByteVector.fromArray(ByteVector.SPECIES_64, a, i);
  // Get 8 bytes from vector b
  ByteVector vb8 = ByteVector.fromArray(ByteVector.SPECIES_64, b, i);
  // Multiply together, potentially saturating signed byte with a max of 225
  ByteVector prod8 = va8.mul(vb8);
  // Now convert the product to accumulate into the short
  ShortVector prod16 = prod8.convertShape(B2S, ShortVector.SPECIES_128, 0).reinterpretAsShorts();
  // Ensure to handle potential byte saturation
  acc = acc.add(prod16.and((short) 0xFF));
}
// snip, tail handling

计算误差修正

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

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

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

Int4:Lucene 中的更多标量量化,Elasticsearch,AI,Elastic,lucene,全文检索,搜索引擎,大数据,人工智能,elasticsearch

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

Int4:Lucene 中的更多标量量化,Elasticsearch,AI,Elastic,lucene,全文检索,搜索引擎,大数据,人工智能,elasticsearch

在这里,i 是每个浮点向量维度, 是每个浮点向量维度,且 。

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

寻找最佳分桶

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

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

Int4:Lucene 中的更多标量量化,Elasticsearch,AI,Elastic,lucene,全文检索,搜索引擎,大数据,人工智能,elasticsearch
图 2:CohereV3 维度值的样本。
Int4:Lucene 中的更多标量量化,Elasticsearch,AI,Elastic,lucene,全文检索,搜索引擎,大数据,人工智能,elasticsearch
图3:CohereV3 维度值量化为 int7 值。 最后的那些尖峰是什么? 嗯,这就是量化过程中截断极值的结果。

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

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

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

量化速度与大小

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

Int4:Lucene 中的更多标量量化,Elasticsearch,AI,Elastic,lucene,全文检索,搜索引擎,大数据,人工智能,elasticsearch
图 5:CohereV3 500k 向量的内存要求。

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

Int4:Lucene 中的更多标量量化,Elasticsearch,AI,Elastic,lucene,全文检索,搜索引擎,大数据,人工智能,elasticsearch
图 6:CohereV3 500k 向量的速度比较。

结束 ?

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

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

原文:Int4: More Scalar Quantization in Lucene — Elastic Search Labs文章来源地址https://www.toymoban.com/news/detail-860883.html

到了这里,关于Int4:Lucene 中的更多标量量化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • YOLOV5 INT8 量化对比

    对比了两种INT8量化, 熵校准的量化有更高的速度,但是吧… 最大最小值校准是一种 INT8 校准算法。在最大最小值校准中, 需要使用一组代表性的校准数据来生成量化参数, 首先将推理中的数据进行统计,计算数据的最小值和最大值,然后根据这些值来计算量化参数。具体步

    2024年02月16日
    浏览(47)
  • ElasticSearch与Lucene是什么关系?Lucene又是什么?

    一. ElasticSearch 与 Lucene 的关系 Elasticsearch(ES)和Apache Lucene之间有密切的关系,可以总结如下: Elasticsearch构建于Lucene之上:Elasticsearch实际上是一个分布式的、实时的搜索和分析引擎,它构建在Apache Lucene搜索引擎库的基础上。Lucene提供了全文搜索和索引功能,而Elasticsearch在此

    2024年02月04日
    浏览(42)
  • 模型量化!ONNX转TensorRT(FP32, FP16, INT8)

    本文为Python实现,C++实现链接模型量化 若还没有配置环境(CUDA,CUDNN,TensorRT),请移至C++实现中查看环境配置方法    支持三种不同精度的量化 模型单精度量化 (FP32) 模型半精度量化 (FP16) 模型Int8量化 (INT8) 经测试yolov5,yolov6,yolov7,yolov8转化成功 yolov5: https://github.com/u

    2024年02月16日
    浏览(41)
  • OpenVINO 2022.3实战六:NNCF 实现 YOLOv5 模型 INT8 量化

    使用OpenVINO模型优化器将YOLOv5模型转换为OpenVINO IR格式,以便在Intel硬件上进行推理。 下载yolov5代码 ultralytics/yolov5 导出模型为onnx模型,接着使用mo导出openvino fp32和fp16模型 将训练数据集准备成可用于量化的格式。 配置量化管道,例如选择适当的量化算法和设置目标精度。 在

    2024年02月08日
    浏览(46)
  • B081-Lucene+ElasticSearch

    认识全文检索 概念 对非结构化数据的搜索就叫全文检索,狭义的理解主要针对文本数据的搜索。 非结构化数据: 没有固定模式的数据,如WORD、PDF、PPT、EXL,各种格式的图片、视频等。 非结构化数据是数据结构不规则或不完整,没有预定义的数据模型,不方便用数据库二

    2024年02月10日
    浏览(29)
  • Elasticsearch:将最大内积引入 Lucene

    作者:Benjamin Trent 目前,Lucene 限制 dot_product (点积) 只能在标准化向量上使用。 归一化迫使所有向量幅度等于一。 虽然在许多情况下这是可以接受的,但它可能会导致某些数据集的相关性问题。 一个典型的例子是 Cohere 构建的嵌入(embeddings)。 它们的向量使用幅度来提供更

    2024年02月05日
    浏览(42)
  • Lucene轻量级搜索引擎,Solr 和 ElasticSearch 都是基于 Lucene 的封装

    1、Lucene 是什么 Lucene 是一个本地全文搜索引擎,Solr 和 ElasticSearch 都是基于 Lucene 的封装 Lucene 适合那种轻量级的全文搜索,我就是服务器资源不够,如果上 ES 的话会很占用服务器资源,所有就选择了 Lucene 搜索引擎 2、倒排索引原理 全文搜索的原理是使用了倒排索引,那么什么是倒

    2024年03月15日
    浏览(72)
  • Windows环境下搭建chatGLM2-6B-int4量化版模型(图文详解-成果案例)

    目录 一、ChatGLM2-6介绍 二、环境准备 1. 硬件环境 2. TDM-GCC安装 3.git安装 4.Anaconda安装 三、模型安装 1.下载ChatGLM2-6b和环境准备 方式一:git命令 方式二:手动下载  2.下载预训练模型 在Hugging Face HUb下载(挂VPN访问) (1)git命令行下载: (2)手动下载(建议) 3.模型使用(

    2024年03月13日
    浏览(50)
  • 《面试1v1》ElasticSearch 和 Lucene

    🍅 作者简介:王哥,CSDN2022博客总榜Top100🏆、博客专家💪 🍅 技术交流:定期更新Java硬核干货,不定期送书活动 🍅 王哥多年工作总结:Java学习路线总结, 点击 突击面试 🍅 数十万人的面试选择: 面试说人话系列《面试1v1》 我是 javapub,一名 Markdown 程序员从👨‍💻,

    2024年02月14日
    浏览(47)
  • Lucene和Solr和Elasticsearch区别,全文检索引擎工具包Lucene索引流程和搜索流程实操

    我们生活中的数据总体分为两种: 结构化数据和非结构化数据 。 结构化数据 :指具有固定格式或有限长度的数据,如数据库,元数据等。 非结构化数据 :指不定长或无固定格式的数据,如 互联网数据、邮件,word文档等。 非结构化数据又有一种叫法叫全文数据 按照数据的

    2024年02月03日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包