Milvus向量数据库-内存中索引简介

以下内容是自己在学习Milvus向量数据库时,在Milvus官方网站文档库中对索引的学习整理和翻译,通过自己和借助翻译软件进行了理解整合翻译,有可能有一些地方理解整理的不到位,还望大家理解。

一、内存中索引

本文列出了 Milvus 支持的各种类型的内存索引、每种索引最适合的场景,以及用户可以配置以实现更好的搜索性能的参数。有关磁盘上的索引,请参阅磁盘上的索引

索引是有效组织数据的过程,它通过显着加速对大型数据集的耗时查询,在使相似性搜索变得有用方面发挥着重要作用。

为了提高查询性能,您可以为每个向量字段指定索引类型。

注:

目前,向量字段仅支持一种索引类型。Milvus在切换索引类型时会自动删除旧索引。

二、ANNS向量索引

Milvus 支持的大多数向量索引类型都使用近似最近邻搜索(ANNS)算法。相较于通常非常耗时的精确检索,ANNS的核心思想不再局限于返回最准确的结果,而只搜索目标的邻居。ANNS通过在可接受的范围内牺牲精度来提高检索效率。

根据实现方法,ANNS向量指数可分为四类:

  1. 基于树的索引
  2. 基于图形的索引
  3. 基于哈希的索引
  4. 基于量化的指数

内容扩充,有关ANNS向量索引的介绍,可以参考以下链接进行查看学习:

https://cnblogs.com/guohaiwen/p/15394595.html

向量检索算法综述_向量搜索算法-CSDN博客

三、Milvus支持的索引

根据适合的数据类型,Milvus 中支持的索引可以分为两类:

浮点嵌入的索引:

对于 128 维浮点嵌入,它们占用的存储空间为 128 * float 的大小 = 512 字节。用于浮点嵌入的距离度量是欧几里得距离 (L2) 和内积。

这些类型的索引包括用于基于 CPU 的 ANN 搜索的 FLAT、IVF_FLAT、IVF_PQ、IVF_SQ8、HNSW 和 SCANN(beta),以及用于基于 GPU 的 ANN 搜索的 GPU_IVF_FLAT 和 GPU_IVF_PQ。

二进制嵌入的索引:

对于 128 维二进制嵌入,它们占用的存储空间为 128 / 8 = 16 字节。用于二进制嵌入的距离度量是 Jaccard 和 Hamming。

这种类型的索引包括 BIN_FLAT 和 BIN_IVF_FLAT。

下表对 Milvus 支持的索引进行了分类:

浮点嵌入的索引

支持的索引

分类

场景

FLAT

N/A

  1. 相对较小的数据集
  2. 要求100%的召回率

IVF_FLAT

基于量化的指数

  1. 高速查询
  2. 要求召回率尽可能高

GPU_IVF_FLAT

基于量化的指数

  1. 高速查询
  2. 要求召回率尽可能高

IVF_SQ8

基于量化的指数

  1. 高速查询
  2. 内存资源有限
  3. 接受召回率的微小妥协

IVF_PQ

基于量化的指数

  1. 超高速查询
  2. 内存资源有限
  3. 接受召回率的重大妥协

GPU_IVF_PQ

基于量化的指数

  1. 超高速查询
  2. 内存资源有限
  3. 接受召回率的重大妥协

HNSW

基于图形的索引

  1. 超高速查询
  2. 要求召回率尽可能高
  3. 大内存资源

SCANN

基于量化的指数

  1. 超高速查询
  2. 要求召回率尽可能高
  3. 大内存资源

二进制嵌入的索引

支持的索引

分类

场景

BIN_FLAT

基于量化的指数

  1. 依赖于相对较小的数据集
  2. 需要完美的准确性
  3. 不适用压缩
  4. 保证准确的搜索结果

BIN_IVF_FLAT

基于量化的指数

  1. 高速查询
  2. 要求召回率尽可能高

3.1、浮点嵌入的索引介绍

3.1.1、FLAT

对于需要完美准确性并依赖于相对较小(百万级)数据集的向量相似性搜索应用程序,FLAT索引是一个不错的选择。FLAT不压缩向量,是唯一可以保证精确搜索结果的索引。FLAT的结果也可以用作其他召回率低100%的指标产生的结果的比较点。

FLAT是准确的,因为它采用了一种详尽的搜索方法,这意味着对于每个查询,目标输入都会与数据集中的每组向量进行比较。这使得FLAT成为我们列表中最慢的索引,不适合查询大量矢量数据。Milvus中的FLAT指数不需要参数,使用它也不需要数据训练。

搜索参数

参数

描述

范围

metric_type

[可选]所选的距离指标

请参阅支持的指标

3.1.2、IVF_FLAT

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

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

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

索引构建参数

参数

描述

范围

默认值

nlist

集群单元数量

[1,65536]

128

搜索参数

参数

描述

范围

默认值

nprobe

要查询的单位数

[1,nlist]

8

3.1.3、GPU_IVF_FLAT

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

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

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

在进行搜索时,请注意,您可以将针对GPU_IVF_FLAT索引集合的任何搜索的前K值设置为256。

索引构建参数

参数

描述

范围

默认值

nlist

集群单元数量

[1,65536]

128

搜索参数

参数

描述

范围

默认值

nprobe

要查询的单位数

[1,nlist]

8

搜索限制

参数

范围

top-k

<=256

3.1.4、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

集群单元数量

[1,65536]

搜索参数

参数

描述

范围

nprobe

要查询的单位数

[1,nlist]

3.1.5、IVF_PQ

PQ(乘积量化)将原始高维向量空间均匀分解为m个低维向量空间的笛卡尔积,然后对分解后的低维矢量空间进行量化。乘积量化可以计算目标向量与每个低维空间的聚类中心之间的距离,大大降低了算法的时间复杂度和空间复杂度。

IVF_PQ在量化向量乘积之前执行IVF指数聚类。它的索引文件甚至比IVF_SQ8小,但在搜索向量时也会导致准确性下降。

注:

索引构建参数和搜索参数随Milvus分布而变化。首先选择您的Milvus发行版。

索引构建参数

参数

描述

范围

nlist

集群单元数量

[1,65536]

m

产品量化因素数量

dim mod m == 0

nbits

[可选]存储每个低维向量的位数

[1,16](默认为8)

搜索参数

参数

描述

范围

nprobe

要查询的单位数

[1,nlist]

3.1.6、SCANN

SCANN(分数感知量化损失)在向量聚类和乘积量化方面与IVF_PQ相似。它们的不同之处在于产品量化的实现细节和使用SIMD(单指令/多数据)进行高效计算。

索引构建参数

参数

描述

范围

nlist

集群单元数量

[1,65536]

with_raw_data

是否将原始数据纳入索引

True或False。默认为True

注:

与IVF_PQ不同,默认值适用于m和nbits以优化性能。

搜索参数

参数

描述

范围

nprobe

要查询的单位数

[1,nlist]

reorder_k

要查询的候选单位数

[top_k, ∞]

范围搜索参数

参数

描述

范围

radius

要查询的单位数

[1,nlist]

range_filter

要查询的候选单位数

[top_k, ∞]

3.1.7、GPU_IVF_PQ

PQ(乘积量化)将原始高维向量空间均匀分解为m个低维向量空间的笛卡尔积,然后对分解后的低维矢量空间进行量化。乘积量化可以计算目标向量与每个低维空间的聚类中心之间的距离,大大降低了算法的时间复杂度和空间复杂度。

IVF_PQ在量化向量乘积之前执行IVF指数聚类。它的索引文件甚至比IVF_SQ8小,但在搜索向量时也会导致准确性下降。

注:

索引构建参数和搜索参数随Milvus分布而变化。首先选择您的Milvus发行版。

在进行搜索时,请注意,您可以将针对GPU_IVF_FLAT索引集合的任何搜索的前K值设置为8192。

索引构建参数

参数

描述

范围

默认值

nlist

集群单元数量

[1,65536]

128

m

产品量化因素数量

dim mod m == 0

4

nbits

[可选]存储每个低维向量的位数

[1,16]

8

搜索参数

参数

描述

范围

默认值

nprobe

要查询的单位数

[1,nlist]

8

搜索限制

参数

范围

top-k

<=1024

3.1.8、HNSW

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

为了提高性能,HNSW将图形每层上的最大节点数限制为M。此外,您可以使用efConstruction(构建索引时)或ef(搜索目标时)指定搜索范围。

索引构建参数

参数

描述

范围

M

节点的最大度数

[2,2048]

efConstruction

搜索范围

[1,int_max]

搜索参数

参数

描述

范围

ef

搜索范围

[top_k,int_max]

3.2、二进制嵌入的索引

3.2.1、BIN_FLAT

此索引与FLAT完全相同,除了它只能用于二进制嵌入。

对于需要完美准确性并依赖于相对较小(百万级)数据集的向量相似性搜索应用程序,BIN_FLAT索引是一个不错的选择。BIN_FLAT不压缩向量,是唯一能保证精确搜索结果的索引。BIN_FLAT的结果也可以用作其他召回率低于100%的指标产生的结果的比较点。

BIN_FLAT是准确的,因为它采用了一种详尽的搜索方法,这意味着对于每个查询,目标输入都会与数据集中的向量进行比较。这使得BIN_FLAT成为我们列表中最慢的索引,不适合查询大量矢量数据。Milvus中没有BIN_FLAT索引的参数,使用它不需要数据训练或额外的存储。

搜索参数

参数

描述

范围

metric_type

[可选]所选的距离指标

请参阅支持的指标

3.2.2、BIN_IVF_FLAT

该索引与IVF_FLAT完全相同,除了它只能用于二进制嵌入。

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

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

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

索引构建参数

参数

描述

范围

nlist

集群单元数量

[1,65536]

搜索参数

参数

描述

范围

nprobe

要查询的单位数

[1,nlist]

四、常见问题

FLAT索引和IVF_FLAT索引有什么区别?

答:IVF_FLAT索引将向量空间划分为nlist簇。如果将nlist的默认值保持为16384,Milvus会比较目标向量与所有16384个簇的中心之间的距离,以获得最近的nprobe簇。然后Milvus比较目标向量和所选簇中的向量之间的距离,以获得最近的向量。与IVF_FLAT不同的是,FLAT直接比较目标向量与每个向量之间的距离。

因此,当向量总数近似等于nlist时,IVF_FLAT和FLAT在所需的计算方式和搜索性能方面几乎没有差异。但随着载体数量增长到nlist的两倍、三倍或n倍,IVF_FLAT指数开始显示出越来越大的优势。

有关更多信息,请参阅如何在Milvus中内存索引:

In-memory Index Milvus v2.3.x documentation

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/51954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux压缩和解压

目录 压缩和解压类 gzip/gunzip指令 zip/unzip指令 tar指令 压缩和解压类 gzip/gunzip指令 gzip用于压缩文件&#xff0c;gunzip用于解压缩文件。 解压后去掉了gz的后缀。 zip/unzip指令 ​​​​​​​ 将文件压缩后发给别人&#xff0c;别人再解压。 将整个文件压…

上千条备孕至育儿指南速查ACCESS\EXCEL数据库

虽然今天这个数据库的记录数才不过区区上千条&#xff0c;但是每条记录里的内容都包含四五个子标题&#xff0c;可以将相关的知识完整且整齐的展现&#xff0c;是个属于简而精的数据库。并且它包含2级分类。 【备孕】大类包含&#xff1a;备孕百科(19)、不孕不育(23)、精子卵子…

uniapp 微信小程序生成水印图片

效果 源码 <template><view style"overflow: hidden;"><camera device-position"back" flash"auto" class"camera"><cover-view class"text-white padding water-mark"><cover-view class"…

165万人在线《黑神话:悟空》登顶STEAM!勾起太多回忆,我冲啦!

本公众号由以下老铁赞助&#xff0c;感谢他们❗️ 2024年8月20日&#xff0c;一个平凡而又特殊的日子&#xff0c;国产游戏《黑神话&#xff1a;悟空》正式上线 Steam平台&#xff0c;在线人数突破165万&#xff0c;超越《反恐精英CS2》登顶热玩榜。 更牛逼的是 Steam 热玩排行…

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE啦&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好习惯&#…

Kafka快速入门:Kafka驱动JavaApi的使用

生产者和消费者是Kafka的核心概念之一&#xff0c;它们在客户端被创建和使用&#xff0c;并且包含了许多与Kafka性能和机制相关的配置。虽然Kafka提供的命令行工具能够执行许多基本操作&#xff0c;但它无法实现所有可能的性能优化。相比之下&#xff0c;使用Java API可以充分利…

打造更高效的项目:如何选择合适的管理工具

国内外主流的 10 款项目工程管理系统对比&#xff1a;PingCode、Worktile、Asana、Trello、Monday.com、ClickUp、Wrike、泛微项目协同工具、广联达项目管理软件、泛普OA。 在选择项目工程管理系统时&#xff0c;你是否经常感到无从下手&#xff0c;担心投资不当或工具不适合自…

Python 使用 matplotlib 显示图像

如果没有安装 matplotlib 需要先安装&#xff1a; pip install matplotlib一、读取图片并显示 import matplotlib.pyplot as pltimage_path "/Users/AlanWang4523/Desktop/Debug/files/image.png" image_array plt.imread(image_path)plt.figure("ImageShow…

[数据集][目标检测]停车场空位检测数据集VOC+YOLO格式7959张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;7959 标注数量(xml文件个数)&#xff1a;7959 标注数量(txt文件个数)&#xff1a;7959 标注…

指针和引用的区别

指针和引用是C中的两个重要概念&#xff0c;它们虽然在功能上有一些相似之处&#xff0c;但在使用方式和底层实现上有明显的区别。以下是它们的主要区别&#xff1a; 定义方式&#xff1a; 指针&#xff1a;指针是一种变量&#xff0c;用于存储另一个变量的地址。可以通过*操作…

【保姆级教程】5分钟上手 Coze 自建插件,把 AI 接入个人微信

上篇&#xff0c;给大家介绍了一款搭建微信机器人的开源项目&#xff1a; 搭建微信机器人的第4种方式&#xff0c;我造了一个摸鱼小助手 不同于需要付费的项目&#xff0c;它的定制化程度非常高~ 问题来了&#xff1a;怎么接入 AI 能力呢&#xff1f; 考虑到大家对 Coze 智能…

AI 智能体:从普通人到《黑神话:悟空》,保姆级教程让你瞬间变身!

大家好&#xff0c;我是木川 今天还没下班&#xff0c;就看到一款名为《黑神话:悟空》的游戏火爆全网&#xff0c;唤醒了无数玩家对大圣孙悟空的崇拜与向往。游戏中&#xff0c;悟空的七十二变让人叹为观止&#xff0c;但你是否想过&#xff0c;借助AI的力量&#xff0c;我们也…

实验十 编写子程序《汇编语言》- 王爽

一. 显示字符串 1. 需求 显示字符串是现实工作中经常要用到的功能&#xff0c;应该编写一个通用的子程序来实现这个功能。我们应该提供灵活的调用接口&#xff0c;使用者可以决定显示的位置&#xff08;行、列&#xff09;、内容和颜色。 子程序描述 名称&#xff1a;show_str…

第六版页面

基本 明确定义 站点网关mqtt服务器 多个柜子使用的是主从模式 下发一个设备组其他的柜子跟着设置 具体的让后端进行详细管理 前端规范 字体规范 弹出框定义什么应该弹出什么不应该弹出 页面 主页 屏幕宽度有的没设置好 平面地图模式有的没重合好 日志改为告警在上面 日志…

cmake install setlocal错误

cmake中的代码如下&#xff1a; #设置安装目录的前缀 set(CMAKE_INSTALL_PREFIX $ENV{PUBLISH_DIR}) #这边的输出满足要求 message(STATUS "install dir:${CMAKE_INSTALL_PREFIX}") #指定安装 install(TARGETS ${TARGET_NAME} RUNTIME DESTINATION bin …

深入理解Kafka消费者偏移量管理:如何确保事件已处理

深入理解Kafka消费者偏移量管理&#xff1a;如何确保事件已处理 Apache Kafka是一款流行的分布式流处理平台&#xff0c;用于构建高吞吐量的数据管道和实时应用。在Kafka中&#xff0c;消费者处理事件的确认机制主要依赖于偏移量&#xff08;Offset&#xff09;的管理。本文将深…

机械学习—零基础学习日志(如何理解概率论3)

随机变量的函数分布 一维随机变量分布&#xff0c;可以看到下图&#xff0c;X为不同情况的概率。而x如果是大于等于X&#xff0c;那么当x在40以内时&#xff0c;没有概率&#xff0c;为0。 当x变大&#xff0c;在40-80之间&#xff0c;那么x大于X的概率为&#xff0c;0.7&…

Liunx搭建Rustdesk远程桌面服务

1、环境准备 Linux&#xff1a;centos7.9 rustdesk server安装包 很多新服务器并没有 wget 和unzip 可以通过yum自行安装下&#xff0c;如果系统中有wget但不能使用&#xff0c;直接卸载重装即可。 yum install wget wget --no-check-certificate https://github.com/rust…

《黑神话悟空》打不开解决方法介绍

黑神话悟空打不开怎么办&#xff1f;很多的玩家都非常的好奇自己的黑神话悟空为什么打不开&#xff0c;这里整理了黑神话悟空打不开解决方法介绍&#xff0c;详细的内容可以在这里进行了解&#xff0c;有需要的小伙伴们一起来看看吧&#xff01; 解决方法1&#xff1a;验证文件…

Go第一个程序

package mainimport "fmt"func main() {str : "hello go"fmt.Println(str) }上述很简单&#xff0c;如何使用os包获取命令行参数呢&#xff1f; package mainimport ("fmt""os" )func main() {fmt.Println(os.Args)str : "hello…