马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
基于ElasticSearch的向量检索技能实践
作者:Tableau
原文所在:https://zhuanlan.zhihu.com/p/620260383
图片、视频、语音、文本等非布局化数据可以通过人工智能技能(深度学习算法)提取特性向量,然后通过对这些特性向量的盘算和检索来实现对非布局化数据的分析与检索。 针对向量检索常见的应用场景有:
- 图片辨认:以图搜图,通过图片检索图片;人脸辨认
- 天然语言处理处罚:基于语义的文本检索。
- 声纹匹配:音频检索。
- 电商保举:提取用户个性化特性或是商品的个性化属性,进步保举模子的准确性,得到更加准确的保举效果。
- 知识图谱:智能搜刮,智能问答,个性化保举。
后续研究实践,以人脸为例,举行讨论先容。
向量检索面临的挑衅重要在以下几个方面
- 高维数据:向量数据维度通常是 256/512 维。
- 海量数据:在电阛阓景图片搜刮大概商品知识图谱等,
- 向量数据通常在万万到亿别级别。
- 高召回:为包管检索效果,精度召回率通常要求 95% 以上。
- 高性能:为包管用户体验,向量检索的相应要求毫秒级。
工程落地面临的挑衅
- 体系高可用:必要实现一个分布式高可用体系
- 向量检索算法:必要根据差别场景,召回率和性能要求使用差别算法,并举行性能优化
- 通用的向量检索:实用于各种场景
- 与传统搜刮连合:在向量检索的同时,必要其他一些业务字段的查询,过滤,和排序
向量检索简介
向量检索与呆板学习分类题目
在人脸辨认的过程中,输入的人脸图片会转化为人脸特性值向量生存在盘算机中作为人脸库,假设右图方块体现小王的多个人脸图片的特性值向量,三角体现小李的多个人脸特性值向量绿色向量体现输入的一张未知人脸图片的特性值向量。使用两向量的隔断评估两向量体现的人脸的相似度在右图中与绿色新向量隔断迩来的为一方块向量,因此以为新输入的图片最有大概是小王的人脸图片。与人脸辨认题目雷同的其他的呆板学习分类题目中,向量检索也是应用流程中的告急环节。
向量隔断
KNN 检索最告急的子题目是怎样评估任两个向量间的隔断,呆板学习聚类算法中最常用的隔断是欧式隔断和余弦隔断。对某二维平面上两点
**欧式隔断:两向量尽头连线的长度
**余弦隔断:两向量夹角的余弦值
即:在向量归一化后,欧式隔断与余弦隔断等效,但在举行向量隔断的矩阵运算时,欧式隔断有显着的性能上风,因此向量检索体系同一使用欧式隔断作为评判标准。
FAISS库先容
Faiss是Facebook AI团队开源的针对聚类和相似性搜刮库,针对稠密向量计划和优化,可以提供高效的聚类运算和搜刮运算,也是当前最受欢迎的近似近邻搜刮库,使用C++开发,源码逻辑清晰布局简朴提供C++和Python两种接口,提供了搜刮算法的GPU实现,可扩展性强我们可以通过Jni封装来实现ES的Faiss插件。
Faiss支持浩繁搜刮算法,主流的算法有:
- IndexFlatL2 和IndexFlatIP:使用BLAS库优化的暴力搜刮。
- IndexHNSWFLat:HNSW(Hierarchical Navigable Small World)算法占用空间大,召回率高,索引时间长,搜刮时间短。
- IndexIVFFlat:基于聚类的子空间搜刮算法。
- IndexLSH:局部敏感hash,基于hash的子空间搜刮算法。
- IndexPQ:类PCA的量化搜刮算法。
- IndexIVFPQ:基于积量化的子空间搜刮算法。
搜刮算法优化的本质都是在空间、时间和召回率上的弃取必要根据差别业务场景,召回率和性能要求使用差别算法,并在样本集上面举行参数调优。
向量检索服务计划
以常见的人脸辨认服务为例,先容分析差别的向量检索方式;
传统向量检索方案
数据生存在数据库中,索引使用 Flann 构建每台服务器负责固定检索使命每个向量库仅由一台呆板负责检索,若呆板宕机,干系服务将无法访问Flann 搜刮服从低下,浪费了大量的盘算资源无法平衡负载单机内存受限无法扩展当前的向量检索体系 。 索引使用 Faiss 构建,生存在多台服务器上通过Ribbon控制搜刮哀求的负载平衡添加和更新文档时必要全部生存该索引的服务器同时见效,无法包管数据同等性每台呆板都是全量数据还是突破不了单机内存的限定,体系重启逻辑复杂向量检索现有办理方案先容(含竞对)。
向量检索现有办理方案先容(含竞对)
ElasticSearch
概念先容
- 节点:单个ES实例
- 集群:由一个或多个节点构成,他们具有雷同的 cluster.name 并协同工作。集群会感知节点的加入和退出并自动处理处罚数据同步和负载平衡
- 分片:ES分布式体系中的存储最小单元,一个分片就是一个Lucene实例,是ES的最小工作单元 分片分为主分片和副天职片,副天职片是主分片的复制和备份。副天职片可以有多个但主分片有且仅有一个
- 索引:恣意个分片的聚集
- 分片对用户不可见,是ES构因素布式体系的内部组件,多个分片作为一个索引与用户交互
- 盼望可以使用分布式服务办理题目,包管数据和检索服务的冗余性和同等性
向量检索体系办理方案
集群中共包罗 Master 节点、Data 节点、Requesting 节点三种脚色
- Master 节点负责管理集群和数据的同步
- Data 节点加载 Faiss 实例负责实验向量搜刮工作
- Requesting 节点负责罗致哀求并平衡 Data 节点负载
ElasticSearch 恰好满意我们的分布式需求,但是原始的 ElasticSearch 不支持向量检索。
人脸搜刮集群计划
- ES充当体系中分布式数据库和分布式索引库的脚色,ES负责数据的备份,包管数据的安全性。
- ES中的最小可访问单元为index,单个index不限定存储数据量,index内部通过增长分片来包管搜刮的低延时性,多分片分布式搜刮的再排序过程由ES中的master节点负责,取消上层平台的group分片机制与再排序过程
- 每个index包罗至少一个主分片和两倍的副天职片,数据三倍冗余
- ES使用轮询机制处理处罚负载平衡
- ES负责分片的备份和同步
- 集群共8台呆板,此中2台负责负载平衡、
- 同步和谐等工作,6台负责搜刮
- 体系包管在两台搜刮呆板同时宕机的环境下仍可正常提供服务
集群原理与鲁棒性--数据同步
- master收到哀求
- master通过hash函数确定分片位置,转发哀求
- node1更新主分片并发送副天职片更新哀求给node2、node3
- 增、删、改操纵先在主分片上乐成完成,然后复制到副天职片
- 每次更改时向副天职片的同步过程都是将整个分片完备复制
- 本质上不支持修改操纵,通过删除和增长间接实现
- 本质上不支持删除操纵,通过增长删除标记实现和index重修来实现
集群原理与鲁棒性--根本搜刮与负载平衡
- master收到哀求
- master通过hash函数确定主分片和副天职片位置,根据轮询机制确定实验节点,转发哀求
- node2实验检索并返回效果到master
- 表示图中使用单个master节点指代集群的requesting node
- 表示图中使用单个master节点指代集群的requesting node 集群原理与鲁棒性--分布式搜刮(多分片搜刮)
- Query
- master收到哀求
- master确定分片位置并转发哀求
- node1、node2实验搜刮并返回效果到master
- Fetch
- master向node1、node2哀求搜刮效果中的文档原文
- node1、node2返回文档
- master对全部备选文档再排序后返回给客户端
集群原理与鲁棒性--集群横向扩展
- 假如哀求量增大或数据量增长,可以对集群举行横向扩展。向集群中增长 Worker 范例节点,新增节点设置与原集群雷同的 cluster.name。
- 集群会自动发现新节点并向其分配分片以平衡负载。
集群原理与鲁棒性--故障处理处罚
- 由于节点宕机或节点掉线造成访问超时视为节点退出集群。
- 集群管理节点发现非常后查抄是否全部主分片都存在。
- 若发现主分片缺失将提拔对应副天职片为新的主分片。
向量检索插件实现
Lucene 条理实现 – 使用 codec 扩展机制
集成 KNN 插件后的向量检索逻辑流程
向ES添加插件
- ES具有扩展插件的功能,在ES的 org.elasticsearch.plugins.Plugin 包中,界说了常用的一些插件的基类和接口。
- ES支持API Extension Plugins ,即API扩展插件,通过这个扩展可以实现自界说的搜刮功能
- public class KNNPlugin extends Plugin implements MapperPlugin, SearchPlugin, ActionPlugin
- 为了添加自界说数据范例和搜刮方法,继承Plugin 类并使用java语言实现干系接口:public class KNNPlugin extends Plugin implements MapperPlugin, SearchPlugin, ActionPlugin
- 将编译好的插件jar包放置在ES的plugin目次下,重启ES即可自动加载插件 扩展Lucene功能
ES的搜刮功能现实上是Lucene实现的
- Lucene可以通过扩展codec来提供对自界说检索和自界说存储的支持。
- 常见的高性能搜刮框架都是使用C/C++实现的,使用Java语言继承Lucene的codec基类并实现干系功能,涉及到索引的部分通过Jni调用C++搜刮库来实现。
详细实现方法:
- 继承org.apache.lucene.search.IndexSearcher、org.apache.lucene.search.Query、 org.apache.lucene.search.ScoreMode、org.apache.lucene.search.Weight、org.apache.lucene.codecs.Codec等类并实现对应方法来扩展Lucene的codec。
- 通过Jni调用C++完成详细索引的构建和使用。
ElasticSearch 条理实现 – 使用 ElasticSearch Plugin 机制
为了在ElasticSearch中添加 KNN 插件的入口,我们界说了 knn_vector 这种 mapper type(数据范例) 和 knn 这种 query clause(查询子句)
KNN 插件兼容性测试
KNN 插件完善兼容 ElasticSearch 及 Lucene,可与 Lucene 内置的各种检索方法自由组合
生产摆设与监控
生产摆设:
现在,基于ES向量检索体系生产摆设使用自运维方式,必要手动将ES安装包和插件拷到呆板上面,然后举行设置。
监控 :
prometheus(普罗米修斯) 和grafana可视化看板,必要在呆板上面安装ES的探针
怎样提拔性能?
- 公道设置分片数量
- 只管使用过滤器
- 过滤器常常用在查询分类效果上。它可以用查询子句限定来更换,区别在于使用Query将影响文档的得分,而Filter不会
- 预热
- 提进步行搜刮
- 段归并
- 索引中拥有更少的Segment,搜刮速率将更快
怎样估算向量检索呆板内存和磁盘?
- ES JVM约莫12G到16G。
- 1万万512维向量约莫占20G,两倍数据冗余必要内存乘以3。
- faiss IVF算法,练习必要额外内存。
- ES会生存额外倒排索引,词字典等额外索引信息,一些小文件会常驻内存。
- 对于不常用索引,会从内存中卸载。
- 磁盘占用包罗:ES lucene的索引文件,faiss 向量序列化文件。
向量检索后续探索实践
|