本指南概述了 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 flat 索引,该索引使用暴力搜索执行精确搜索,并且没有额外的构建或搜索参数。
faiss_gpu_ivf_flat#
IVF-flat 使用倒排文件索引,将矢量划分为一系列聚类或列表,并以交错格式存储,该格式针对快速距离计算进行了优化。IVF-flat 索引的搜索将索引中的总矢量减少到用户指定的最近聚类(称为探针)内的矢量。
IVF-flat 是一种简单的算法,不会节省空间,但即使在较高的召回率水平下也能提供具有竞争力的搜索时间。
参数 |
类型 |
必需 |
数据类型 |
默认值 |
描述 |
|
|
是 |
正整数 >0 |
将矢量划分为的聚类数量。值越大,每个聚类中的点越少,但这会影响索引构建时间,因为需要训练更多聚类 |
|
|
|
N |
正整数 >0 |
2 |
` |
|
|
是 |
正整数 >0 |
对每个查询矢量进行搜索的最近聚类数量。值越大,召回率越高,但会在索引中搜索更多点。 |
faiss_gpu_ivf_pq#
IVF-pq 是一种倒排文件索引,它将矢量划分为一系列聚类或列表,方式与上面的 IVF-flat 类似。不同之处在于 IVF-PQ 还使用乘积量化来压缩矢量,从而减小索引的内存占用。不幸的是,较高的压缩级别也会降低召回率,但在原始矢量仍然可用时,精炼步骤可以改善召回率。
参数 |
类型 |
必需 |
数据类型 |
默认值 |
描述 |
|
|
是 |
正整数 >0 |
将矢量划分为的聚类数量。值越大,每个聚类中的点越少,但这会影响索引构建时间,因为需要训练更多聚类。 |
|
|
|
N |
正整数 >0 |
2 |
` |
|
|
是 |
正整数。2 的幂 [8-64] |
每个矢量的块或子量化器数量的比例。通过 ` |
|
|
|
N |
布尔值 |
|
使用预计算的查找表来加速搜索,代价是增加内存使用。 |
|
|
N |
布尔值 |
|
在聚类步骤中使用半精度浮点数。 |
|
|
是 |
正整数 >0 |
对每个查询矢量进行搜索的最近聚类数量。值越大,召回率越高,但会在索引中搜索更多点。 |
|
|
|
N |
正数 >=1 |
1 |
最初从索引中查询 ` |
faiss_cpu_flat#
在 CPU 上使用 FAISS flat 索引,该索引使用暴力搜索执行精确搜索,并且没有额外的构建或搜索参数。
参数 |
类型 |
必需 |
数据类型 |
默认值 |
描述 |
|
|
N |
正整数 >0 |
1 |
用于查询的线程数。 |
faiss_cpu_ivf_flat#
在 CPU 上使用 FAISS IVF-Flat 索引
参数 |
类型 |
必需 |
数据类型 |
默认值 |
描述 |
|
|
是 |
正整数 >0 |
将矢量划分为的聚类数量。值越大,每个聚类中的点越少,但这会影响索引构建时间,因为需要训练更多聚类 |
|
|
|
N |
正整数 >0 |
2 |
` |
|
|
是 |
正整数 >0 |
对每个查询矢量进行搜索的最近聚类数量。值越大,召回率越高,但会在索引中搜索更多点。 |
|
|
|
N |
正整数 >0 |
1 |
用于查询的线程数。 |
faiss_cpu_ivf_pq#
在 CPU 上使用 FAISS IVF-PQ 索引
参数 |
类型 |
必需 |
数据类型 |
默认值 |
描述 |
|
|
是 |
正整数 >0 |
将矢量划分为的聚类数量。值越大,每个聚类中的点越少,但这会影响索引构建时间,因为需要训练更多聚类。 |
|
|
|
N |
正整数 >0 |
2 |
` |
|
|
是 |
正整数。2 的幂 [8-64] |
每个矢量的块或子量化器数量的比例。通过 ` |
|
|
|
N |
布尔值 |
|
使用预计算的查找表来加速搜索,代价是增加内存使用。 |
|
|
N |
正整数 [4-8] |
8 |
表示每个量化码的位数。 |
|
|
是 |
正整数 >0 |
对每个查询矢量进行搜索的最近聚类数量。值越大,召回率越高,但会在索引中搜索更多点。 |
|
|
|
N |
正数 >=1 |
1 |
最初从索引中查询 ` |
|
|
N |
正整数 >0 |
1 |
用于查询的线程数。 |
HNSW#
hnswlib#
参数 |
类型 |
必需 |
数据类型 |
默认值 |
描述 |
|
|
是 |
正整数 >0 |
控制索引时间和准确性。值越大,索引质量越高。在某个点之后,增加此值将不再提高质量。 |
|
|
|
是 |
正整数。通常在 2-100 之间 |
构建期间为每个新元素创建的双向链接数量。较高的值适用于较高的内在维度和/或高召回率,较低的值适用于内在维度较低和/或低召回率的数据集。也影响算法的内存消耗。 |
|
|
|
N |
正整数 >0 |
1 |
用于构建索引的线程数。 |
|
|
是 |
正整数 >0 |
用于搜索的最近邻居动态列表的大小。值越高,搜索越准确但越慢。不能低于 ` |
|
|
|
N |
正整数 >0 |
1 |
用于查询的线程数。 |
请参阅 hnswlib 的 HNSW 算法参数指南,了解有关这些参数的更多信息。