跳到主要内容

GPU 索引

Milvus 支持各种 GPU 索引类型,以加速搜索性能和效率,特别是在高吞吐量、低延迟和高召回率的场景下。本主题概述了 Milvus 支持的 GPU 索引类型,它们适用的用例以及性能特征。有关使用 GPU 构建索引的信息,请参考 使用 GPU 构建索引

GPU 加速可以极大地提高 Milvus 的搜索性能和效率,特别适用于高吞吐量、低延迟和高召回率的场景,也非常适合大规模 nq 批量搜索场景。

性能

Milvus 的 GPU 支持是由 Nvidia 的 RAPIDS 团队贡献的。以下是目前由 Milvus 支持的 GPU 索引类型。

GPU_CAGRA

GPU_CAGRA 是一种针对 GPU 优化的基于图的索引,适用于推理 GPU 上表现良好的情况。它最适用于查询数量较少的情况,其中使用内存频率较低的训练 GPU 可能不会产生最佳结果。

  • 索引构建参数

    参数描述默认值
    intermediate_graph_degree通过确定修剪前图的度数来影响召回率和构建时间。推荐值为 3264128
    graph_degree通过设置修剪后图的度数来影响搜索性能和召回率。这两个度数之间的差异越大,构建时间就越长。其值必须小于 intermediate_graph_degree 的值。64
    build_algo在修剪前选择图生成算法。可能的值:IVF_PQ: 提供更高质量但构建时间较慢。NN_DESCENT: 提供更快的构建速度,但可能召回率较低。IVF_PQ

| cache_dataset_on_device | 决定是否将原始数据集缓存在 GPU 内存中。可能的取值:"true": 将原始数据集缓存在 GPU 中,以提高召回率并优化搜索结果。"false": 不将原始数据集缓存在 GPU 中,以节省内存。 | "false" |

  • 搜索参数

    参数描述默认值
    itopk_size确定搜索过程中保留的中间结果的大小。较大的值可能会提高召回率,但会影响搜索性能。它应至少等于最终 top-k(限制)值,并且通常是 2 的幂次方(例如,16、32、64、128)。
    search_width指定搜索过程中进入 CAGRA 图的入口点数。增加此值可以提高召回率,但可能会影响搜索性能。
    min_iterations / max_iterations控制搜索迭代过程。默认情况下,它们设置为 0,CAGRA 会根据 itopk_sizesearch_width 自动确定迭代次数。手动调整这些值可以帮助平衡性能和准确性。0
    team_size指定用于在 GPU 上计算度量距离的 CUDA 线程数。常见值为 2 的幂次方,最多为 32(例如 2、4、8、16、32)。它对搜索性能影响较小。默认值为 0,Milvus 会根据向量维度自动选择 team_size0

GPU_IVF_FLAT

类似于 IVF_FLAT,GPU_IVF_FLAT 也将向量数据划分为 nlist 个聚类单元,然后比较目标输入向量与每个聚类中心之间的距离。根据系统设置的查询聚类数 (nprobe),基于目标输入与最相似聚类中的向量之间的比较,返回相似性搜索结果,从而大大减少查询时间。

通过调整 nprobe,可以在特定场景中找到精度和速度之间的理想平衡。IVF_FLAT 性能测试 结果表明,随着目标输入向量数 (nq) 和搜索的聚类数 (nprobe) 的增加,查询时间急剧增加。

GPU_IVF_FLAT 是最基本的 IVF 索引,每个单元中存储的编码数据与原始数据一致。

在进行搜索时,请注意,您可以为针对 GPU_IVF_FLAT-索引集合的任何搜索设置最多 256 个前 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-索引集合的任何搜索设置最多 8192 个前 K 项。

  • 索引构建参数

    参数描述范围默认值

| 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_FLATGPU_BRUTE_FORCE:需要与原始数据大小相同的内存。
  • GPU_IVF_PQ:利用较小的内存占用空间,取决于压缩参数设置。