GPU 索引
Milvus 支持多种 GPU 索引类型,以加速搜索性能和效率,尤其适用于高吞吐量、低延迟和高召回率的场景。本主题概述了 Milvus 支持的 GPU 索引类型,它们适用的用例以及性能特点。有关使用 GPU 构建索引的信息,请参考 使用 GPU 建立索引。
GPU 加速可以显著提高 Milvus 的搜索性能和效率,尤其是对于高吞吐量、低延迟和高召回率的场景,并且对于大规模 nq 批量搜索场景也非常友好。
Milvus 的 GPU 支持是由 Nvidia 的 RAPIDS (opens in a new tab) 团队提供的。以下是目前由 Milvus 支持的 GPU 索引类型。
GPU_CAGRA
GPU_CAGRA 是一种针对 GPU 进行优化的基于图的索引,在推理 GPU 上表现良好。它最适合查询数量较少、使用低内存频率的训练 GPU 可能无法产生最佳结果的情况。
-
构建索引参数
参数名 描述 默认值 intermediate_graph_degree
通过确定修剪之前的图的度数,影响召回率和构建时间。推荐的值为 32
或64
。128 graph_degree
通过设置修剪后的图的度数来影响搜索性能和召回率。这两个度数之间的差异越大,构建时间越长。其值必须小于 intermediate_graph_degree 的值。 64 build_algo
选择修剪之前的图生成算法。可选值: IVF_PQ :提供更高质量但更慢的构建时间。 NN_DESCENT :提供更快的构建速度,但可能会降低召回率。 IVF_PQ cache_dataset_on_device
是否将原始数据集缓存在 GPU 内存中。可选值: "true" :将原始数据集缓存到 GPU 内存中,通过改进搜索结果来提高召回率。 "false" :不将原始数据集缓存到内存中,以节省内存空间。 "false" -
搜索参数
参数名 描述 默认值 itopk_size
确定搜索过程中保留的中间结果的大小。较大的值可以提高召回率,但会影响搜索性能。它应至少等于最终的 top-k(限制)值,并且通常为 2 的幂次方(例如,16、32、64、128)。 空 search_width
指定搜索过程中进入 CAGRA 图的入口点数。增加这个值可以提高召回率,但可能会影响搜索性能。 空 min_iterations
/max_iterations
控制搜索迭代过程。默认情况下,它们被设置为 0
,CAGRA 会根据itopk_size
和search_width
自动确定迭代次数。手动调整这些值可以帮助平衡性能和准确性。0
team_size
指定在 GPU 上计算度量距离时使用的 CUDA 线程数。常见的值是 2 的幂次方,最高为 32(例如 2、4、8、16、32)。它对搜索性能影响较小。默认值为 0
,Milvus 会根据向量维度自动选择team_size
。0
GPU_IVF_FLAT
与 IVF_FLAT (opens in a new tab) 类似,GPU_IVF_FLAT 也将向量数据分成 nlist
个聚类单元,然后计算目标输入向量与每个聚类中心之间的距离。根据系统设置的查询聚类数(nprobe
),只对与目标输入向量在最相似的聚类中的向量进行比较,并返回相似度搜索结果,从而大幅减少查询时间。
通过调整 nprobe
,可以在给定场景下找到准确性和速度之间的理想平衡。IVF_FLAT 性能测试的结果 (opens in a new tab) 显示,随着目标输入向量数量(nq
)和要搜索的聚类数(nprobe
)的增加,查询时间会急剧增加。
GPU_IVF_FLAT 是最基本的 IVF 索引,每个单元中存储的编码数据与原始数据一致。
在进行搜索时,请注意你可以为任何针对 GPU_IVF_FLAT 索引的集合设置最多 256 个 top-K。
-
构建索引参数
参数名 描述 范围 默认值 nlist
聚类单元数 [1, 65536] 128 -
搜索参数
-
常规搜索
参数名 描述 范围 默认值 nprobe
要查询的单元数 [1, nlist] 8
-
-
搜索限制
参数名 范围 top-K
<= 256
GPU_IVF_PQ
PQ
(Product Quantization)将原始高维向量空间均匀分解为 m
个低维向量空间的笛卡尔积,然后对分解后的低维向量空间进行量化。相比于计算目标向量与所有单元的中心之间的距离,产品量化使得可以计算目标向量与每个低维空间的聚类中心之间的距离,大大降低了算法的时间复杂度和空间复杂度。
IVF_PQ 在量化向量的乘积之前执行了 IVF 索引聚类。它的索引文件比 IVF_SQ8 还要小,但在搜索向量时也会造成精度损失。
索引构建参数和搜索参数随着 Milvus 的发布版本而有所不同,请先选择对应的 Milvus 发布版本。
在进行搜索时,注意对于针对 GPU_IVF_FLAT 索引集合的任何搜索,可以将 top-K 设置为最多 8192。
-
索引构建参数
参数 描述 范围 默认值 nlist
聚类单元的数量 [1, 65536] 128 m
乘积量化的因子数量 dim mod m == 0
4 nbits
[可选] 每个低维向量存储的比特数 [1, 16] 8 -
搜索参数
-
普通搜索
参数 描述 范围 默认值 nprobe
查询的聚类单元数量 [1, nlist] 8
-
-
搜索限制
参数 范围 top-K
<= 1024
GPU_BRUTE_FORCE
GPU_BRUTE_FORCE 适用于极高的召回率至关重要的情况,通过将每个查询与数据集中的所有向量进行比较,可以保证召回率为 1。它只需要指定距离度量类型(metric_type
)和 top-k(limit
)作为索引构建和搜索参数。
对于 GPU_BRUTE_FORCE,不需要额外的索引构建参数或搜索参数。
结论
当前,Milvus 将所有索引加载到 GPU 内存中以进行高效的搜索操作。可以加载的数据量取决于 GPU 内存的大小:
- GPU_CAGRA:内存使用量大约是原始向量数据的 1.8 倍。
- GPU_IVF_FLAT 和 GPU_BRUTE_FORCE:需要和原始数据大小相等的内存。
- GPU_IVF_PQ:利用较小的内存占用,具体取决于压缩参数的设置。