评估 Elasticsearch 中的标量量化

server/2024/9/23 14:27:19/

作者:来自 Elastic Thanos Papaoikonomou, Thomas Veasey

在 8.13 版本中,我们为 Elasticsearch 引入了标量量化功能。通过使用此功能,最终用户可以提供浮点向量,这些向量在内部作为字节向量进行索引,同时在索引中保留浮点向量,以便可选地重新评分。这意味着他们可以将索引内存需求降低四分之一,这是其主要成本。目前,这是一个可选择加入的功能,但我们认为与将向量索引为浮点数相比,这是一个更好的权衡。在 8.14 版本中,我们将使其成为默认设置。然而,在这样做之前,我们希望对质量影响进行系统评估。

多语言 E5-small 是我们在 Elasticsearch 中提供的一个高质量小型多语言段落嵌入模型。它有两个版本:一个跨平台版本,可以在任何硬件上运行,还有一个为 Elastic Stack 中的 CPU 推理优化的版本(参见此处)。E5 代表了自动量化的一个挑战性案例,因为它产生的向量角度变化小且相对于最新技术模型维度较低。如果我们能够在为这个模型启用 int8 量化时实现几乎没有损害,我们就可以有信心它将可靠工作。

这次实验的目的是评估在广泛的检索任务中使用此模型描述的标量量化 kNN 搜索的效果。更具体地说,我们的目标是评估从全精度索引切换到量化索引的性能下降(如果有的话)。

方法论概述

在评估中,我们依赖于 BEIR,并针对我们考虑的每个数据集构建了一个使用默认超参数(m: 16, ef_construction: 100)的全精度和一个 int8 量化索引。首先,我们尝试了 Elastic 在此处提供的多语言 E5-small 模型的量化版本(仅权重),表 1 概述了 nDCG@10 分数(k:10,num_candidates:100):

表 1:精选 BEIR 数据集的全精度和 int8 量化指数的 nDCG@10 分数
DatasetFull precisionInt8 quantizationAbsolute differenceRelative difference
Arguana0.370.362-0.008-2.16%
FiQA-20180.3090.304-0.005-1.62%
NFCorpus0.3020.297-0.005-1.66%
Quora0.8760.875-0.001-0.11%
SCIDOCS0.1350.132-0.003-2.22%
Scifact0.6490.644-0.005-0.77%
TREC-COVID0.6830.672-0.011-1.61%
Average-0.005-1.05%

总体而言,平均而言,似乎有轻微的相对下降,约为 1.05%。

接下来,我们考虑重复使用多语言 E5-small 的未量化版本进行相同的评估过程(请参阅此处的模型卡片),表 2 显示了相应的结果。

表 2:在精选的 BEIR 数据集上多语言-E5-small 的 nDCG@10 分数
DatasetFull precisionInt8 quantizationAbsolute differenceRelative difference
Arguana0.3840.379-0.005-1.3%
Climate-FEVER0.2140.222+0.008+3.74%
FEVER0.7180.715-0.003-0.42%
FiQA-20180.3280.324-0.004-1.22%
NFCorpus0.310.306-0.004-1.29%
NQ0.5480.537-0.011-2.01%
Quora0.8820.881-0.001-0.11%
Robust040.4180.415-0.003-0.72%
SCIDOCS0.1340.132-0.003-1.49%
Scifact0.670.666-0.004-0.6%
TREC-COVID0.7090.693-0.016-2.26%
Average-0.004-0.83%

再次观察到性能略微相对下降,平均下降为 0.83%。最后,我们对多语言 E5-base 重复了相同的实验,性能下降甚至更小(0.59%)。

但这还不是全部:量化 HNSW 索引的增加效率以及原始浮点向量仍然保留在索引中的事实,使我们能够通过重新评分来恢复部分性能的损失。更具体地说,我们可以通过在量化索引中进行近似 kNN 搜索来检索更大的候选池,这是相当快速的,然后根据原始浮点向量计算相似性函数并进行相应的重新评分。

作为概念验证,我们考虑了 NQ 数据集,其在多语言 E5-small 上表现出较大的性能下降(2.01%)。通过设置 k=15、num_candidates=100 和 window_size=10(因为我们对 nDCG@10 感兴趣),我们获得了改进的分数为 0.539,恢复了约 20% 的性能。如果我们进一步将 num_candidates 参数增加到 200,则可以获得与全精度索引相匹配的分数,但响应时间更快。在 Arguana 上使用相同的设置,得分从 0.379 提高到 0.382,从而将相对性能下降从 1.3% 限制到仅为 0.52%。

结论

我们的评估结果表明,标量量化可以用来减少 Elasticsearch 中向量嵌入的内存占用,而不会对检索性能造成显著损失。性能下降在较小向量中更为明显(多语言 E5-small 生成的向量大小等于 384,而 E5-base 提供 768 维的嵌入),但这可以通过重新评分来缓解。我们相信,对于大多数用户来说,标量量化将是有益的,我们计划在 8.14 版本中使其成为默认设置。

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

原文:Evaluating scalar quantization in Elasticsearch — Elastic Search Labs


http://www.ppmy.cn/server/32871.html

相关文章

考研入门55问---基础知识篇

考研入门55问---基础知识篇 01 >什么是研究生入学考试? 研究生是指大专和本科之后的深造课程。以研究生为最高学历, 研究生毕业后,也可称研究生,含义为研究生学历的人。在中国大陆地区,普通民众一般也将硕士毕业生称…

深入理解Java泛型

Java泛型是在JDK 5中引入的一个强大的特性,它允许开发者在编译时提供类型安全的集合操作。泛型的本质是参数化类型,即在类或方法中使用一个或多个类型形参来定义,然后在创建类实例或调用方法时传入具体的类型参数。 泛型的基本使用 泛型的基…

如何学习 Unreal Engine

学习Unreal Engine(简称UE),尤其是最新的UE5,是一项复杂但值得的任务,因为它是游戏开发和实时3D内容创建的强大工具。以下是一些建议来帮助您开始学习Unreal Engine: 1. **了解基础知识**:在深…

VMware虚拟机中ubuntu使用记录(6)—— 如何标定单目相机的内参(张正友标定法)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、张正友相机标定法1. 工具的准备2. 标定的步骤(1) 启动相机(2) 启动标定程序(3) 标定过程的操作(5)可能的报错 3. 标定文件内容解析 前言 张正友相机标定法…

【玩转Google云】GCP Kubernetes Engine (GKE) 深入解析

Google Kubernetes Engine (GKE) 作为 Google Cloud Platform (GCP) 提供的托管式 Kubernetes 服务,为开发者和运维人员提供了一条通往云原生应用的便捷之路。本文将深入剖析 GKE 的核心优势和主要功能,带您领略其如何简化 Kubernetes 管理、提升应用可靠性与可扩展性,并保障…

电路板/硬件---器件

电阻 电阻作用 电阻在电路中扮演着重要的角色,其作用包括: 限制电流:电阻通过阻碍电子流动的自由而限制电流。这是电阻最基本的功能之一。根据欧姆定律,电流与电阻成正比,电阻越大,通过电阻的电流就越小。…

Jenkins docker部署springboot项目

1、创建jenkins容器 1,首先,我们需要创建一个 Jenkins 数据卷,用于存储 Jenkins 的配置信息。可以通过以下命令创建一个数据卷: docker volume create jenkins_data启动 Jenkins 容器并挂载数据卷: docker run -dit…

python脚本制作可执行文件(pyinstaller)

在Linux系统下,如果你想将一个Python脚本编译成一个可执行文件,并且希望这个可执行文件能被C程序调用,你可以通过几个步骤来实现这一目标。 1. 使用PyInstaller或Cython将Python脚本编译为可执行文件 使用PyInstaller 安装PyInstaller: p…