ModaHub魔搭社区:向量数据库Milvus性能调优教程(二)

目录

索引

其他

存储优化

常见问题


索引

向量索引的基本概念请参考 向量索引概述。

选择合适的索引需要在存储空间、查询性能、查询召回率等多个指标中权衡。

  • FLAT 索引

FLAT 是对向量的暴力搜索(brute-force search),速度最慢,但召回率最高(100%),磁盘空间占用最小。

随着目标向量数量增多,使用 CPU 做 FLAT 查询的耗时呈线形上升关系;而使用 GPU 查询时,批量查询的效率高,目标向量数量增加对查询耗时影响不大。

  • IVF 系列索引

IVF 系列索引包括 IVF_FLAT、IVF_SQ8/IVF_SQ8H 和 IVF_PQ。IVF_SQ8/IVF_SQ8H 和 IVF_PQ 索引对向量数据做了有损压缩,磁盘占用量较少。

IVF 索引都有两个相同的参数:nlist 和 nprobe。nlist 是建索引参数,nprobe 是搜索参数。选取 nlist 和 nprobe 的推荐值,详见 性能优化问题 > 应如何设置 IVF 索引的nlist和nprobe参数?

根据相关原理,估算使用 IVF 索引进行查询时的计算量:

 

  • 单个数据段计算量可估算为:目标向量数量 × (nlist + (段内向量数 ÷ nlist)× nprobe)
  • 数据段的数量可估算为:集合数据总量 ÷ index_file_size
  • 对集合查询所需的计算总量则为:单个数据段计算量 × 数据段数量

通过估算得出的计算总量越大,查询耗时越长。实际使用中可根据以上公式确定合理的参数,在满足召回率的前提下获得较高的查询性能。

在持续插入数据的场景下,由于对大小未达到 index_file_size 的数据段未建立索引,对其使用的查询方式是暴力搜索。计算量为:目标向量数量 x 该数据段向量总数。

  • HNSW / RNSG / ANNOY 索引

HNSW、RNSG、ANNOY 的索引参数对查询性能的影响较为复杂,建议参考 索引概览。

其他

  • 结果集

结果集的规模取决于目标向量数量和 topk。topk 的大小对计算的影响不大。但在目标向量数量和 topk 都较大的情况下,结果集序列化和网络传输的耗时会相应增加。

  • MySQL

Milvus 使用 MySQL 作为元数据后端服务。Milvus 在查询数据时会多次访问 MySQL 以获取元数据信息,因此 MySQL 服务的响应速度对 Milvus 的查询性能有较大影响。

 

  • 预加载

首次查询需要先将数据从磁盘读入缓存,因此耗时较长。为避免首次查询加载数据,可预先调用 load_collection 接口,或使用系统参数 preload_collection 指定启动 Milvus 时要预先加载的集合。

  • 段数据整理

在 数据段整理 中提到,Milvus 在查询数据时将 delete_docs 读入内存以过滤被删除的实体。调用 compact 接口可清理被删除的实体,减少过滤操作,从而提高查询性能。

存储优化

  • 数据段整理

在 数据段整理 中提到,被删除的实体不参与计算,并且占用磁盘空间。如果有大量的实体已被删除,你可以调用 compact 接口来释放磁盘空间。

常见问题

为什么查询时 GPU 一直空闲?

此时应该是在用 CPU 进行查询。如果要用 GPU 进行查询,需要在配置文件中将 gpu_search_threshold 的值设置为小于 nq (每次查询的向量条数) 。可以将 gpu_search_threshold 的值调整为期望开启 GPU 搜索的 nq 数。若 nq 小于该值,则用 CPU 查询,否则将使用 GPU 查询。不建议在查询批量较小时使用 GPU 搜索。

为什么搜索的速度非常慢?

请首先检查 server_config.yaml 的 cache.cache_size 参数是否大于集合中的数据量。

创建集合时 index_file_size 如何设置能达到性能最优?

使用客户端创建集合时有一个 index_file_size 参数,用来指定数据存储时单个文件的大小,其单位为 MB,默认值为 1024。当向量数据不断导入时,Milvus 会把数据增量式地合并成文件。当某个文件达到 index_file_size 所设置的值之后,这个文件就不再接受新的数据,Milvus 会把新的数据存成另外一个文件。这些都是原始向量数据文件,如果建立了索引,则每个原始文件会对应生成一个索引文件。Milvus 在进行搜索时,是依次对每个索引文件进行搜索。

根据我们的经验,当 index_file_size 从 1024 改为 2048 时,搜索性能会有 30% ~ 50% 左右的提升。但要注意如果该值设得过大,有可能导致大文件无法加载进显存(甚至内存)。比如显存只有 2 GB,该参数设为 3 GB,显存明显放不下。

如果向集合中导入数据的频率不高,建议将 index_file_size 的值设为 1024 MB 或者 2048 MB。如果后续会持续地向集合中导入增量数据,为了避免查询时未建立索引的数据文件过大,建议这种情况下将该值设置为 256 MB 或者 512 MB。

可参阅 如何设置 Milvus 客户端参数。

为什么同样的数据量,用 GPU 查询比 CPU 查询慢?

 

一般来说,当 nq(每次查询的向量条数)较小时,用 CPU 查询比较快。只有当 nq 较大(约大于 500)时,用 GPU 查询才会更有优势。

因为在 Milvus 中,每次用 GPU 查询都需要将数据从内存加载到显存。只有当 GPU 查询节省的计算时间能抵消掉数据加载的时间,才能体现出 GPU 查询的优势。

为什么有时候小的数据集查询时间反而更长?

如果数据文件的大小小于创建集合时 index_file_size 参数的值,Milvus 则不会为此数据文件构建索引。因此,小的数据集有可能查询时间会更长。你还可以调用 create_index 建立索引。

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

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

相关文章

CMake使用gRPC(Protobuf) 的c++ demo

gRPC的命令参数里, 1. 如果要用pacakge,需要--proto_path的参数, 例如helloworld.proto的绝对路径是 /home/user/grpc_demo_ws/grpc_demo/hello_world/proto/helloworld.proto 在helloworld.proto里面的pacakge是 package grpc_demo.hello_w…

模仿QQ之右键菜单

参考:QT多级菜单 - 知乎 (zhihu.com) 运行效果图: 关键代码: void personMenu::contextMenuEvent(QContextMenuEvent *event) {//我完全可以写出一个代码生成器来把这些代码生成出来。parentnew QMenu(this);parent->addAction(QIcon(…

【玩转循环】探索Python中的无限可能性

前言 循环可能是每个编程语言中使用比较多的语法了,如果能合理利用好循环,就会出现意想不到的结果,大大地减少代码量,让机器做那些简单枯燥的循环过程,今天我将为大家分享 python 中的循环语法使用。🚗&am…

【NOSQL】redis哨兵模式、集群搭建

目录 一、redis高可用一、Redis主从复制1.1主从复制的作用1.2主从复制流程 二、搭建Rdeis主从复制2.1安装redis2.1.1环境准备2.1.2安装redis2.1.3设置环境变量2.1.4定义systemd服务管理脚本 2.2修改 Redis 配置文件(Master节点操作2.3修改 Redis 配置文件&#xff0…

SpringBoot项目-双人对战五子棋实验报告

简单五子棋Web项目报告 课 程 Web应用程序设计 项目名称 简单双人五子棋对战 成绩 专业班级 XXX 组别 无 学号 XXX 指导教师 XXX 姓 名 XXX 同组人姓名 无 完成日期 XXX 功能描述 1.用户的注册及登录功能 玩家可以在完成游戏账户的注册&#xff0c…

CentOS Stream 10 计划已启动,即将进入初始化阶段

导读 但初始化的 CentOS Stream 10 暂时不会对外开放,也不会有太多活跃信息。从 Fedora 周期的规律来看,至少还有六个月的时间,CentOS Stream 10 才会正式启动开发流程,接受来自外部的贡献。周五的公告指出:你会看到 C…

STM32文档

一、寄存器缩写 二、存储器和总线构架 DMA,全称为:Direct Memory Access,即直接存储器访问 简而言之,DMA就是将一个内存里的数据搬运到另一个内存里,此过程无需CPU直接控制输出 系统架构存储器组织存储器映射&#xf…

TypeScript 【type】关键字的进阶使用方式

导语: 在前面章节中,我们了解到 TS 中 type 这个关键字,常常被用作于,定义 类型别名,用来简化或复用复杂联合类型的时候使用。同时也了解到 为对象定义约束接口类型 的时候所使用的是 Interfaces。 其实对于前面&#…

从架构角度看网络安全:数字化时代企业如何构建防御体系?

导语 | 数字化时代,网络安全已经成为企业发展的重中之重,通过体系化的安全建设,企业可以从容应对愈加复杂的网络安全挑战。今天,我们特邀了腾讯云 TVP、赛博英杰科技董事长 谭晓生老师,他将从资深技术专家视角解读如何…

【软考网络管理员】2023年软考网管初级常见知识考点(22)- 交换机配置及命令

涉及知识点 华为交换机配置命令大全,交换机设备参数设置 , 交换机路由器的基本配置,交换机命令汇总 , VLAN 配置 , GVRP 配置 , STP 配置,软考网络管理员常考知识点,软考网络管理员…

STM32外设系列—BH1750

文章目录 一、BH1750简介二、BH1750原理图三、BH1750数据手册3.1 指令集3.2 IIC通信读/写 四、BH1750程序设计4.1 IIC程序4.2 BH1750初始化程序4.3 读取BH1750测量结果4.4 获取光照强度4.5 相关宏定义 五、应用实例六、拓展应用6.1 实时调节LED亮度6.2 实时调整颜色阈值 一、BH…

【C#】云LIS检验医学信息系统源码

系统基于云计算为医院机构改善患者服务质量提供了强有力的支持,“以患者为核心”这一理念得到了充分实现,基于云计算的高效区域医疗信息服务,会为医疗行业带来跨时代的变革。 一、使用技术框架说明 开发语言:C# 6.0、JavaScript …