立即领取|华润集团、宁德核电、东风岚图等 20+ 标杆企业数字化人才培养实践案例 了解详情
写点什么

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


2019-12-02 14:2611636

评论

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

【高并发】解密导致并发问题的第三个幕后黑手——有序性问题

冰河

并发编程 多线程 协程 异步编程 精通高并发系列

传统链游的革新,PlatoFarm用实际行动回馈Dao社区

BlockChain先知

怒肝 JavaScript 数据结构 — 栈篇(二)

杨成功

数据结构 4月月更

在线XML转JSON工具

入门小站

工具

C++后端开发进阶学习大纲指南

赖猫

c++

MariaDB 的自增字段 AUTO_INCREMENT 字段

HoneyMoose

前端食堂技术周刊第 32 期:2022 年 3 月 TC39 会议、Rome Formatter、Node 内置 Test Runner

童欧巴

JavaScript 程序员 前端 web前端

关于数据湖几个问题详细剖析

五分钟学大数据

数据湖 4月月更

Redis集群架构剖析(5):复制与故障转移

非晓为骁

主从复制 redis cluster master

焱融看|AI 如何驱动存储发展

焱融科技

云计算 AI 分布式 高性能 文件存储

Java 在 IntelliJ IDEA 中提示 set the language level 9

HoneyMoose

从分层架构到微服务架构(五)之服务化架构

元闰子

架构 从分层架构到微服务架构

基于 HTML+CSS+JS 的纸牌记忆游戏

海拥(haiyong.site)

html 游戏 4月月更

我真不信,这年头还有人能懂SpringBoot的ClassLoader加载机制

Java工程师

Java spring 程序员 科技

linux之ssh命令

入门小站

Linux

架构师作业2

小虾米

架构师实战营

[Day9]-[动态规划]编辑距离

方勇(gopher)

LeetCode 动态规划 数据结构算法

【Zeekr_Tech】汽车软件敏捷开发和分支管理

Zeekr_Tech

敏捷开发 智能驾驶

数字产业化快于产业数字化?

WorkPlus

Go 实现 WebSockets:1.什么是 WebSockets

宇宙之一粟

Go 4月月更

订单管理系统(OMS)搭建实战 - 低代码拖拽定制订单管理系统

蒋川

低代码 低代码开发 低代码平台 订单系统 订单管理系统

netty系列之:netty中的核心解码器json

程序那些事

Java Netty 程序那些事 4月月更

Apache flink - PartitionNotFoundException

李印

flink 消费 kafak 错误排查

云上MongoDB常见索引问题及最优索引规则大全

MongoDB中文社区

mongodb

Hoo虎符研究院|一图了解币圈后浪Magic Eden

区块链前沿News

虎符研究院

设置 Jupyter Notebook 主题

信号量

Python Jupyter Notebook notebook 主题 科学计算

自己动手写Docker系列 -- 5.3实现logs命令查看容器日志

golang Docker

微信朋友圈的高性能复杂度

哈喽

「架构实战营」

互联网的下一站,大概率是能源

脑极体

C++11 智能指针之shared_ptr<void>

轻口味

c++ android 4月月更

Java 初始化 List 的几种方法

HoneyMoose

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