cover_image

陌陌向量检索引擎工程实践

挚文研究院
2023年02月03日 10:00

前言

全球每天产生的数据中,有80%是非结构化数据,常见的非结构化数据包括语音、图片、视频和语言文字等。通过深度学习等技术训练得到的模型对非结构化数据进行特征提取,将非结构化数据转换成一个多维的向量,这个过程称作Embedding。多维向量本质上是对非结构化数据在高位空间的映射,而向量检索就是对这些生成的向量进行检索,从中找到最相似的若干个向量。

非结构化检索本质是向量检索技术,其主要的应用领域如人脸识别、推荐系统、图片搜索、视频指纹、语音处理、自然语言处理、文件搜索等。随着AI技术的广泛应用,以及数据规模的不断增长,向量检索也逐渐成了AI技术链路中不可或缺的一环,更是对传统搜索技术的补充,并且具备多模态搜索的能力。

 

向量检索

向量检索本质为了求解KNN和RNN两个问题,KNN(K-Nearest Neighbor)是查找离查询点最近的K个点,而RNN(Radius Nearest Neighbor)是查找距离查询点某半径范围内的所有点或N个点。在涉及到大数据量的情况下,百分之百准确求解KNN或RNN问题的计算成本较高,于是引入了近似最临近ANN(Approximate Nearest Neighbor),向量检索实际要解决的是ANN的问题。

为求解ANN的问题,业内提出了不少的检索算法,可以将ANN的方法分为三大类:基于树的方法、哈希方法、矢量量化方法。不同的ANN算法,在索引构建和查询的时间复杂度各不相同,但基本上符合"召回率越高,QPS越低"。向量检索在发展过程中,也涌现出了一些优秀的开源作品,如FLANN、Faiss等,但是这些开源库在构建向量索引时都是面向单机资源的,单机内存资源上限也制约着整体向量的规模,当然还有索引版本管理,上下线等问题。此外有些对数据延时要求比较高的,还会额外关注索引是否能够增量或者实时更新。

针对上述需求,我们自研了VRE(Vector Retrieval Engine)向量检索引擎。VRE是一个云原生、分布式、开箱即用的ANN向量检索系统。支持实时插入、更新、删除等操作。

 

VRE设计与实现

整体架构

 

图片VRE架构图 

VRE整体架构实现如上图所示,整体主要包括Master、Worker、Trainer三个核心模块。用户插入的向量数据通过TiDB来做持久化,TiDB作为一个分布式数据库,可以实现海量数据的存储。元数据持久化存储在基于Raft的Consul中,可以保证元数据的一致性。Master和Worker以及Trainer的通信通过Redis的发布订阅模式来实现,Redis作为消息队列,可以保证消息的顺序性、低延迟,在VRE中通过Redis可以保证请求得到快速响应。HDFS用来持久化存储Trainer训练好的索引,Worker可以快速从HDFS加载属于自己的索引,将索引训练模块Trainer和索引加载模块Worker进行了解耦。

VRE的核心能力主要有以下几点:

  • 支持超大规模索引构建和检索:目前VRE可以支持亿级以上规模数据集快速构建索引和进行检索

  • 支持数据实时插入、删除、更新,即增即查、即删即查

  • 支持高并发,通过多副本机制,单业务可以支持上万QPS实时查询检索操作

  • 各个模块无状态,可水平扩展

  • 支持范围查询,支持指定距离范围内进行查询检索

 

Master模块

Master模块主要负责接收客户端的请求以及管理Worker节点。

Master是无状态的,可以通过水平扩容来提高并发处理能力。Master对外提供了HTTP和RPC服务接口,客户端可以根据实际情况选择请求方式。Master负责的工作主要包括以下四点:

  1. 响应客户端发起的业务请求操作,包括业务的创建、变更、删除,向量的插入、检索、变更等操作。

  2. 维护元数据,Master通过与Consul交互来维护整个集群的元信息,元信息主要包括业务信息,集群信息,业务索引统计信息,系统配置等。

  3. 处理Worker发送的心跳请求,即Worker的管理也由Master负责,当Worker不可用时,Master会将该Worker从集群中移除。

  4. 来自管理员的操作,如集群节点扩容、下线,索引副本数变更等。

 

Worker模块

Worker模块主要负责响应执行Master发送过来的请求,主要包括向量检索,向量实时添加与删除,重载索引,节点下线等。

Worker通过异步的方式加载属于该Worker的索引,Worker会不断从Redis中接收Master发送过来的向量检索请求进行处理,将检索到的符合要求的结果缓存至Redis中,当所有符合要求的结果保存至Redis中后,Master会取出结果集并对结果集进行聚合操作,然后将聚合后的结果返回给客户端。

Worker还可以根据用户指定的距离范围来进行检索,只有符合给定距离的结果才会缓存至Redis结果集中。此外,Worker还会维护最近一段时间内删除的数据集,可以保证删除的数据立即生效,删除操作执行完后,在后续的检索操作中都不会被检索到。

 

Trainer模块

Trainer模块主要负责对向量进行训练来构建索引。

Trainer负责对所有业务下的全量向量数据按照Worker的数量进行切分,对每个分片上的数据进行训练来构建最新的索引文件。Trainer还可以根据不同的数据类型和数据规模来动态的为业务构建不同类型的索引,保证向量数据集上的索引是最优的。不同的业务可以设置不同的触发条件来触发索引的构建,Trainer本身也会根据向量数据的变更动态设置触发下次构建索引的阈值,当到达阈值时Trainer会重新构建索引。当最新的索引构建完成后,Trainer会将索引文件上传至分布式文件系统HDFS,通过HDFS既可以保证索引数据不丢失,还方便后续Worker下载索引。

此外Trainer还实现了业务的TTL功能,根据TTL来定期异步的清理业务过期的数据。该功能特别适合只检索和保存最近一段时间范围内数据集的业务场景,TTL功能可以避免数据集不断增长导致检索性能下降的情况。

 

VRE性能

目前在向量检索系统中,用户比较关心的指标包括检索QPS、检索延迟、召回率或完成率等指标。VRE支持高QPS,支持给每个业务设置不同的检索延迟,完成率接近100%。

高QPS支持

向量检索是一个CPU密集型的操作,目前很多向量检索系统在单个业务QPS超过一千后就会出现CPU load过高,导致性能出现急剧下降并影响其它业务的正常查询。VRE系统通过多副本功能的支持,可以支持单个业务上万QPS的稳定查询,下图是某个nlp业务在4副本场景下的QPS请求指标:

 

图片文本检索QPS

 从上述监控指标中可以看到,4副本的情况下,VRE可以支持单个业务高峰期12k QPS。

 

支持不同检索延迟

向量检索的场景比较复杂,不同的场景下用户对检索的延迟要求不同,有的业务要求延迟在几十毫秒,有的业务要求延迟在秒级别。针对各种不同的延迟要求,VRE创新性的支持可以动态设置各个业务的检索延迟。VRE通过在客户端设置最长等待时间和在Worker端按照延迟参数来进行检索的设计来实现这一功能。下图是Worker端针对不同的业务执行检索的耗时:

 

图片检索耗时

 

上图中不同颜色代表不同的业务,可以发现,每个业务的延迟基本维持在一个固定的范围之内。

支持不同检索延迟额外带了2个方面的好处:

  1. 节省CPU的同时提升CPU的利用率,延迟越低的业务对CPU的占用率越高,不同的业务设置不同的延迟,可以更合理的分配CPU,避免了CPU的浪费,可以将更多的CPU资源分配给低延迟的业务。

  2. 提升VRE集群的容量,CPU利用率得到合理分配节省的CPU资源就可以用来接入更多的业务到VRE集群中。

 

高完成率

向量检索中常会用召回率(通常叫精度)来评估向量检索的效果,对于给定的q,其在数据集上的K近邻为N,通过检索召回K个近邻集合为M,则:Recall=|N & M|/K,召回越接近100%,代表索引效果越好。不同的向量检索算法,相同的检索算法不同的算法参数都会影响召回率。基于此,VRE支持用户根据自己的业务情况来设置不同的向量检索算法和参数,即用户可以变相的来设置自己业务的召回率。用户可以在接入实际生产环境前根据自己的业务需求来测试不同的检索算法及参数最终得到符合自己需求的检索算法和参数。在接入VRE生产环境时指定自己业务的检索算法和参数,所以实际生产环境中不同的业务算法及参数不同,召回率也不相同。

上面介绍Trainer模块时我们提到,某个业务的整个数据集是被划分成多个分片的,检索的时候需要在所有索引分片中进行检索。在用户指定好检索算法和参数以及设置好检索延迟之后,用户更关心的是查询的完成率,即在指定的时间延迟下,检索完成的索引分片占所有索引分片的比例。完成率越高,则检索结果越接近用户期望的召回率。VRE中完成率指标如下所示:

 

图片VRE业务完成率

 从上述监控指标可知,VRE完成率基本维持在100%,即每次检索,业务对应的所有索引分片都能保证在指定延迟时间内检索完成。这也就进一步保证,VRE的召回率与用户指定的检索算法和参数确定的召回率保持一致。

 

应用场景

目前VRE已经广泛应用到内容智能平台的几十个业务中,包含图片去重、文本检索、短视频相似检索、涉政敏感词过滤等场景。

Anti-Spam场景

Anti-Spam场景是目前VRE应用比较广泛的一个场景,当前的Anti-Spam已经从最初的反垃圾邮件延伸到了对文本、图片、视频等违规内容的过滤与处理。

内容智能平台的Anti-Spam系统通过模型训练对文本、图片、视频等数据集进行训练,通过训练好的模型将底库数据进行Embedding后存储至VRE。后续数据中心(CDN、对象存储等)的数据通过消息队列被Anti-Spam系统消费到,消费到的数据也会经过之前训练的模型转换为向量,然后去VRE底库中检索,根据检索结果来判断该数据是否是违规数据,如果是违规数据再通过审核中台等进行相应的处理。此外,底库数据集也会通过VRE进行实时的变更,来保证底库的丰富性和时效性。Anti-Spam系统的一条审核效果图如下所示:

 

图片Anti-Spam审核

假照识别

VRE的另一个应用场景是假照识别,整个假照识别的流程如下:

图片假照识别流

类似Anti-Spam场景,假照识别中也需事先对数据集进行模型训练(比如OpenCV等),生成假照模型,数据集通过模型进行特征提取(Embedding)然后插入到VRE系统中。业务方后续会一直维护底层数据集,实时或定期的更新底层数据集。

用户在上传图像或拍照上传时会用相同的模型对用户的图片进行特征提取,为了降低服务端的压力,这个操作可以放到用户终端进行。用提取出的用户图片的特征向量去VRE中进行检索,根据检索结果来判断用户上传的图片是不是假照。如果不是假照继续进行头像替换等操作,如果是假照,禁止用户执行后续操作。

技术展望

目前,开源界也涌现了一些比较优秀的向量检索系统,比如Milvus、Vearch等。其中,Milvus是关注度最高的,我们也一直在测试Milvus社区的产品,并将Milvus引入到我们的生产环境中来解决一些场景需求。此外我们与Milvus社区不定期进行线上线下交流,一直跟踪社区的最新进展,通过不断地交流来跟踪业内最新的向量检索进展与动态。

随着非结构化数据规模的不断增长,向量检索需求的场景越来越多。工程上,面对的场景将越来越广泛,也越来越复杂。如何支持更大规模的向量检索,如何提供更加丰富的检索算法来支持新的业务,如何更好的进行资源的隔离和优化是我们下一步工作的重点。



继续滑动看下一个
挚文研究院
向上滑动看下一个