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,减少小值对最终分数的贡献。通过忽略一些小值,在稍微影响到准确率的情况下可以提高搜索性能

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

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

相关文章

HTML静态网页成品作业(HTML+CSS)——动漫熊出没介绍网页(3个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有3个页面。 二、作品演示 三、代…

如何避免常见错误并成功获得心仪的offer

在职场中,面试往往是决定职业发展的重要环节。然而,仅仅凭借自我感觉往往难以准确预测面试结果。许多求职者可能会因为与面试官交流得投机而感觉胜券在握,但实际上,面试结果往往受到多种因素的影响。 首先,面试不仅仅是…

小学文言文基础学习视频下载

学习文言文有许多好处,不仅在语言和文化层面上对个人素养有所提升,还能在思维方式和综合能力上带来积极影响。以下是学习文言文的一些主要好处: 1. 提升语言能力 增强语言理解能力 学习文言文需要对古汉语的词汇、语法和句式有深入理解&am…

重构2:重构的原则

最近在看重构2:改善既有代码的设计这本书,对于代码重构指导非常有帮助,然后也是做个笔记记录下,以下是我阅读本书的前两章的时候整理的思维导图:

关于AI数字人的几个创作平台及其使用(一)

文章目录 一、AI数字人创作基本步骤二、创作平台一1、基本信息2、使用方法1、进入创作页面2、开始创作2.1、脚本创作2.1.1、使用文本软件创作2.1.2、AI创作脚本2.2、选择模板2.2.1、模板2.2.2、字幕与配音2.3、细节调整2.3.1、PPT模式2.3.2、数字人2.3.3、背景2.3.4、贴纸2.3.5…

[240529] llm.c 从头训练 GPT-2 | 六国公众对采用生成式 AI 的看法

目录 llm.c: 20美元 90分钟,从头训练 GPT-2公众对新闻中生成式人工智能的看法 - 六国调查报告公众对生成式人工智能的意识和使用公众对生成式人工智能在不同领域应用的预期公众对新闻业中生成式人工智能使用的看法结论未来趋势 llm.c: 20美元 90分钟,从头训练 GPT-2 用 llm.c …

linux大文件切割

在一些小众的场景下出现的大文件无法一次性传输 当然我遇到了 &#xff0c;work中6G镜像文件无法一次性刻盘到4.7G大小的盘 split split -b 3G 源大文件 目标文件 #安静等待会生成目标文件名a、b、c......-b <大小>&#xff1a;指定每个输出文件的大小&#xff0c;单位为…

Python-3.12.0文档解读-内置函数ord()详细说明+记忆策略+常用场景+巧妙用法+综合技巧

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 详细说明 概述 语法 参数 返回值 示例 注意事项 应用场景 记忆策略 常用场景…

【测试SQLite】测试SQLite支持的SQL语句分类

测试SQLite支持的SQL语句分类 为了全面测试SQLite支持的SQL语句&#xff0c;需要设计一个包含多种类型的表结构&#xff0c;并编写各种SQL语句来测试这些功能。目前按照以下分类进行测试&#xff1a; 数据定义语言&#xff08;DDL&#xff09;数据操作语言&#xff08;DML&am…

【跑跑卡丁车game】

编写一款跑跑卡丁车游戏程序是一个涉及多个步骤的复杂过程。以下是一个简化的指南&#xff0c;概述了创建这类游戏可能涉及的步骤和技术&#xff1a; 需求分析&#xff1a; 确定游戏的目标受众。列出游戏的基本功能&#xff0c;如单人模式、多人在线对战、排行榜等。 游戏设计…

haproxy+keepalived搭建jeesns论坛

集群实现 软件层分为负载均衡层 Web 层、 数据库和共享存储层。 数据库&#xff1a; ​ keepalivedhaproxypxc&#xff08;MariaDB Galera Cluster&#xff09; 共享存储&#xff1a; ​ ceph分布式集群&#xff0c;cephfs web层&#xff1a; ​ tomcat 负载均衡&#x…

离线deb安装下载及安装实例

1、使用apt download下载deb安装包(不包括依赖包) 1.1仅下载deb安装包 sudo apt download lrzsz 1.2安装载deb安装包 sudo dpkg -i lrzsz_0.12.21-10kylin0k2_arm64.deb 注&#xff1a;dpkg安装deb包&#xff0c;部分存在depends关系&#xff0c;需要使用apt-get -f instal…

Linux 删除SSH密钥(id_ed25519),重新生成

在Linux系统中&#xff0c;重新生成SSH密钥&#xff08;比如id_ed25519&#xff09;的过程包括删除现有的密钥文件并生成一个新的。 以下是具体的步骤&#xff1a; 0. 查看下是否有密钥 1. 删除原有的id_ed25519密钥 默认情况下&#xff0c;SSH密钥存储在用户的主目录下的 .…

mac 下配置mysql的全局环境变量

前言 如果你还没有安装mysql&#xff0c;请参考这篇文章手把手教你MAC本地数据库的安装与使用&#xff1a;mysql python (pymysql)【一】 - 知乎 正文 1.打开终端&#xff0c;输入命令”echo $SHELL“,显示当前的shell ⚠️本人使用的终端shell是zsh&#xff0c;如果你使用…

想让企业“火力全开”?找六西格玛培训公司就对了!

在如今的市场环境中&#xff0c;企业面临着不断变化的挑战和无限的可能。要在这场竞争中独领风骚&#xff0c;实现稳健的增长&#xff0c;六西格玛作为一种以数据驱动的管理理论&#xff0c;提供了实际可行的解决方案。六西格玛培训公司&#xff0c;作为这一领域的专家&#xf…

linux 之dma_buf (8)- ION简化版本

一、前言 我们学习了如何使用 alloc_page() 方式来分配内存&#xff0c;但是该驱动只能分配1个PAGE_SIZE。本篇我们将在上一篇的基础上&#xff0c;实现一个简化版的ION驱动&#xff0c;以此来实现任意 size 大小的内存分配。 二、准备 为了和 kernel 标准 ion 驱动兼容&…

身为UI设计老鸟,不学点3D,好像要被潮流抛弃啦,卷起来吧。

当前3D原则在UI设计中运用的越来越多&#xff0c;在UI设计中&#xff0c;使用3D元素可以为界面带来以下几个价值&#xff1a; 增强视觉冲击力&#xff1a;3D元素可以通过立体感和逼真的效果&#xff0c;为界面增添视觉冲击力&#xff0c;使得设计更加生动、吸引人&#xff0c;并…

AI PC 的曙光:微软大胆出击与苹果竞争

AI PC 的曙光&#xff1a;微软大胆出击与苹果竞争 AI PC 的曙光&#xff1a;微软大胆出击与苹果竞争 概述 微软已正式进入 AI PC 时代&#xff0c;并且毫不避讳地直接向苹果的 MacBook 发起攻击。随着代号为“Copilot”的笔记本电脑的推出&#xff0c;微软准备彻底改变我们与…

面试数据库八股文十问十答第九期

面试数据库八股文十问十答第九期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;MySQL 读写分离 MySQL 读写…

AI大模型如何“开窍”?算法、数据与架构的三重奏

一、算法创新 1. 探索新的学习范式 自监督学习&#xff1a;利用未标注数据让模型自我学习&#xff0c;提高模型的泛化能力。元学习&#xff1a;让模型学会如何学习&#xff0c;以便在不同任务之间快速迁移。强化学习&#xff1a;通过试错与奖励机制&#xff0c;使模型在与环境…