NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

  • 2019-12-02
  • 本文字数:3642 字

    阅读完需:约 12 分钟

京东分布式向量检索系统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 等等)。


图1


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


图2


标量字段范围查询


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


插件服务


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


图3


功能列表


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


表1


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


实现过程


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


图4


性能表现


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


图5


召回率测试结果


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


表2


应用场景和案例


vearch 主要的应用场景有:


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

  • 安防领域视频智能监控

  • 文本相似度计算;

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


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


图6


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


图7


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


图8


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


图9


使用方法


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



搭建完成后,直接使用类似 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:

  5. 中文: https://vearch.readthedocs.io/zh_CN/latest

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

  7. 开源社区邮件联系方式:vearch-maintainers@groups.io.

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

作者简介

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


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


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2019-12-02 14:2611133

评论

发布
暂无评论
发现更多内容

为产业AI去障:联想的边缘突破

脑极体

架构师训练营第二周课后作业

天涯若海

极客大学架构师训练营

问题篇:附源码询问Pageable实现分页无法使用原生sql

小Q

Java 学习 架构 面试 springboot

数字“异化”生存

脑极体

阿里内部首发1000页涨薪面试宝典:Spring+SpringMVC+MyBatis框架整合开发实战

Java架构追梦

Java 源码 架构 面试 SSM框架

Netty源码解析 -- 零拷贝机制与ByteBuf

binecy

Netty 源码剖析

Java程序员必须人手一本的《码出高效:Java 开发手册》,免费分享PDF文档

Java架构之路

Java 程序员 架构 面试 编程语言

《Linux学习笔记》从常用命令、常用操作到网络管理、性能优化,无论是Java开发或是运维都可以学习!

Java架构之路

Java 程序员 架构 面试 编程语言

十八般武艺玩转GaussDB(DWS)性能调优:总体调优策略

华为云开发者联盟

数据库 性能 调试

区块链是连接传统经济和数字经济的桥梁

CECBC

区块链 数字经济

区块链将构建数字社会高效的全球网络

CECBC

数字经济 数字时代

当 TiDB 与 Flink 相结合:高效、易用的实时数仓

Apache Flink

flink #TiDB

gRPC服务注册发现及负载均衡的实现方案与源码解析

网管

负载均衡 gRPC etcd 服务注册与发现 Go 语言

在阿里内部,做Java到金字塔顶端的人平时都如何学习源码?

小Q

Java 学习 架构 面试 程序猿

架构师训练营 - 第二周课后练习

joshuamai

解惑“高深”的Kafka时间轮原理,原来也就这么回事!

华为云开发者联盟

中间件 消息队列

第6周学习总结

饭桶

零基础IM开发入门(三):什么是IM系统的可靠性?

JackJiang

网络编程 即时通讯 IM

企业级RPC框架zRPC

万俊峰Kevin

RPC microser Go 语言

真香!天天996进不去阿里?看5年苦逼程序猿怎么逆袭阿里P7

小Q

Java 学习 架构 面试 程序猿

深度对比Apache CarbonData、Hudi和Open Delta三大开源数据湖方案

华为云开发者联盟

hadoop 开源 数据处理

技术实践丨PostgreSQL开启Huge Page场景分析

华为云开发者联盟

数据库 管理 内存

如何获取变量token的值

测试人生路

软件测试 接口测试

刚从蚂蚁金服Java研发岗面试回来(三轮游),我总结的面试经历(附面试题+答案)

Java架构追梦

Java 架构 面试 蚂蚁金服

测试悄然扩围 千万元红包搅活数字货币江湖

CECBC

数字人民币

与其思考公司该为员工提供什么福利,不如思考有哪些 “福利” 不应该提供!

非著名程序员

个人成长 管理 福利

Vidyo独特的互联网适应性

dwqcmo

音视频 集成架构 解决方案 智能硬件

DeFi流动性挖矿系统开发技术方案

薇電13242772558

区块链 defi

LeetCode题解:78. 子集,迭代+位运算,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

天呐!价值2980元Java成神面试题竟在Github开源了

996小迁

Java 学习 架构 面试

JAVA稳定底层,快速开发首选,XJR智能化客户关系管理

Marilyn

敏捷开发 快速开发 软件架构 客户关系管理

京东分布式向量检索系统vearch如何一招搞定海量特征存储与计算?_AI&大模型_李洁_InfoQ精选文章