Milvus的执行引擎Knowhere

前言

本文将会介绍Knowhere这个概念,它是milvus向量执行引擎的核心。

概览

Knowhere是milvus向量咨询引擎的核心,它将好几个向量相似搜索库聚集在一起(包括faiss、hnswlib、annoy)。Knowhere也被设计支持异构计算。它控制在什么硬件(CPU或GPU)上执行索引构建和查询请求.为什么取Knowhere作为名字的原因就是因为它知道在哪里执行这些操作。更多类型的硬件包括DPU和TPU将会在未来的版本中进行支持。

milvus架构中的Knowhere

下图展示了milvus架构中Knowhere的地位:

最底层的那一次是系统硬件。第三方索引库位于硬件之上。Knowhere通过它上层的CGO来与索引节点和查询节点进行互动。CGO是一个允许通过GO包来调用C代码的组件。

Knowhere的优势

下面通过faiss来介绍Knowhere的优势

支持Bitset视图

milvus引入Bitset机制来实现软删除。软删除的向量仍然存在数据库当中,仅仅是不会再向量相似搜索或查询的时候参与计算。

Bitset中的每一位与索引的向量相对应。如果一个向量在Bitset中被标记为“1”,则表示该向量已经被软删除并将不会参与向量搜索。在Knowhere中,所有暴露出来的faiss索引查询api都会使用bitset参数,包括CPU和GPU索引。

对于二进制向量支持多种相似度算法

Knowhere支持Hamming, Jaccard, Tanimoto, Superstructure, 和 Substructure算法,Jaccard和Tanimoto可以被用来计算两个样本集的相似度。Superstructure和 Substructure可以被用来计算化学结构的相似度。

支持AVX512指令集

除了faiss已经支持的AArch64,SSE4.2和AVX2指令集,Knowhere还支持AVX512,相比于AVX2,AVX512可以提高20%到30%的索引构建和查询的性能。

自动选择SIMD指令

Knowhere支持在任何的CPU处理器(私有部署或者云平台)自动调用合适的SIMD指令(比如SIMD SSE, AVX, AVX2, and AVX512),所以在计算过程中不需要用户手动声明SIMD标志(比如“-msse4”)

Knowhere是通过重构Faiss的代码库构建的.依赖SIMD加速的通用的功能(比如相似度计算)被分离出来,针对每个功能,4个版本(也就是SSE, AVX, AVX2, AVX512)的实现已经被分离到不同的源文件。源文件在未来将会被相应的SIMD标志独立编译。因此,在运行过程中,Knowhere可以基于当前的CPU标志自动选择最好的SIMD指令和利用钩子链接最正确的函数指针。

其他性能优化

Knowhere代码结构

milvus主要进行向量和标量操作的计算,Knowhere仅仅负责向量索引的操作。

索引的数据结构独立于原始的向量数据。通常索引需要四个步骤:创建索引,训练数据,插入数据和构建索引。在有些AI应用中,数据训练是独立于向量搜索。数据集中的数据首先被训练,然后再插入到像milvus这样的数据库中进行相似搜索。例如开源数据集sift1M和sift1B就有不同的训练数据和测试数据。

然后,在Knowhere中,数据训练和搜索是一样的,Knowhere在段里面训练所有的数据,然后插入所有的训练数据并为它们构建索引。

DataObj:基类

在Knowhere中,DataObj是所有数据结构的基类。Knowhere中唯一的虚拟方法是Size()。Index类继承DataObj并且有一个“size_”的字段。Index类也有两个虚拟方法:Serialize()和 Load()。VecIndex类继承自Index,其也是所有向量索引的虚拟基类。VecIndex提供的方法包括:Train(), Query(), GetStatistics(), 和ClearStatistics()

其他索引类型列在了上图的右边。

  • faiss索引有两个基类:FaissBaseIndex:负责所有浮点数向量的索引;FaissBaseBinaryIndex:负责所有二进制索引。
  • GPUIndex:所有faiss GPU索引的基类
  • OffsetBaseIndex:所有自己开发索引的基类,假设在索引文件中仅存储矢量ID,则128维矢量的文件大小可以减少2个数量级。

IDMAP:暴力搜索

从技术上讲,IDMAP不是索引,而是用于暴力搜索。当向量插入到数据库,既不需要数据训练也不需要索引构建,就能直接搜索插入的数据。

然而,为了代码一致性,IDMAP也继承自VecIndex类,这样IDMAP也使用也就和其他的索引一样。

IVF索引

IVF(倒排文件)索引非常频繁的被用到。IVF类继承自VecIndex和 FaissBaseIndex,进一步扩展到IVFSQ和IVFPQ.GPUIVF继承自GPUIndex和IVF.它也进一步扩展到GPUINVFSQ,GPUIVFPQ.

IVFSQHybrid是自主研发的混合索引。当在CPU上面搜索桶的时候,粗放的量化器将会在GPU上面执行。这种类型的索引利用GPU的算力可以降低CPU和GPU之间的内存拷贝。IVFSQHybrid拥有和GPUIVFSQ一样的召回率同时还有更好的性能。

二进制索引的类结构相对比较简单,BinaryIDMAP和BinaryIVF继承自FaissBaseBinaryIndex和VecIndex.

第三方索引

当前除了Faiss,只有两种类型的第三方索引被支持:基于树的索引 Annoy和基于图的索引HNSW。这两个经常被用到的第三方索引都继承VecIndex.

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

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

相关文章

电商平台api接口:采购比价可用的比价工具推荐

电商平台api接口 目前,许多企业在进行内部采购时都有比价的需求。企业利用比价采购这一方式,能通过对比不同平台上、不同供应商的报价,进而选择最符合其需求和预算的产品或服务。 在比价采购的流程中,最重要的步骤就是企业在明确…

C#Csharp,SharpPcap网络抓包程序及源码(适合网络分析直接使用或源码二次开发)

目录 1.程序简介2.程序截图3.程序源码 1.程序简介 C#Csharp,SharpPcap网络抓包程序及源码(适合网络分析直接使用或源码二次开发) 2.程序截图 3.程序源码 https://download.csdn.net/download/xzzteach/89325817

沃创云外呼系统——能够企业带来什么样的帮助

沃创云外呼系统是一款功能强大的呼叫系统,能够助力企业提升营销效率,实现业绩增长。以下是沃创云外呼系统具体可以为企业带来的帮助 01节约成本 沃创云外呼系统能够自动拨打海量客户电话号码,降低企业成本,提高工作效率。使用沃创…

EI会议论文的格式和模板在哪里可以找到?

要找到EI会议论文的格式和模板,首先访问会议的官方网站,这是最直接的途径。会议网站通常在下载中心或投稿指南中提供详细的模板和格式要求。此外,你也可以查阅会议通知邮件、合作出版社平台、往届会议论文,或者直接联系会议组织者…

go语言中的一个特别的语法 //go:embed 可将将静态文件内容读取到string, []byte和 embed.FS 变量并直接打包到exe包中

go语言中的一个特别的语法 //go:embed 看上去像是注释,实则是golang中的一个内置的语法,而且是仅在你的go代码编译时生效的语法, 借助他我们可以将我们的静态资源文件读取到FS直接打包到我们的exe执行文件中。 同时他还支持文件的模式匹配…

计算机网络学习小结_数据链路层

数据链路和帧 帧:数据链路层传输基本单元。链路层将网络层传过来的数据构成帧发到链路上,并将发到链路层的帧取出数据交给网络层 数据报/分组/包:网络层传输基本单元 三个基本问题 即封装成帧、透明传输、差错检测 封装成帧 概念&#…

Docker Portainer使用

Portainer是什么 Docker Portainer是一个轻量级的 Web UI 管理界面,可以用来管理Docker环境。它提供了一个直观的控制台,用户可以通过它来管理Docker主机、容器、网络、卷等Docker资源。 Portainer的主要功能和特点包括: 容器管理:可以查看、启动、停止、删除容器,以及查看容器…

VSCODE调试C++(本人是openfoam求解器)时无法显示Vector,map等容器的值

一维数组&#xff1a; 可以在watch内添加表达式&#xff1a;*(type(*)[size])vectorName 例如&#xff1a;想查看vector<int> nums(6), 可以添加*(int(*)[6])nums。 上面是一维数组情况&#xff1a; ((double (*)[1000])&U[1000]) 表示从下标1000开始访问1000-200…

Qt 科目一考试系统(有源码)

项目源码和资源&#xff1a;科目一考试系统: qt实现科目一考试系统 一.项目概述 该项目是一个基于Qt框架开发的在线考试系统&#xff0c;主要实现了考试题目的随机抽取、考试时间限制、成绩统计等功能。用户可以通过界面操作进行考试&#xff0c;并查看自己的考试成绩。 二.技…

threejs的基本属性

1.创建场景,摄像机,渲染器,几何体,材质,网格 网格 物体材质 场景.add(网格),网格加入场景中 场景.add(坐标辅助器) 渲染 场景摄像机 相机的轨道控制器是个单独的对象 import ./style.css import * as THREE from three import { OrbitControls } from three/examples/j…

利用element实现简单右键

利用element-plus中的el-menu实现简单右键 实现如下 <template><main class"mainClass" contextmenu"showMenu($event)"> </main><el-menu:default-active"1"class"el-menu-demo"mode"vertical":col…

操作系统入门系列-MIT6.828(操作系统工程)学习笔记(一)---- 操作系统介绍与接口示例

MIT6.S081&#xff08;操作系统&#xff09;学习笔记 操作系统入门系列-MIT6.S081&#xff08;操作系统&#xff09;学习笔记&#xff08;一&#xff09;---- 操作系统介绍与接口示例 操作系统入门系列-MIT6.828&#xff08;操作系统工程&#xff09;学习笔记&#xff08;二&a…

8.11 矢量图层线要素单一符号使用三(插值线)

文章目录 前言插值线&#xff08;Interpolated Line&#xff09;QGis设置线符号为插值线&#xff08;Interpolated Line&#xff09;二次开发代码实现插值线&#xff08;Interpolated Line&#xff09; 总结 前言 本章介绍矢量图层线要素单一符号中插值线&#xff08;Interpol…

基于地理坐标的高阶几何编辑工具算法(4)——线分割面

文章目录 工具步骤应用场景算法输入算法输出算法示意图算法原理 工具步骤 选中待分割面&#xff0c;点击“线分割面”工具&#xff0c;绘制和面至少两个交点的线&#xff0c;双击结束&#xff0c;执行分割操作 应用场景 快速切分大型几何面&#xff0c;以降低面的复杂度&…

【Makefile】Makefile 编译 Keil 工程(Linux 环境)

本文使用的开发板为 stm32f103C8T6&#xff0c;使用的驱动库为stm32标准库。 目录 一、软件下载 1、stm32 标准库 2、arm-none-eabi 工具链 3、烧录器 二、Keil 工程改造 1、Keil 工程 2、基本 Makefile 工程 3、添加启动文件 4、添加链接脚本 5、去掉 core_cm3.c 三…

05Django项目--前端公共文件和其他html文件的适配

对应视频链接点击直达 Django项目--前端公共文件和其他html文件的适配 对应视频链接点击直达前端页面准备Pubilc页面设置 OVER&#xff0c;不会有人不会吧不会的加Q1394006513结语 接着上一节 前端页面准备 为了方便大家更好的复制&#xff0c;我把整个项目及templates文件夹和…

Buffer Pool中是如何管理Page页

Page页分类:在BP的底层采用的是链表数据结构管理Page。Page根据状态可以分为3中类型 1)free Page:空闲Page&#xff0c;未被使用的Page。 2)clean Page:被使用的Page&#xff0c;但是数据没有修改过。 3)dirty Page:脏页&#xff0c;被使用过的Page&#xff0c;并且数据被修…

FastDfs快速安装和数据迁移同步。Ubuntu环境

一&#xff1a;防火墙 ufw status 二&#xff1a;下载 分别是&#xff08;环境依赖&#xff0c;网络模块依赖&#xff0c;安装包&#xff09; git clone https://github.com/happyfish100/libfastcommon.git git clone https://github.com/happyfish100/libserverframe.git …

nginx服务器执行的过程

一:打包 1.打包前的分析 文件路径下npm run preview -- --report 生成打包之后的内容 2.解决有些内容体积过大的问题 1.删除有些不使用但是占用较多的,将main.js上import删除,打包时不会有 2.不能删除但是内容较大的 vue.config.js文件夹下 externals: { vue: Vue,…

Jenkins动态slave

目录 所需环境 安装nfs 部署Jenkins 安装插件 ​编辑添加凭据 配置动态slave 连接kubernetes集群 ​编辑配置Jenkins地址 ​编辑配置Pod模板 ​编辑确认代理端口 创建任务测试 在当今软件开发生命周期中&#xff0c;持续集成/持续部署&#xff08;CI/CD&#xff09;已…