Categories
程式開發

京东分布式向量检索系统vearch如何一招搞定海量特征存储与计算?


随着算法能力的不断提升,图像、音视频和文本等均可通过机器学习算法抽取大量的特征应用于业务场景,例如以图搜图、听音识曲、视频相似度检测、人脸识别等,不过目前尚无一套完整的系统解决方案来满足高维特征向量的存储与计算。

为了让AI算法领域的专家能够更专注于算法,京东零售技术架构团队基于现有的部分业务及应用场景抽象提炼了一个服务于AI时代的基础向量检索系统——vearch,它可以完整地解决海量特征的存储与计算,为文本、图像、音视频检索等应用提供统一的基础设施。

项目背景

vearch 是一个分布式向量搜索系统,可用来存储、计算海量的特征向量,为AI领域的向量检索提供基础系统支撑与保障。该系统能够广泛地应用于图像, 音视频和自然语言处理等各个机器学习领域。

vearch基于Facebook AI研究院开源的 Faiss 实现,但Faiss本身只是一个能够单机运行的支持各种向量检索模型的机器学习算法基础库,不支持分布式、实时索引和检索,同时也不支持标量字段的存储和索引等等。

因此结合在实际应用中的需求,我们在faiss的基础上研发了vearch,提供了类似ElasticSearch的灵活易用的RESTFul API,可以方便地对表结构及数据进行管理查询。

系统架构

vearch的向量检索系统架构如图1所示,主要由Master,Router 和Partition Server(PS)三部分组成:

  • Master: Master对整个vearch集群的资源进行调度和管理,这些资源包括数据分片的位置,数据schema的结构,并对集群中各节点的状态进行监控和分片的调度,保证整个集群中所有节点的负载相对均衡,对集群水平拓展提供可靠支持。

  • Router: 是一个无状态且轻量的路由模块,负责对用户所有的请求进行解析路由和转发。对入参提供校验,给用户提供基于Restful数据管理的接口,及权限控制,因为是分布式系统, router还负责将各个partition上的结果集进行合并二次排序筛选。

  • Partition Server(PS): 是存储及重要的计算节点,可以支持上百个实例, 一个partition server上可以存在多个partition,这些partition 之间互相独立由 master + router进行统一管理查询。partition server的内核采用gamma引擎进行索引及数据存储。

数据模型主要包含空间、文档、向量、标量。一个空间可以创建多个文档,一个文档由多个字段组成,每个字段可以是向量类型,也可以是标量类型(int, float, string等等)。

image

vearch基于raft协议实现数据多副本存储,保证系统数据的高可用,同时可以很方便地支持横向弹性扩展。为满足实际业务场景需要,vearch还提供了算法插件服务模块,通过选择默认的VGG,Resnet或自定义算法模型等,能够提供一键式端到端的图像检索,视频流智能监控等业务应用场景的完整解决方案。

考虑到开发及可扩展性,vearch中的Master,Router和PS均采用GO语言编写。出于性能考虑,核心的存储检索引擎gamma基于faiss采用c++语言实现。在faiss基础上,gamma引擎根据实际业务场景需要,做了一系列的定制开发。主要包括:

1、高性能,无锁向量实时索引,支持add, delete和update三种基本更新操作

2、支持文档中常规标量字段的存储和索引

3、支持按标量字段的范围过滤查询

4、支持文档多标签的实时存储及检索

5、通过IVFPQ等量化检索模型召回后,提供了召回TopN原始向量的精排功能

6、支持原始向量,标量,向量索引和标量索引的持久化

7、支持单文档多向量的存储及检索

8、支持基本的交,标量字段范围过滤等组合查询语法

为了提升检索召回及排序的质量,在实际应用场景中,通过量化,Hash及图等检索模型召回后得到的TopN候选集,需要进一步比对计算其原始向量距离。因此在实际生产环境及成熟产品应用中,庞大原始向量的存储是不能逃避开的一个问题。

vearch提供了自主研发的内存+磁盘混合存储和rocksdb两种存储方式。向量存储有其固有的特点,比如定长,所占空间比较大,连续存储的话可以压缩,另外也可以考虑分桶聚簇存储,基于以上种种特点,自定义存储结构可优化空间比较大。

具体在使用时,原始向量的存储可根据性能及使用条件限制,配置选择常见的全内存,内存+磁盘混合存储,以及rocksdb三种存储方式。内存+磁盘混合存储和rocksdb均可通过参数配置使用内存的大小,在查询性能和实际使用的机器资源情况之间做出合理的tradeoff。

  • 全内存储方式:低延迟,可存储数据规模受限于实际内存可使用量

  • 向量顺序存储

  • 定期dump增量到文件

  • 内存+磁盘混合存储方式: 延迟不敏感,可存储数据量受限于磁盘总量,远大于内存版

  • 向量先缓存到内存

  • 定时异步批量刷盘

  • Mmap磁盘文件到内存

  • Rocksdb

  • Key是向量ID(自增),value是向量数据

vearch允许用户自定义table中的字段,它支持以下6种字段类型,其中vector类型表示该字段是一个向量字段:1、vector(向量);2、string;3、int;4、long;5、float;6、double

image

标量字段范围查询

该功能实现了等值过滤以及范围过滤,可以缩小以及锁定搜索范围,避免对不符合要求的向量冗余计算,从而使得性能有较显著的提升,其主要采用高性能B树实现。具体API应用示例:“filter”: ( “category”: {“eq”: 655}, “price”: {“gt”: 10, “lt”: 20} )

插件服务

vearch提供了一种可以将图片自动转化成向量数据的服务,使用者可以实现即插即用,其主要架构图如下:

image

功能列表

vearch 目前事支持的主要功能有如表1所述:

image

更多可参考:https://vearch.readthedocs.io/zh_CN/latest/

实现过程

如下GIF图清晰地展示了vearch的总体用法及其内部结构。 vearch的使用主要分为三个步骤。 首先,创建数据库和空间,然后导入数据,最后可以搜索自己的数据集。

image

性能表现

图5是在我们的测试环境基于图片提取的512维VGG特征做出的测试结果,从量化索引召回top 100后,对召回top100的原始向量都做了进一步精排,从图中我们发现,对VGG十亿量级的数据量,使用了数据过滤后,QPS平均提升了4-5倍,极大地降低了计算的复杂度。

image

召回率测试结果

在我们的测试环境中采用默认参数配置(ncentroids=256, nprobe=20, nsubvector=64, nbits_per_idx=8),召回测试详情如下图所示。基于vgg1M(100万)特征向量数据集召回率平均在0.95以上,在vgg10M(1000万)特征向量数据集的数据量召回率也在0.92以上。

image

应用场景和案例

vearch主要的应用场景有:

  • 图像/视频/音频检索和去重;

  • 安防领域视频智能监控

  • 文本相似度计算;

  • 推荐,搜索召回及排序;

案例1:人脸识别底层特征向量存储、计算引擎,如图6所示,目前已经应用到京东之家业务中,为业务过滤掉了40%左右的不良数据。

image

案例2:vearch可提供实时在线相似性图片搜索服务,比如在电商平台可以用来搜同款。详细流程如图7所示:

image

案例3:海量重复图片去重,在目前已经应用到了京东重复铺货检测,如图8所示:

image

案例4:可应用于搜索,推荐系统。比如视频网站推荐系统将各种特征embedding成向量后,利用向量相似性检索做召回,召回模型细节如图9所示:

image

使用方法

使用方法非常简单,只需两步就可以轻松搭起一个分布式向量检索系统:

搭建完成后,直接使用类似ES的RESTFul API:

https://github.com/vearch/vearch/blob/master/docs/APILowLevel.md

即可建库建表,插入文档向量,直接开始使用了。

除此之外,目前算法插件服务模块还支持视频流的人脸智能监控。欢迎感兴趣的算法工程师们贡献更多,更丰富,更智能的算法插件。

项目信息:

目前vearch项目已经开源:
https://github.com/vearch/vearch,

项目设计的相关论文“The Design and Implementation of a Real Time Visual Search System on JD E-commerce Platform”已被 International ACM Middleware Conference 接收发表。

未来规划

  • 集成更多更丰富的检索模型,比如HNSW,IMI,OPQ等等,更进一步提升召回率;

  • 规划设计vearch部署环境实时管理前端界面需;

  • 更丰富的算法插件,比如文本语义embedding算法插件,音频embedding算法插件。

参考资料:

  1. vearch website:https://vearch.github.io/

  2. Github: https://github.com/vearch/vearch

  3. Paper link:https://arxiv.org/abs/1908.07389

  4. Document:
    中文: https://vearch.readthedocs.io/zh_CN/latest

    英文: https://vearch.readthedocs.io/en/latest

  5. 开源社区邮件联系方式:[email protected]

  6. Slack: https://vearchwrokspace.slack.com

作者简介

张丽颖,CNCF官方大使,京东技术架构部产品经理,主要负责分布式文件存储,以及分布式检索服务; 开源项目ChubaoFS和vearch的contributor。

李洁,京东技术架构部副总监(技术专家),拥有近十年一线互联网公司系统架构研发经验,擅长大数据量、高并发、高性能分布式系统的设计开发,尤其在图片、视频、文本搜索的系统架构方面有丰富的设计开发及研究经验。开源项目vearch的maintainer。