GPU 索引
Milvus 支持多种 GPU 索引类型来加速搜索性能和效率,特别是在高吞吐量和高召回率的场景中。本主题提供了 Milvus 支持的 GPU 索引类型概述、它们的适用场景和性能特征。有关使用 GPU 构建索引的信息,请参考使用 GPU 构建索引。
需要注意的是,使用 GPU 索引不一定会降低延迟。如果您想要充分发挥吞吐量,您需要极高的请求压力或大量的查询向量。
Milvus 的 GPU 支持由 Nvidia RAPIDS 团队贡献。以下是 Milvus 目前支持的 GPU 索引类型。
GPU_CAGRA
GPU_CAGRA 是一个针对 GPU 优化的基于图的索引。使用推理级 GPU 运行 Milvus 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"
:缓存原始数据集以通过优化搜索结果来提高召回率。
"false"
:不缓存原始数据集以节省 GPU 内存。"false"
adapt_for_cpu
决定是否使用 GPU 进行索引构建和 CPU 进行搜索。
将此参数设置为true
需要在搜索请求中包含ef
参数。"false"
-
搜索参数
参数 描述 默认值 itopk_size
确定搜索过程中保留的中间结果的大小。较大的值可能会以搜索性能为代价提高召回率。它应该至少等于最终的 top-k(limit)值,通常是 2 的幂(例如,16、32、64、128)。 空 search_width
指定搜索过程中进入 CAGRA 图的入口点数量。增加此值可以提高召回率,但可能会影响搜索性能(例如 1、2、4、8、16、32)。 空 min_iterations
/max_iterations
控制搜索迭代过程。默认情况下,它们设置为 0
,CAGRA 会根据itopk_size
和search_width
自动确定迭代次数。手动调整这些值可以帮助平衡性能和准确性。0
team_size
指定用于在 GPU 上计算度量距离的 CUDA 线程数。常见值是最大为 32 的 2 的幂(例如 2、4、8、16、32)。它对搜索性能的影响很小。默认值为 0
,此时 Milvus 会根据向量维度自动选择team_size
。0
ef
指定查询时间/准确性的权衡。较高的 ef
值会导致更准确但更慢的搜索。
如果在构建索引时将adapt_for_cpu
设置为true
,则此参数是必需的。[top_k, int_max]
-
搜索限制
参数 范围 limit
(top-K)<= 1024 limit
(top-K)<=max((itopk_size + 31)// 32, search_width) * 32
GPU_IVF_FLAT
与 IVF_FLAT 类似,GPU_IVF_FLAT 也将向量数据分为 nlist
个聚类单元,然后比较目标输入向量与每个聚类中心之间的距离。根据系统设置要查询的聚类数量(nprobe
),相似度搜索结果仅基于目标输入与最相似聚类中的向量之间的比较返回 — 大大减少了查询时间。
通过调整 nprobe
,可以为给定场景找到准确性和速度之间的理想平衡。IVF_FLAT 性能测试的结果表明,随着目标输入向量数量(nq
)和要搜索的聚类数量(nprobe
)的增加,查询时间会急剧增加。
GPU_IVF_FLAT 是最基本的 IVF 索引,存储在每个单元中的编码数据与原始数据一致。
进行搜索时,请注意对于任何针对 GPU_IVF_FLAT 索引的集合的搜索,top-K 最多可以设置为 256。
-
索引构建参数
参数 描述 范围 默认值 nlist
聚类单元数量 [1, 65536] 128
cache_dataset_on_device
决定是否在 GPU 内存中缓存原始数据集。可能的值: "true"
:缓存原始数据集以通过优化搜索结果来提高召回率。
"false"
:不缓存原始数据集以节省 GPU 内存。"true"
"false"
"false"
-
搜索参数
-
常规搜索
参数 描述 范围 默认值 nprobe
要查询的单元数量 [1, nlist] 8
-
-
搜索限制
参数 范围 limit
(top-K)<= 2048
GPU_IVF_PQ
PQ
(乘积量化)将原始高维向量空间均匀分解为 m
个低维向量空间的笛卡尔积,然后对分解的低维向量空间进行量化。乘积量化不是计算目标向量与所有单元中心之间的距离,而是能够计算目标向量与每个低维空间聚类中心之间的距离,大大降低了算法的时间复杂度和空间复杂度。
IVF_PQ 在量化向量的乘积之前执行 IVF 索引聚类。其索引文件甚至比 IVF_SQ8 更小,但在搜索向量时也会造成准确性损失。
索引构建参数和搜索参数因 Milvus 发行版而异。请先选择您的 Milvus 发行版。
进行搜索时,请注意对于任何针对 GPU_IVF_FLAT 索引的集合的搜索,top-K 最多可以设置为 8192。
-
索引构建参数
参数 描述 范围 默认值 nlist
聚类单元数量 [1, 65536] 128
m
乘积量化的因子数量 dim mod m == 0
0
nbits
[可选] 存储每个低维向量的位数 [1, 16] 8
cache_dataset_on_device
决定是否在 GPU 内存中缓存原始数据集。可能的值: "true"
:缓存原始数据集以通过优化搜索结果来提高召回率。
"false"
:不缓存原始数据集以节省 GPU 内存。"true"
"false"
"false"
-
搜索参数
-
常规搜索
参数 描述 范围 默认值 nprobe
要查询的单元数量 [1, nlist] 8
-
-
搜索限制
参数 范围 limit
(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:使用较小的内存占用,具体取决于压缩参数设置。