Milvus 向量索引
Milvus 支持多种类型的向量索引(内存索引),索引使用近似最近邻搜索 (ANNS) 算法。每个向量字段仅支持一种索引类型,在切换索引类型时会自动删除旧索引。
ANNS 向量索引类型
- Tree-based index 基于树的索引
- Graph-based index 基于图的索引
- Hash-based index 基于哈希的索引
- Quantization-based index 基于量化的索引
基于 CPU 的 ANN 搜索:FLAT、IVF_FLAT、IVF_PQ、IVF_SQ8、HNSW 和 SCANN(beta) 基于 GPU 的 ANN 搜索:GPU_IVF_FLAT 和 GPU_IVF_PQ
索引 | 类型 | 适合场景 |
---|---|---|
FLAT | N/A | 数据集相对较小 ,需要 100% 的召回率 |
IVF_FLAT/GPU_IVF_FLAT | 量化 | 高速查询 ,要求召回率尽可能高 |
IVF_SQ8 | 量化 | 高速查询 ,有限的内存资源 ,接受召回率的微小妥协 |
IVF_PQ/GPU_IVF_PQ | 量化 | 非常高速的查询 ,有限的内存资源 ,接受召回率的大幅妥协 |
HNSW | 哈希 | 非常高速的查询 ,要求尽可能高的召回率 ,大内存资源 |
SCANN | 量化 | 非常高速的查询 ,要求尽可能高的召回率 ,大内存资源 |
FLAT
对于需要完美精度并依赖于相对较小 (百万级 )数据集的矢量相似性搜索应用程序 ,FLAT 索引是一个不错的选择。 FLAT不压缩向量,是唯一能保证精确搜索结果的索引。
FLAT 的结果还可用作召回率低于 100% 的其他索引产生的结果的比较点。
FLAT 是准确的,因为它采用详尽的搜索方法,这意味着对于每个查询,目标输入都会与数据集中的每组向量进行比较 。这使得 FLAT 成为最慢的索引,并且不太适合查询大量矢量数据。
Milvus 中 FLAT 索引不需要任何参数 ,使用它不需要数据训练。
IVF_FLAT/GPU_IVF_FLAT
IVF_FLAT将向量数据划分为 nlist 簇单元 (聚类 ),然后比较目标输入向量与每个簇中心之间的距离。根据系统设置要查询的簇数 (nprobe),仅根据目标输入与最相似簇中向量之间的比较返回相似性搜索结果,从而大大减少查询时间。
通过调整 nprobe,可以在给定场景下找到精度和速度之间的理想平衡。 IVF_FLAT 性能测试的结果表明,随着目标输入向量 (nq) 数量和要搜索的簇数量 (nprobe) 的增加 ,查询时间急剧增加。 IVF_FLAT 是最基本的 IVF 索引,每个单元存储的编码数据与原始数据一致。
构建索引参数:
- nlist: 聚类簇的数量,范围1~65536,默认128
搜索索引参数:
- nprobe: 检索簇的数量,范围1~nlist ,默认8
- top-K: 检索的向量数,<256
IVF_SQ8
IVF_FLAT 不执行任何压缩,因此它生成的索引文件与原始的原始非索引矢量数据的大小大致相同。
例如,如果原始 1B SIFT 数据集为 476 GB ,则其 IVF_FLAT 索引文件会稍小(约 470 GB )。将所有索引文件加载到内存中将消耗 470 GB 的存储空间。当磁盘、CPU 或 GPU 内存资源有限时 ,IVF_SQ8 是比 IVF_FLAT 更好的选择。
该索引类型可以通过执行标量量化 (SQ )将每个 FLOAT (4 字节 )转换为 UINT8 (1 字节 )。这可将磁盘、CPU 和 GPU 内存消耗减少 70-75%。
对于 1B SIFT 数据集 ,IVF_SQ8 索引文件仅需要 140 GB 存储空间。
参数 :nlist、nprobe
IVF_PQ/GPU_IVF_PQ
PQ(Product Quantization )将原始高维向量空间统一分解为 m 个低维向量空间的笛卡尔积,然后对分解后的低维向量空间进行量化。
乘积量化不再计算目标向量与所有单元中心的距离,而是计算目标向量与各个低维空间的聚类中心的距离,大大降低了算法的时间复杂度和空间复杂度。
IVF_PQ 在量化向量的乘积之前执行 IVF 索引聚类。它的索引文件甚至比 IVF_SQ8 还要小,但也会导致搜索向量时精度的损失。
构建索引参数:
- nlist
- m: 乘积量化因子数,dim mod m ==0
- nbits: 可选,存储每个低维向量的位数。[1, 16] (8 by default)
搜索参数:
- nprobe
SCANN
SCANN(分数感知量化损失)在向量聚类和乘积量化方面与 IVF_PQ 类似。它们的不同之处在于乘积量化的实现细节以及使用SIMD (单指令/多数据 )进行高效计算。
构建索引参数:
- nlist
- with_raw_data: 是否将原始数据包含在索引中,默认 True
检索参数:
- nprobe
- reorder_k: 待查询候选单位数量,范围 [top_k , ∞]
- radius: 要查询的单位数,范围 [1, nlist]
- range_filter: 要查询的候选单元数,范围 [top_k , ∞]
HNSW
HNSW(Hierarchical Navigable Small World Graph)是一种基于图的索引算法。它根据一定的规则为图像构建了一个多层导航结构。在这种结构中,上层更稀疏,节点之间的距离更远;越低的层越密集,节点之间的距离越近。搜索从最上层开始,找到该层中最靠近目标的节点,然后进入下一层开始另一次搜索。经过多次迭代,它可以快速接近目标位置。
为了提高性能,HNSW 将图形每层上节点的最大次数限制为 M。此外可以使用 efConstruction(构建索引时 )或ef(搜索目标时 )来指定搜索范围。
构建索引参数:
- m: 节点的最大值,范围(2, 2048)
- efConstruction: 搜索范围,范围 (1, int_max)
检索参数:
- ef: 搜索范围,范围 (1, int_max)