在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
)的摘要:
数据集 | 全精度索引 | Int8量化索引 | 绝对差值 | 相对差值 |
---|---|---|---|---|
Arguana | 0.37 | 0.362 | -0.008 | -2.16% |
FiQA-2018 | 0.309 | 0.304 | -0.005 | -1.62% |
NFCorpus | 0.302 | 0.297 | -0.005 | -1.66% |
Quora | 0.876 | 0.875 | -0.001 | -0.11% |
SCIDOCS | 0.135 | 0.132 | -0.003 | -2.22% |
Scifact | 0.649 | 0.644 | -0.005 | -0.77% |
TREC-COVID | 0.683 | 0.672 | -0.011 | -1.61% |
平均值 | -0.005 | -1.05% |
表1:全精度和int8量化索引在BEIR数据集中的nDCG@10分数
总的来说,平均相对降低了1.05%。
接下来,我们考虑使用未量化版本的多语言E5-small(参见模型卡片这里)重复相同的评估过程,表2显示了相应的结果。
数据集 | 全精度索引 | Int8量化索引 | 绝对差值 | 相对差值 |
---|---|---|---|---|
Arguana | 0.384 | 0.379 | -0.005 | -1.3% |
Climate-FEVER | 0.214 | 0.222 | 0.008 | 3.74% |
FEVER | 0.718 | 0.715 | -0.003 | -0.42% |
FiQA-2018 | 0.328 | 0.324 | -0.004 | -1.22% |
NFCorpus | 0.31 | 0.306 | -0.004 | -1.29% |
NQ | 0.548 | 0.537 | -0.011 | -2.01% |
Quora | 0.882 | 0.881 | -0.001 | -0.11% |
Robust04 | 0.418 | 0.415 | -0.003 | -0.72% |
SCIDOCS | 0.134 | 0.132 | -0.003 | -1.49% |
Scifact | 0.67 | 0.666 | -0.004 | -0.6% |
TREC-COVID | 0.709 | 0.693 | -0.016 | -2.26% |
平均值 | -0.004 | -0.83% |
表2:在一系列BEIR数据集上的多语言E5-small的nDCG@10分数
再次,我们观察到性能的轻微相对下降,为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版本中将其设为默认设置。