Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >低内存、高性能,磁盘索引可以这样玩

低内存、高性能,磁盘索引可以这样玩

作者头像
Zilliz RDS
发布于 2023-08-26 00:34:34
发布于 2023-08-26 00:34:34
8890
举报

在 Milvus 社区中,与磁盘索引相关的问题成为近期用户集中询问重点。为了方便用户更深入地了解磁盘索引,我们将从其原理出发,由表及里地介绍如何用好磁盘索引。

Milvus 是世界上最快的向量数据库,在最新版本的 Milvus 中,基于内存的 HNSW 索引可以提供极致的性能体验。然而,Milvus 的目标是支持多种不同的场景,除了性能,我们也追求性价比和可扩展,因此便有了磁盘索引。

基于 DiskANN 的磁盘索引可以在仅使用 1/10 的内存消耗下,发挥出 HNSW 索引 1/3-1/2 的性能能力,能够在千万级别的数据上拿到 ~10ms 的延迟能力。因此,它可以帮助用户在 QPS、Latency 不特别敏感的场景下大大降低资源的消耗。

01.

DiskANN 原理浅析

之前已经有 Zilliz 的同学写过一篇关于 DiskANN 论文的相关文章[1],感兴趣的朋友可以了解一下。

回到原理介绍的部分,DiskANN 的大致结构是在内存中维护一个 PQ,然后原始向量和邻接表以 Vamana 图的结构储存在硬盘里。

  • Vamana

图的结构有很多种,最早是 2011 年有文章提出链接每个点的最临近的 K 个点。这种策略的空间占用高,并且性能差。

后来大家优化的重点就在于如何去剪枝。2017 年,有篇文章提出了 NSG 图,策略就是如果一个新的点离目标点的距离远于离目标点的邻居,就不链接。即保证对于目标点的邻居,以它为中心,到目标点的距离为半径的圆里边没有别的目标点的邻居。

这种策略减少了每个点的出度,大大加快了查询的速度。

DiskANN 基于的 Vamana 图就是由 NSG 演进而来,具体的改进就是由于 NSG 的裁边机制过于激进导致精度下降,因此引入一个参数 alpha 来控制裁边。具体就是裁边的时候判断的距离乘上这个系数后还是过大才会裁掉。

  • Build

简单介绍一下 DiskANN 建索引的过程:

首先 DiskANN 会对原始数据采样找到 PQ 的 Pivots,这一步 DiskANN 默认是 256 个 clusters,会根据用户允许的在查询中使用的内存来决定 chunk 数目和大小。然后对原始数据进行 PQ 压缩。

然后 DiskANN 会基于原始数据来构建 Vamana 图,根据用户的允许的在建索引中使用的内存在决定是一次建完还是分批建然后 merge。后者会有较大的性能降低。

然后是把数据都写入磁盘,并删除中间文件。

最后会生成一个从原始数据中随机采样的样本用于 warmup。

  • Search

首先 DiskANN 会加载磁盘中的索引文件,把 PQ 码表放进内存,然后根据用户的参数开始建立 cache 和 warmup。

Cache 的策略有两种:

  • 取之前的采集的样本进行 query,缓存中间路过的点。目前是用于 KNN search。
  • 在 entrypoint 周围进行 BFS,缓存这些点,目前用于 range search。

Warmup 的方式则是对样本进行 query。

然后就是 DiskANN 的搜索算法,具体做法是:

  • 先根据参数固定一个 search list,把 entry point 放进去。
  • 然后从 search list 每次拿至多 beamwidth 个点,在硬盘中加载向量和邻居。
  • 用 PQ 计算这些邻居到目标点的距离,择优放进 Search List(类似于 Priority Queue)。
  • 一直循环到 search list 被占满。且都访问过。
  • 把途径的所有点收集起来排序取 topK。

02.

DiskANN in Milvus

关于 Milvus 是如何使用 DiskANN 索引的,大致可以用下边的数据链路图表达:

Build 时,IndexNode 会从 MinIO 里抓取原始数据,预处理后放入本地磁盘。然后 DiskANN 会从磁盘中读取文件并生成索引文件。最后由 IndexNode 把建好的索引文件处理后推到 MinIO 里。

Search 的时候,QueryNode 会从 MinIO 里抓取索引文件,与处理后放入本地磁盘。然后 DiskANN 会从本地磁盘中加载少量必要的信息以供查询。

03.

如何用好磁盘索引

  • 适用场景

磁盘索引适用于对性能不是非常敏感,且内存资源有限的场景。在默认场景下,内存的占比是原始数据大小的 1/4,其中 1/8 用作 PQ 码表,1/8 用作 cache。索引的磁盘占用是原始数据的 1.5~2 倍。这些比例都可以通过参数来调节以满足不同场景的需求,后边会具体介绍。

数据类型:目前 Milvus 的 DiskANN 只支持 float 类型的数据。

距离类型:DiskANN 能支持 L2 和 IP 距离。

维度:由于 Milvus 依据原始数据大小划分 Segment,如果维度过小,会导致一个 Segment 里数据行数过多。

DiskANN 的索引主要由原始数据和邻接表组成,过多的行数会导致单个 Segment 索引中邻接表数量变大,从而导致整个索引大小过大。因此 Milvus 的 DiskANN 暂时不支持 16 维以下的向量。因为 DiskANN 会大量访问磁盘,而磁盘的访问都是以一个大小是 4096 的 page 为基本单位的。因此过大维度会引起磁盘访问增大,从而导致性能下降。Milvus 的维度上限为 32768,但是为了获得更好的性能,推荐的最大维度为 1024。

  • 性能瓶颈

磁盘索引的 Search 性能瓶颈一般集中在磁盘 IO 上,因此好的磁盘对于性能的提升几乎是线性的。一般来说 SSD(NVMe) 的性能是 SSD(Sata) 的4-5倍,而 SSD(Sata) 的性能是一般 HDD 的 4-5 倍。

但是磁盘的性能对索引的 Build 性能影响不大。Build 的时候 DiskANN 需要在内存里建图,因此需要约单个 Segment 原始数据 1.7-2 倍左右大小的内存支持。如果内存不够,DiskANN 会分块建图再合并,会造成比较大的 Build 性能损失。

  • 参数调整

关于磁盘索引的相关参数调整可以参见 Milvus 官方文档[2]

这里还想分享一个性能上的 trick。一般图算法在数据量增大后,Latencty 的上升会很不明显。因此调整 Segment 大小能对性能产生不小的影响。在 ${MILVUS_ROOT_PATH}/configs/milvus.yaml 里,调大 dataCoord/segment/diskSegmentMaxSize (默认 2G) 会让性能更好。

参考资料

[1]

DiskANN 论文相关文章:https://zhuanlan.zhihu.com/p/394393264

[2]

官方文档:https://milvus.io/docs/disk_index.md

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-03-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ZILLIZ 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Paper Reading | DiskANN: 十亿规模数据集上高召回高 QPS 的 ANNS 单机方案
“DiskANN: Fast Accurate Billion-point Nearest Neighbor Search on a Single Node” [1]是 2019 年发表在 NeurIPS 上的论文。
Zilliz RDS
2021/08/20
2.5K0
浅谈如何优化 Milvus 性能
Milvus 是全球最快的向量数据库,在最新发布的 Milvus 2.2 benchmark[1] 中,Milvus 相比之前的版本,取得了 50% 以上的性能提升。值得一提的是,在 Master branch 的最新分支中,Milvus 的性能又更进一步,在 1M 向量串行执行的场景下取得了 3ms 以下的延迟,整体 QPS 甚至超过了 ElasticSearch 的 10 倍。那么,如何使用 Milvus 才能达到理想的性能呢?本文暂且不提社区大神贡献的黑科技优化,先聊聊使用 Milvus 过程中的一些经验,以及如何进行性能调优。
Zilliz RDS
2023/01/10
4.4K0
浅谈如何优化 Milvus 性能
Milvus性能优化提速之道:揭秘优化技巧,避开十大误区,确保数据一致性无忧,轻松实现高性能
Milvus 是全球最快的向量数据库,在最新发布的 Milvus 2.2 benchmark中,Milvus 相比之前的版本,取得了 50% 以上的性能提升。值得一提的是,在 Master branch 的最新分支中,Milvus 的性能又更进一步,在 1M 向量串行执行的场景下取得了 3ms 以下的延迟,整体 QPS 甚至超过了 ElasticSearch 的 10 倍。那么,如何使用 Milvus 才能达到理想的性能呢?本文暂且不提社区大神贡献的黑科技优化,先聊聊使用 Milvus 过程中的一些经验,以及如何进行性能调优。
汀丶人工智能
2023/11/15
2.5K0
Milvus性能优化提速之道:揭秘优化技巧,避开十大误区,确保数据一致性无忧,轻松实现高性能
一起来认识 GPU-Cagra 索引!
向量搜索是一个非常典型计算密集型的场景。作为世界上最快的向量数据库,Milvus的向量检索引擎Knowhere占用了超过整个系统80%的计算资源。而当我们谈论到高性能的计算,GPU总是一个绕不开的话题,在向量领域也不例外。
Zilliz RDS
2024/07/10
4820
一起来认识 GPU-Cagra 索引!
如何定位Milvus性能瓶颈并优化
在此前的文章中,我们已经介绍了评估各种向量数据库时使用的关键指标和性能测试工具。本文将以 Milvus 向量数据库为例,特别关注 Milvus 2.2 或以上版本,讲解如何监控搜索性能、识别瓶颈并优化向量数据库性能。
Zilliz RDS
2024/07/20
5940
如何定位Milvus性能瓶颈并优化
前所未有的 Milvus 源码架构解析
Deep Dive 是由 Milvus 社区发起的代码解析系列直播,针对开源数据库 Milvus 整体架构开放式解读,与社区交流与分享 Milvus 最核心的设计理念。通过本期分享,你可以了解到云原生数据库背后的设计理念,理解 Milvus 相关组件与依赖,了解 Milvus 多种应用场景。
Zilliz RDS
2022/04/08
1.9K0
前所未有的 Milvus 源码架构解析
KIOXIA:使用SSD加速RAG场景落地
按:SSD提供高带宽、低延迟,使得其在AI推理场景,成为扩展DARM可能选择之一,昨天文章(文末链接)介绍WD基于稀疏矩阵算法来优化存储在SSD中的模型参数,其本质与模型量化相近;KIOXIA在本文介绍基于ANN算法来提高参数检索效率,提供了另一种思路。
数据存储前沿技术
2025/02/11
1420
KIOXIA:使用SSD加速RAG场景落地
检索算法小结
上一篇文章介绍了大模型应用利器--RAG。在RAG中当然少不了检索。检索算法在信息检索、搜索引擎和推荐系统等领域中扮演着至关重要的角色。它们的核心任务是根据用户查询从大量数据中找出最相关的信息。本文就对检索算法进行以下小结。
languageX
2024/07/01
3710
大数据组件:Lucene全文索引与搜索
Lucene是一款高性能、可扩展的信息检索工具库,是用于全文检索和搜寻的Java开放源码程序库,最初是由Doug Cutting所撰写,2000年发行了第一个开源版本,2005年成为Apache顶级项目。虽然经过近20年,Lucene在全文检索领域还是独领风骚,蓬勃发展。
Yiwenwu
2024/05/25
5390
大数据组件:Lucene全文索引与搜索
向量数据库原理之向量索引
在前面的文章中讲解了milvus的源码安装——向量数据库milvus源码剖析之开篇,向量数据库通常具备以下特点:
公众号guangcity
2024/06/27
7360
向量数据库原理之向量索引
Annoy vs Milvus:哪个向量数据库更适合您的AI应用?知其然知其所以然
Annoy 和 Milvus 都是用于向量索引和相似度搜索的开源库,它们可以高效地处理大规模的向量数据。
汀丶人工智能
2023/10/18
1K0
Annoy vs Milvus:哪个向量数据库更适合您的AI应用?知其然知其所以然
13 种高维向量检索算法全解析!数据库顶会 VLDB 2021 论文作者干货分享
以图搜图、商品推荐、社交推荐等社会场景中潜藏了大量非结构化数据,这些数据被工程师们表达为具有隐式语义的高维向量。为了更好应对高维向量检索这一关键问题,杭州电子科技大学计算机专业硕士王梦召等人探索并实现了「效率和精度最优权衡的近邻图索引」,并在数据库顶会 VLDB 2021 上发表成果。
Zilliz RDS
2021/10/08
2.5K0
基于磁盘量身定制,十亿规模高效向量检索方案
“SPANN: Highly-efficient Billion-scale Approximate Nearest Neighbor Search”[1]是发表于 2021 年人工智能领域全球顶会 NeurIPS 的一篇关于近似最近邻检索(ANNS)的论文,提出了高效的内存-磁盘混合索引和搜索方案 SPANN。
Zilliz RDS
2022/01/05
7010
基于磁盘量身定制,十亿规模高效向量检索方案
论文赏析:极致性价比,非易失性内存在向量检索的应用
HM-ANN: Efficient Billion-Point Nearest Neighbor Search on Heterogenous Memory 是一篇被 2020 年 Conference on Neural Information Processing Systems (NeurIPS 2020). 本文提出了一种基于图的相似性搜索的新型算法,称为 HM-ANN。
Zilliz RDS
2021/08/20
7770
Milvus 2.0 Knowhere 概览
如果把 Milvus 比喻为一辆跑车,Knowhere 就是这辆跑车的引擎。Knowhere 的定义范畴分为狭义和广义两种。狭义上的 Knowhere 是下层向量查询库(如Faiss、HNSW、Annoy)和上层服务调度之间的操作接口。同时,异构计算也由 Knowhere 这一层来控制,用于管理索引的构建和查询操作在何种硬件上执行, 如 CPU 或 GPU,未来还可以支持 DPU/TPU/……这也是 Knowhere 这一命名的源起 —— know where。广义上的 Knowhere 还包括 Faiss 及其它所有第三方索引库。因此,可以将 Knowhere 理解为 Milvus 的核心运算引擎。
Zilliz RDS
2022/05/25
8300
Milvus 2.0 Knowhere 概览
如何让PostgreSQL的向量数据速度与Pinecone一样快
了解我们如何为 PostgreSQL 配备高级索引技术,使其与其他专门的向量数据库(如 Pinecone)一样快。
云云众生s
2024/06/12
3380
如何让PostgreSQL的向量数据速度与Pinecone一样快
云原生向量数据库Milvus:数据与索引的处理流程、索引类型及Schema
本文将介绍 Milvus 系统中数据写入、索引构建、数据查询的具体处理流程,同时,还会介绍 Milvus 支持的索引类型;另外,还将讲述如何定义字段和集合 Schema。
汀丶人工智能
2023/10/11
2.7K0
云原生向量数据库Milvus:数据与索引的处理流程、索引类型及Schema
pymilvus创建IVF_SQ8向量索引
milvus支持的向量索引类型大部分使用近似最近邻搜索算法(ANNS,approximate nearest neighbors search) 。ANNS 的核心思想不再局限于返回最准确的结果,而是仅搜索目标的邻居。 ANNS 通过在可接受的范围内牺牲准确性来提高检索效率。
melodyshu
2024/04/08
3070
Milvus 2.3.功能全面升级,核心组件再升级,超低延迟、高准确度、MMap一触开启数据处理量翻倍、支持GPU使用!
Milvus 2.3.0 不仅包含大量的社区呼声很高的新功能,还带来了诸如 GPU 支持、Query 架构升级、更强的负载均衡、调度能力、新的消息队列Arm 版本镜像、可观测性、运维工具升级等能力,这标志着 Milvus 2.x 系列从 production ready,走向成熟、可靠、生态繁荣、运维更友好的发展路径。
汀丶人工智能
2023/11/21
8310
Milvus 2.3.功能全面升级,核心组件再升级,超低延迟、高准确度、MMap一触开启数据处理量翻倍、支持GPU使用!
云原生向量数据库Milvus知识大全,看完这篇就够了[基本概念、系统架构、主要组件、应用场景]
Milvus 是一款云原生向量数据库,它具备高可用、高性能、易拓展的特点,用于海量向量数据的实时召回。
汀丶人工智能
2023/10/11
22.1K0
云原生向量数据库Milvus知识大全,看完这篇就够了[基本概念、系统架构、主要组件、应用场景]
推荐阅读
相关推荐
Paper Reading | DiskANN: 十亿规模数据集上高召回高 QPS 的 ANNS 单机方案
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档