本指南概述了可以在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_typeinternal_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]。

参数

类型

是否必需

数据类型

默认值

描述

ivf_pq_build_nlist

build

N

正整数 >0

sqrt(n_vecs)

将向量分成的簇的数量。较大的值会使每个簇中的点更少,但这会影响索引构建时间,因为需要训练更多的簇。

ivf_pq_build_niter

build

N

正整数 >0

25

训练聚类时使用的k-means迭代次数。

ivf_pq_build_ratio

build

N

正整数 >0

10

1/ratio 是用于训练聚类的训练点数。

ivf_pq_pq_dim

build

N

正整数。8的倍数

dim/2 向上取整到8

产品量化后向量的维度。当为0时,使用启发式方法选择此值。pq_dim * pq_bits 必须是8的倍数。

ivf_pq_build_pq_bits

build

N

正整数 [4-8]

8

量化后向量元素的位长度。

ivf_pq_build_codebook_kind

build

N

[cluster, subspace]

subspace

码本类型。更多详情请参见 IVF-PQ 索引概述

ivf_pq_build_nprobe

search

N

正整数 >0

min(2*dim, nlist)

为每个查询向量搜索的最接近的聚类数量。较大的值将提高召回率,但会在索引中搜索更多的点。

ivf_pq_build_internalDistanceDtype

search

N

[float, half]

half

用于距离计算的精度。较低的精度可以提高性能,但会牺牲准确性。

ivf_pq_build_smemLutDtype

search

N

[float, half, fp8]

fp8

用于共享内存中查找表的精度。较低的精度可以提高性能,但会牺牲准确性。

ivf_pq_build_refine_ratio

search

N

正整数 >0

2

最初从索引中查询 refine_ratio * k 个最近邻居,并通过仅选择最佳的 k 个邻居来改进召回率。

或者,如果 graph_build_algo == "NN_DESCENT",那么我们可以自定义以下参数

参数

类型

是否必需

数据类型

默认值

描述

nn_descent_niter

build

N

正整数 >0

20

nn-descent 迭代次数

`nn_descent_intermediate_graph_degree

build

N

正整数 >0

cagra.intermediate_graph_degree * 1.5

在nn-descent迭代期间的中间图度数

nn_descent_termination_threshold

build

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 是一种简单的算法,它不会节省任何空间,但在较高的召回率下仍能提供有竞争力的搜索时间。

参数

类型

是否必需

数据类型

默认值

描述

nlists

build

Y

正整数 >0

将向量分成的簇的数量。较大的值会使每个簇中的点更少,但这会影响索引构建时间,因为需要训练更多的簇

ratio

build

N

正整数 >0

2

1/ratio 是用于训练聚类的训练点的数量。

nprobe

search

Y

正整数 >0

为每个查询向量搜索的最接近的簇数。较大的值将提高召回率,但会在索引中搜索更多的点。

faiss_gpu_ivf_pq#

IVF-pq 是一种倒排文件索引,它将向量分割成一系列簇或列表,类似于上述的 IVF-flat。不同之处在于,IVF-PQ 使用乘积量化来压缩向量,从而使索引的内存占用更小。不幸的是,更高的压缩级别也可能降低召回率,但当原始向量仍然可用时,可以通过细化步骤来改善召回率。

参数

类型

是否必需

数据类型

默认值

描述

nlist

build

Y

正整数 >0

将向量分成的簇的数量。较大的值会使每个簇中的点更少,但这会影响索引构建时间,因为需要训练更多的簇。

ratio

build

N

正整数 >0

2

1/ratio 是应该用于训练集群的训练点的数量。

M_ratio

build

Y

正整数。2的幂 [8-64]

每个向量的块数或子量化器数量的比率。由 dims / M_ratio 计算得出

usePrecomputed

build

N

Boolean

false

使用预计算的查找表来加速搜索,但会增加内存使用。

useFloat16

build

N

Boolean

false

在聚类步骤中使用半精度浮点数。

nprobe

search

Y

正整数 >0

为每个查询向量搜索的最接近的簇数。较大的值将提高召回率,但会在索引中搜索更多的点。

refine_ratio

search

N

正数 >=1

1

最初从索引中查询 refine_ratio * k 个最近邻居,并通过仅选择最佳的 k 个邻居来提高召回率。

faiss_cpu_flat#

在CPU上使用FAISS平面索引,它通过暴力搜索执行精确搜索,并且没有任何进一步的构建或搜索参数。

参数

类型

是否必需

数据类型

默认值

描述

numThreads

search

N

正整数 >0

1

用于查询的线程数。

faiss_cpu_ivf_flat#

在CPU上使用FAISS IVF-Flat索引

参数

类型

是否必需

数据类型

默认值

描述

nlists

build

Y

正整数 >0

将向量分成的簇的数量。较大的值会使每个簇中的点更少,但这会影响索引构建时间,因为需要训练更多的簇

ratio

build

N

正整数 >0

2

1/ratio 是应该用于训练集群的训练点的数量。

nprobe

search

Y

正整数 >0

为每个查询向量搜索的最接近的簇数。较大的值将提高召回率,但会在索引中搜索更多的点。

numThreads

search

N

正整数 >0

1

用于查询的线程数。

faiss_cpu_ivf_pq#

在CPU上使用FAISS IVF-PQ索引

参数

类型

是否必需

数据类型

默认值

描述

nlist

build

Y

正整数 >0

将向量分成的簇的数量。较大的值会使每个簇中的点更少,但这会影响索引构建时间,因为需要训练更多的簇。

ratio

build

N

正整数 >0

2

1/ratio 是应该用于训练集群的训练点的数量。

M

build

Y

正整数。2的幂 [8-64]

每个向量的块或子量化器数量的比率。由 dims / M_ratio 计算得出

usePrecomputed

build

N

Boolean

false

使用预计算的查找表来加速搜索,但会增加内存使用。

bitsPerCode

build

N

正整数 [4-8]

8

表示每个量化代码的位数。

nprobe

search

Y

正整数 >0

为每个查询向量搜索的最接近的簇数。较大的值将提高召回率,但会在索引中搜索更多的点。

refine_ratio

search

N

正数 >=1

1

最初从索引中查询 refine_ratio * k 个最近邻居,并通过仅选择最佳的 k 个邻居来提高召回率。

numThreads

search

N

正整数 >0

1

用于查询的线程数。

HNSW#

hnswlib#

参数

类型

是否必需

数据类型

默认值

描述

efConstruction

build

Y

正整数 >0

控制索引时间和准确性。较大的值会增加索引质量。在某个点之后,增加此值将不再提高质量。

M

build

Y

正整数。通常在2-100之间

在构建过程中为每个新元素创建的双向链接数量。较高的值适用于较高的内在维度和/或高召回率,较低的值适用于具有较低内在维度和/或低召回率的数据集。也会影响算法的内存消耗。

numThreads

build

N

正整数 >0

1

用于构建索引的线程数。

ef

search

Y

正整数 >0

用于搜索的最近邻动态列表的大小。值越高,搜索越准确但速度越慢。不能低于 k

numThreads

search

N

正整数 >0

1

用于查询的线程数。

请参考HNSW算法参数指南来自hnswlib以了解更多关于这些参数的信息。