本指南概述了可以在cuVS Benchmarks yaml配置文件中指定的各种参数设置,并解释了它们对相应算法的影响,以帮助为跨所需召回水平的基准测试提供设置信息。
cuVS 索引#
cuvs_brute_force#
使用cuVS暴力索引进行精确搜索。暴力搜索没有进一步的构建或搜索参数。
cuvs_ivf_flat#
IVF-flat 使用倒排文件索引,将向量分割成一系列簇或列表,并以交错格式存储,这种格式优化了快速距离计算。IVF-flat 索引的搜索将索引中的总向量减少到用户指定的最近簇(称为探针)内的向量。
IVF-flat 是一种简单的算法,它不会节省任何空间,但在较高的召回率下仍能提供有竞争力的搜索时间。
cuvs_ivf_pq#
IVF-pq 是一种倒排文件索引,它将向量分割成一系列簇或列表,类似于上述的 IVF-flat。不同之处在于,IVF-PQ 使用乘积量化来压缩向量,从而使索引的内存占用更小。不幸的是,更高的压缩级别也可能降低召回率,但当原始向量仍然可用时,可以通过细化步骤来改善召回率。
cuvs_cagra#
CAGRA使用基于图的索引,它首先使用IVF-PQ创建一个中间、近似的kNN图,然后进一步优化和调整以创建最终的kNN图。CAGRA将这个kNN图用作搜索的索引。
graph_memory_type 或 internal_dataset_memory_type 选项对于不适合设备内存的大型数据集非常有用。将 internal_dataset_memory_type 设置为除 device 以外的值会对搜索速度产生负面影响。使用 host_huge_page 选项仅在支持异构内存管理的系统或原生支持GPU访问系统分配内存的平台(例如Grace Hopper)上受支持。
为了微调CAGRA索引构建,我们可以使用以下设置自定义IVF-PQ索引构建器选项。这些设置仅在graph_build_algo == "IVF_PQ"时生效。建议使用单独的IVF-PQ索引进行实验,以找到在大批量情况下提供最大QPS的配置。召回率不需要非常高,因为CAGRA会进一步优化kNN邻居图。一些默认值是根据数据集大小得出的,假设数据集大小为[n_vecs, dim]。
参数 |
类型 |
是否必需 |
数据类型 |
默认值 |
描述 |
|
|
N |
正整数 >0 |
sqrt(n_vecs) |
将向量分成的簇的数量。较大的值会使每个簇中的点更少,但这会影响索引构建时间,因为需要训练更多的簇。 |
|
|
N |
正整数 >0 |
25 |
训练聚类时使用的k-means迭代次数。 |
|
|
N |
正整数 >0 |
10 |
|
|
|
N |
正整数。8的倍数 |
dim/2 向上取整到8 |
产品量化后向量的维度。当为0时,使用启发式方法选择此值。 |
|
|
N |
正整数 [4-8] |
8 |
量化后向量元素的位长度。 |
|
|
N |
[ |
|
码本类型。更多详情请参见 IVF-PQ 索引概述 |
|
|
N |
正整数 >0 |
min(2*dim, nlist) |
为每个查询向量搜索的最接近的聚类数量。较大的值将提高召回率,但会在索引中搜索更多的点。 |
|
|
N |
[ |
|
用于距离计算的精度。较低的精度可以提高性能,但会牺牲准确性。 |
|
|
N |
[ |
|
用于共享内存中查找表的精度。较低的精度可以提高性能,但会牺牲准确性。 |
|
|
N |
正整数 >0 |
2 |
最初从索引中查询 |
或者,如果 graph_build_algo == "NN_DESCENT",那么我们可以自定义以下参数
参数 |
类型 |
是否必需 |
数据类型 |
默认值 |
描述 |
|
|
N |
正整数 >0 |
20 |
nn-descent 迭代次数 |
`nn_descent_intermediate_graph_degree |
|
N |
正整数 >0 |
|
在nn-descent迭代期间的中间图度数 |
nn_descent_termination_threshold |
|
N |
正浮点数 >0 |
1e-4 |
nn-descent 收敛的早期停止阈值 |
cuvs_cagra_hnswlib#
这是一个基准测试,旨在实现CAGRA构建的HNSW搜索之间的互操作性。它使用CAGRA构建的图作为hnswlib索引的基础层,仅在基础层内搜索查询(这是通过对hnswlib进行简单补丁实现的)。
build : 与CAGRA的build相同
search : 与 Hnswlib 的 search 相同
FAISS 索引#
faiss_gpu_flat#
在GPU上使用FAISS平面索引,它通过暴力搜索执行精确搜索,并且没有任何进一步的构建或搜索参数。
faiss_gpu_ivf_flat#
IVF-flat 使用倒排文件索引,将向量分割成一系列簇或列表,并以交错格式存储,这种格式优化了快速距离计算。IVF-flat 索引的搜索将索引中的总向量减少到用户指定的最近簇(称为探针)内的向量。
IVF-flat 是一种简单的算法,它不会节省任何空间,但在较高的召回率下仍能提供有竞争力的搜索时间。
参数 |
类型 |
是否必需 |
数据类型 |
默认值 |
描述 |
|
|
Y |
正整数 >0 |
将向量分成的簇的数量。较大的值会使每个簇中的点更少,但这会影响索引构建时间,因为需要训练更多的簇 |
|
|
|
N |
正整数 >0 |
2 |
|
|
|
Y |
正整数 >0 |
为每个查询向量搜索的最接近的簇数。较大的值将提高召回率,但会在索引中搜索更多的点。 |
faiss_gpu_ivf_pq#
IVF-pq 是一种倒排文件索引,它将向量分割成一系列簇或列表,类似于上述的 IVF-flat。不同之处在于,IVF-PQ 使用乘积量化来压缩向量,从而使索引的内存占用更小。不幸的是,更高的压缩级别也可能降低召回率,但当原始向量仍然可用时,可以通过细化步骤来改善召回率。
参数 |
类型 |
是否必需 |
数据类型 |
默认值 |
描述 |
|
|
Y |
正整数 >0 |
将向量分成的簇的数量。较大的值会使每个簇中的点更少,但这会影响索引构建时间,因为需要训练更多的簇。 |
|
|
|
N |
正整数 >0 |
2 |
|
|
|
Y |
正整数。2的幂 [8-64] |
每个向量的块数或子量化器数量的比率。由 |
|
|
|
N |
Boolean |
|
使用预计算的查找表来加速搜索,但会增加内存使用。 |
|
|
N |
Boolean |
|
在聚类步骤中使用半精度浮点数。 |
|
|
Y |
正整数 >0 |
为每个查询向量搜索的最接近的簇数。较大的值将提高召回率,但会在索引中搜索更多的点。 |
|
|
|
N |
正数 >=1 |
1 |
最初从索引中查询 |
faiss_cpu_flat#
在CPU上使用FAISS平面索引,它通过暴力搜索执行精确搜索,并且没有任何进一步的构建或搜索参数。
参数 |
类型 |
是否必需 |
数据类型 |
默认值 |
描述 |
|
|
N |
正整数 >0 |
1 |
用于查询的线程数。 |
faiss_cpu_ivf_flat#
在CPU上使用FAISS IVF-Flat索引
参数 |
类型 |
是否必需 |
数据类型 |
默认值 |
描述 |
|
|
Y |
正整数 >0 |
将向量分成的簇的数量。较大的值会使每个簇中的点更少,但这会影响索引构建时间,因为需要训练更多的簇 |
|
|
|
N |
正整数 >0 |
2 |
|
|
|
Y |
正整数 >0 |
为每个查询向量搜索的最接近的簇数。较大的值将提高召回率,但会在索引中搜索更多的点。 |
|
|
|
N |
正整数 >0 |
1 |
用于查询的线程数。 |
faiss_cpu_ivf_pq#
在CPU上使用FAISS IVF-PQ索引
参数 |
类型 |
是否必需 |
数据类型 |
默认值 |
描述 |
|
|
Y |
正整数 >0 |
将向量分成的簇的数量。较大的值会使每个簇中的点更少,但这会影响索引构建时间,因为需要训练更多的簇。 |
|
|
|
N |
正整数 >0 |
2 |
|
|
|
Y |
正整数。2的幂 [8-64] |
每个向量的块或子量化器数量的比率。由 |
|
|
|
N |
Boolean |
|
使用预计算的查找表来加速搜索,但会增加内存使用。 |
|
|
N |
正整数 [4-8] |
8 |
表示每个量化代码的位数。 |
|
|
Y |
正整数 >0 |
为每个查询向量搜索的最接近的簇数。较大的值将提高召回率,但会在索引中搜索更多的点。 |
|
|
|
N |
正数 >=1 |
1 |
最初从索引中查询 |
|
|
N |
正整数 >0 |
1 |
用于查询的线程数。 |
HNSW#
hnswlib#
参数 |
类型 |
是否必需 |
数据类型 |
默认值 |
描述 |
|
|
Y |
正整数 >0 |
控制索引时间和准确性。较大的值会增加索引质量。在某个点之后,增加此值将不再提高质量。 |
|
|
|
Y |
正整数。通常在2-100之间 |
在构建过程中为每个新元素创建的双向链接数量。较高的值适用于较高的内在维度和/或高召回率,较低的值适用于具有较低内在维度和/或低召回率的数据集。也会影响算法的内存消耗。 |
|
|
|
N |
正整数 >0 |
1 |
用于构建索引的线程数。 |
|
|
Y |
正整数 >0 |
用于搜索的最近邻动态列表的大小。值越高,搜索越准确但速度越慢。不能低于 |
|
|
|
N |
正整数 >0 |
1 |
用于查询的线程数。 |
请参考HNSW算法参数指南来自hnswlib以了解更多关于这些参数的信息。