Milvus的内存索引

简介:

这篇文章主要介绍milvus支持的各种内存索引,以及它们最适用的场景,还有用户为了获得更好的搜索性能可以配置的参数。

索引是有效组织数据的过程,它的主要角色是在大的数据集中显著的加速耗时的查询从而有效的进行相似搜索。

当前,一个向量字段只支持一种索引类型,milvus会在选择了新的索引类型之后自动删除老的索引。

ANNS向量索引

milvus支持的大部分向量索引类型都使用近似临近搜索算法(ANNS)。相比于精确检索,它非常的耗时,ANNS的核心思想不再局限于返回最准确的结果,而是搜索目标的邻居。ANNS以牺牲可接受范围内的准确率来提高检索速度。

根据实现方式的不同,ANNS向量索引可以分成四种类型:

  • 基于树的索引
  • 基于图的索引
  • 基于哈希的索引
  • 基于量化的索引

milvus支持的索引类型

根据适用的数据类型,milvus支持的索引可以分为两类:

  • embedding为浮点数的索引
    • 维度等于128的浮点数embedding,存储它们需要占用 128 * 浮点数大小 = 512 字节。浮点数embedding的距离度量方法有:欧几里得距离(L2)和内积
    • 这些类型的索引包括:FLAT,IVF,IVF_FLAT,IVF_PQ,IVF_SQ8,和SCANN(基于CPU的ANN搜索)
  • embedding为二进制的索引
    • 维度等于128的二进制embedding,存储它们需要占用128/8 = 16字节。二进制embedding的距离度量方法有:Jaccard 和 Hamming
    • 这些类型的索引包括:BIN_FLAT 和 BIN_IVF_FLAT
  • embedding为稀疏的索引
    • 稀疏embedding支持的距离度量方法只有IP(内积 Inner product)
    • 这些类型的索引包括:SPARSE_INVERTED_INDEX和SPARSE_WAND

下面的表格列举了milvus支持的索引分类:

floating-point embeddings

binary embeddings

sparse embeddings

FLAT

针对要求最佳的准确率和相对比较小的数据集(百万级)的向量相似搜索应用,FLAT索引是比较好的选择。FLAT没有压缩向量,并且是唯一可以担保精确搜索结果的索引。FLAT索引返回的结果可以用来与那些召回率小于100%的索引类型进行对比。

FLAT如此精确是因为它做了全匹配,也就是它会将每个查询的输入值与数据集里面的每条数据做比较。这也就导致了FLAT是我们支持的最慢的索引,同时也不适合查询海量的向量数据。milvus里面对于FLAT没有必填的参数,并且使用它也不需要做数据训练。

查询参数

ParameterDescriptionRange
metric_type[Optional] The chosen distance metric.Euclidean distance (L2)
Inner product (IP)
Cosine similarity (COSINE)

IVF_FLAT

IVF_FLAT将向量数据分成 nlist 个聚类单元,然后比较目标输入向量与每个聚类中心的距离。依赖系统设置为查询(nprobe)的聚类大小,相似搜索结果的返回只基于比较目标输入与最相似的聚类的向量,从而显著的降低查询时间。

通过适配nprobe,对于特定的场景可以找到准确率与速度之间的完美平衡。根据IVF_FLAT性能测试报告,随着目标输入向量(nq)和要搜索的聚类数量(nprobe)的增加,查询时间急剧增加。

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

索引构建参数

查询参数

IVF_SQ8

IVF_FLAT没有进行任何的压缩,所以它产生的索引文件和原始没有索引的向量数据大小差不多。例如 1B的SIFT原始数据集的大小是476GB,它的IVF_FLAT索引文件稍微小一点点(470GB)。加载所有的索引文件到内存将会占用470GB的存储。

当磁盘、CPU或者GPU内存大小受限的时候,IVF_SQ8是比IVF_FLAT更好的选择。此索引类型通过执行标量量化(Scalar Quantization)将会把每个浮点数(4字节)转换为无符号的整数(1字节) 。这就会降低70~75%的磁盘、CPU和GPU内存占用。对于1B的SIFT数据集,IVF_SQ8索引文件只需要140GB的存储。

索引构建参数:

ParameterDescriptionRange
nlistNumber of cluster units[1, 65536]

查询参数:

IVF_PQ

PQ(Product Quantization) 将原始高维度的向量空间分解为 m 个低维度向量空间的笛卡尔乘积,然后再量化这些分解之后的低维度向量空间。不再计算目标向量和所有单元中心的距离,PQ计算目标向量和每个低维度空间的聚类中心的距离,这样将会极大的降低算法的时间复杂度和空间复杂度。

IVF_PQ在量化向量的积之前执行IVF索引聚类,它的索引文件比IVF_SQ8还要小,但是同时也在搜索向量的时候降低了准确率。

索引构建参数:

ParameterDescriptionRange
nlistNumber of cluster units[1, 65536]
mNumber of factors of product quantizationdim mod m == 0
nbits[Optional] Number of bits in which each low-dimensional vector is stored.[1, 16] (8 by default)

查询参数:

SCANN

SCANN (Score-aware quantization loss)在向量聚类和乘积量化方面和IVF_PQ很像。它们不同的地方在于乘积量化的实现细节和使用SIMD (Single-Instruction / Multi-data)进行有效计算方面。

索引构建参数:

ParameterDescriptionRange
nlistNumber of cluster units[1, 65536]
with_raw_dataWhether to include the raw data in the indexTrue or False. Defaults to True.

查询参数:

HNSW

HNSW (Hierarchical Navigable Small World Graph) 是一个基于图的索引算法。它根据某种规则来为图片构建多层导航结构。在这种结构中,最上层更加稀疏且节点之间的距离更远,最下层更加稠密且节点间距离更近。搜索从最上层开始,在该层找到与目标最近的节点,然后进入下一层开始再一次查找。经过多轮迭代,它可以快速找到目标位置。

为了提高性能,HNSW限制每层节点的最大连接数为M,另外我们可以使用 efConstruction(当构建索引)或者 ef(当搜索目标)来声明搜索范围。

索引构建参数:

ParameterDescriptionRange
M

M定义图中节点最大对外连接的数量,当ef/efConstruction固定时,M越大则精度和执行时间越大

(2, 2048)
efConstruction

ef_construction控制索引搜索速度和构建速度。增加efConstruction会提高索引质量,同时也增加了索引构建时间

(1, int_max)

查询参数

ParameterDescriptionRange
ef

控制查询时间和准确率。大的ef会导致更精确但是更慢。

[1, int_max]

BIN_FLAT

它和FLAT实现原理一模一样,这里就不再介绍了,仅仅是它只能用于二进制embedding。

查询参数:

BIN_IVF_FLAT

它和IVF_FLAT实现原理一模一样,这里就不再介绍了,仅仅是它只能用于二进制embedding。

 索引构建参数

查询参数

SPARSE_INVERTED_INDEX

每个维度都维护一个向量列表,这些向量在该维度上具有非零值。在搜索过程中,Milvus遍历查询向量的每个维度,并计算在这些维度中具有非零值的向量的分数。

索引构建参数:

ParameterDescriptionRange
drop_ratio_build

在索引过程中排除小向量值的比例,该选项允许我们调整索引处理,通过在构建索引的过程中丢弃小的值来权衡效率和准确率

[0, 1]

查询参数:

ParameterDescriptionRange
drop_ratio_search

在搜索过程中丢弃小向量值的比率,此选项允许通过指定要忽略的查询向量中最小值的比率来微调搜索过程。它能平衡搜索精度和性能。设置比较小的drop_ratio_search,减少小值对最终分数的贡献。通过忽略一些小值,在稍微影响到准确率的情况下可以提高搜索性能

[0, 1]

SPARSE_WAND

此索引与SPARSE_INVERTED_INDEX有相似之处。它利用 Weak-AND算法在搜索过程中来进一步降低 全IP距离评估的数量。

基于我们的测试,SPARSE_WAND在速度方面通常优于其他方法。其性能会随着向量密度的增加而迅速恶化。为了解决这个问题,引入 非零 drop_ratio_search来显著提升性能同时只产生最小的精度损失。

索引构建参数:

ParameterDescriptionRange
drop_ratio_build

在索引过程中排除小向量值的比例,该选项允许我们调整索引处理,通过在构建索引的过程中丢弃小的值来权衡效率和准确率

[0, 1]

查询参数:

ParameterDescriptionRange
drop_ratio_search

在搜索过程中丢弃小向量值的比率,此选项允许通过指定要忽略的查询向量中最小值的比率来微调搜索过程。它能平衡搜索精度和性能。设置比较小的drop_ratio_search,减少小值对最终分数的贡献。通过忽略一些小值,在稍微影响到准确率的情况下可以提高搜索性能

  • 28
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于 Milvus,创建索引可以通过以下步骤完成: 1. 连接到 Milvus 服务器。您可以使用 Milvus Python SDK 或其他支持的客户端库来实现连接。 2. 创建一个 Collection。Collection 是存储数据的逻辑容器,可以在其中创建索引。 3. 定义 Collection 的参数,如维度(dimension),数据类型等。 4. 插入数据。将数据插入到 Collection 中,以便后续创建索引。 5. 创建索引。使用指定的算法和参数,在 Collection 上创建索引Milvus 支持多种索引类型,如索引类型(IndexType)和距离度量(MetricType)等。 下面是一个使用 Python SDK 创建索引的示例代码: ```python from milvus import Milvus, IndexType, MetricType # 连接到 Milvus 服务器 milvus = Milvus(host='localhost', port='19530') # 创建 Collection collection_name = 'your_collection' dimension = 128 # 数据维度 index_file_size = 1024 # 索引文件大小,单位为 MB param = { 'collection_name': collection_name, 'dimension': dimension, 'index_file_size': index_file_size, 'metric_type': MetricType.L2 # 指定距离度量类型 } status, _ = milvus.create_collection(param) # 插入数据 data = [[random.random() for _ in range(dimension)] for _ in range(10000)] status, ids = milvus.insert(collection_name=collection_name, records=data) # 创建索引 index_param = { 'nlist': 1024, # 索引中的桶数量 'index_type': IndexType.IVF_FLAT # 指定索引类型 } status = milvus.create_index(collection_name=collection_name, index_param=index_param) ``` 以上代码示例中,我们首先连接到 Milvus 服务器,然后创建一个 Collection,并定义相关参数。接下来,插入数据并创建索引。 请注意,上述代码仅为示例,具体的参数和逻辑应根据实际需求进行调整。另外,确保您已正确安装了 Milvus 并导入了相关的库。 希望对您有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值