自动调优指南#
介绍#
一种用于在本地索引的向量数据库中大规模调整和评估向量搜索索引的方法。有关本地和全局索引向量数据库之间差异的更多信息,请参阅本指南。本指南的目标是为用户提供一种可扩展且有效的方法来调整向量搜索索引,无论其规模有多大。评估向量搜索索引“模型”,该模型根据构建时间比例来衡量召回率,以便在构建时间非常高时惩罚召回率(最终应优化为找到较低的构建时间和较高的召回率)。
有关各种不同类型的向量搜索索引的更多信息,请参阅我们的选择向量搜索索引指南
为什么需要自动调优?#
多达75%的用户告诉我们,他们无法调整向量数据库,只能使用一两个简单的旋钮,我们建议理想的“旋钮”应该是在训练时间、搜索时间和搜索质量之间取得平衡。时间越多,质量越高,找到可接受的搜索性能所需的努力也越多。即使是那25%希望进行调整的用户,仍然要求有简单的工具来实现这一点。这些用户还要求一些简单的指南来设置调整参数,比如本指南。
由于向量搜索索引与传统数据库索引相比更接近机器学习模型,减轻参数调整负担的一个选择是使用超参数优化工具,如Ray Tune和Optuna来验证这一点。
如何调优?#
但是当我们有一个非常大的索引时,比如1TB,这会如何工作呢?
本地索引向量数据库的一个好处是,它们通常通过将较大的向量集分解为较小的集合来进行扩展,方法是通过均匀随机子采样并在子样本上训练较小的向量搜索索引模型。通常情况下,相同的调优参数会应用于所有较小的子索引模型,而不是为每个模型单独设置。在搜索过程中,查询向量通常会被发送到所有子索引,然后根据最近的距离(或相似度)将结果邻居列表减少到k。
因为许多数据库使用这种子采样技巧,所以可以通过从较大的索引中随机采样一些向量,将它们分成不相交的训练/测试/评估数据集,使用暴力计算真实值,然后在其上执行超参数优化,从而对较大的索引进行自动参数调优。这个过程也可以重复多次以模拟蒙特卡洛交叉验证。
GPU天生擅长执行大规模并行任务,尤其是在任务大部分独立的情况下,例如并行训练和评估具有不同超参数设置的模型。超参数优化也非常适合分布式处理,例如多节点多GPU操作。
实现自动调优的步骤#
更正式地说,使用蒙特卡洛交叉验证的自动化参数调整工作流程看起来像这样:
将大型数据集导入您选择的向量数据库
Choose an index size based on number of vectors. This should usually align with the average number of vectors the database will end up putting in a single ANN sub-index model.
从数据库中均匀随机抽取上述指定数量的向量作为训练集。这通常通过生成一些随机(唯一)数字来实现,这些数字的范围不超过数据集的大小。
均匀采样一些向量作为测试集,并再次为评估集进行采样。训练集中1-10%的向量。
Use the test set to compute ground truth on the vectors from prior step against all vectors in the training set.
Start the HPO tuning process for the training set, using the test vectors for the query set. It’s important to make sure your HPO is multi-objective and optimizes for: a) low build time, b) high throughput or low latency sarch (depending on needs), and c) acceptable recall.
使用评估数据集来测试最优超参数是否能够泛化到优化过程中未使用的未见点。
可选地,在不同的均匀子采样上多次执行上述步骤。然后可以在多次蒙特卡洛优化迭代中组合最优参数。例如,许多超参数可以简单地取平均值,但其他参数可能需要小心处理。
使用上述满足目标约束的理想参数在数据库中创建一个新索引(例如,构建与搜索与质量)
结论#
在此过程结束时,您应该拥有一组满足目标约束的参数,同时展示最优超参数在数据集上的泛化能力。这种方法的主要好处在于它将可能无限大的数据集分解为可管理的块,并加速对这些块的调优。我们认为这一过程对于GPU上的向量搜索具有重要的价值。