自动化调优指南#
引言#
一种在大规模本地索引向量数据库中调优和评估向量搜索索引的方法。有关本地索引向量数据库和全局索引向量数据库之间差异的更多信息,请参阅本指南。本指南的目标是为用户提供一种可扩展且有效的向量搜索索引调优方法,无论索引有多大。评估向量搜索索引的“模型”,衡量召回率与构建时间的比例,以便在高构建时间下惩罚召回率(最终目标是优化以找到较低的构建时间和较高的召回率)。
有关各种不同类型的向量搜索索引的更多信息,请参阅我们的向量搜索索引选择指南
为何选择自动化调优?#
多达 75% 的用户告诉我们,他们无法对向量数据库进行调优,只能调整一两个简单的旋钮,我们建议理想的“旋钮”应该是平衡训练时间和搜索时间与搜索质量。时间越多,质量越高,找到可接受的搜索性能所需的努力也越多。即使是希望调优的 25% 的用户,仍在寻求简单的工具来完成这项工作。这些用户还要求提供一些简单的调优参数设置指南,例如本指南。
由于向量搜索索引与机器学习模型的关系比传统数据库索引更密切,减轻参数调优负担的一种选择是使用超参数优化工具,例如 Ray Tune 和 Optuna。以验证这一点。
如何调优?#
但是,当索引非常大,比如 1TB 时,这该如何工作呢?
本地索引向量数据库的一个好处是,它们通常通过均匀随机二次采样将较大的向量集分解为较小的向量集,并在二次样本上训练较小的向量搜索索引模型来实现扩展。通常情况下,同一组调优参数应用于所有较小的子索引模型,而不是尝试为每个模型单独设置。在搜索过程中,查询向量通常发送到所有子索引,然后根据最近的距离(或相似度)将结果邻居列表缩减到 k
个。
由于许多数据库使用这种二次采样技巧,因此可以通过从较大索引中随机采样一定数量的向量,将其分成不相交的训练/测试/评估数据集,使用暴力搜索计算地面真相,然后对其进行超参数优化,从而对较大索引执行自动化参数调优。这个过程也可以重复多次,以模拟蒙特卡罗交叉验证。
GPU 天然擅长执行大规模并行任务,尤其是在任务大部分独立时,例如并行训练和评估具有不同超参数设置的模型。超参数优化也非常适合分布式处理,例如多节点多 GPU 操作。
实现自动化调优的步骤#
更正式地说,带有蒙特卡罗交叉验证的自动化参数调优工作流如下所示
将大型数据集摄取到您选择的向量数据库中
根据向量数量选择索引大小。这通常应与数据库最终放入单个 ANN 子索引模型中的平均向量数量对齐。
从数据库中均匀随机采样上述指定数量的向量作为训练集。这通常通过生成一定数量的随机(唯一)数字来实现,直到达到数据集大小。
均匀采样一定数量的向量作为测试集,然后再次采样作为评估集。数量为训练集中向量的 1-10%。
使用测试集计算前一步向量与训练集中所有向量的地面真相。
开始训练集的 HPO 调优过程,使用测试向量作为查询集。重要的是要确保您的 HPO 是多目标的,并优化:a) 低构建时间,b) 高吞吐量或低延迟搜索(取决于需求),以及 c) 可接受的召回率。
使用评估数据集测试最优超参数是否泛化到优化过程中未使用的未见点。
(可选)在不同的均匀二次采样上重复上述步骤多次。然后可以将多个蒙特卡罗优化迭代中的最优参数进行组合。例如,许多超参数可以直接平均,但其他参数可能需要谨慎处理。
使用上述满足目标约束(例如,构建 vs 搜索 vs 质量)的理想参数在数据库中创建新索引。
结论#
在此过程结束时,您应该拥有一组满足您目标约束的参数,同时展示了最优超参数在数据集上的泛化能力。这种方法的主要优势在于它将潜在无限大的数据集分解为可管理的数据块,并加速对这些数据块的调优。我们认为这个过程对 GPU 上的向量搜索是一个重大的价值增值。