我在哪?让 Milvus 给你答案—爱云动的 Milvus 实践

我在哪?让 Milvus 给你答案—爱云动的 Milvus 实践

文章作者:

周秀朋,爱云动架构师

李成龙,Zilliz 数据工程师

 

| 项目背景

爱云动是一家移动互联网科技公司,连接线上线下的运动人群与民间赛事,主要为运动员及赛事方提供赛事拍摄、实时上传、云端识别、即时送达、网络分发、推广传播、版权管理等服务。其中有一项重要的服务就是让运动员上传一张自己的照片,然后到赛事图片库中搜索出包含自己的赛事图片。通俗地讲,就是在摄影师上传的赛事图片里找到 “我在哪”。

赛事开始前,摄影师就开始上传各种赛前相关照片。随着赛事的进行,跑者逐渐拉开距离,摄影师们更是加速拍照。借助爱云动自己研发的相机即时上传系统,照片不断地实时上传到后台云端存储系统。强大的云端存储系统,保障了整套系统的上传速度。上传高峰可能会出现几百万人脸图片同时入库的情况。人脸入库后,前端要尽快能查询到,满足跑者对照片的期待。

 

| 项目难点及解决方案

为了让用户能在照片上传后尽快搜索到自己,实现整个检索服务有以下几个难点:

 

照片即时上传

当赛事开始以后,摄影师会持续地拍摄照片,为了保障照片上传入库的时效性,必须设计一套方案保证照片拍摄后能即时上传。爱云动研发了自己的相机直传系统,相机拍照和照片上传同步进行。摄影师设定好系统参数,只需要专心拍照,不需要考虑上传的问题,使用起来方便快捷。

 

海量存储

借助目前成熟的 AWS S3、阿里云 OSS(Object Storage Service)等云端存储系统,实现安全、快捷、海量的存储功能。

 

数据快速落地

为了应对海量数据的落地存储,爱云动根据自身的业务特点,对市场现有的分库分表系统做过比较后,决定研发自己的分库分表中间件。数据库存储实现横向扩展,减少磁盘读取对系统的影响。同时,将 Redis 作为缓存层,减少高并发对数据库的压力以及由此产生的其他问题。

 

人脸特征快速提取

爱云动采用自己研发的人脸特征提取系统,在保证高精度的前提下,将人脸图片压缩转换成 128 维的人脸特征向量进行存储。为了应对大并发上传的需求,特征提取系统采用动态横向扩容模式进行部署。具体做法就是,充分发挥云端 ECS(Elastic Compute Service)系统的优势,根据待处理任务队列中图片的多少,随时调整 ECS 系统的数量,从而实现动态扩容。

 

快速实现大规模向量检索

当大量的人脸特征被提取出来之后,就需要一个向量数据库来对海量的人脸特征向量进行存储和检索。考虑到爱云动的系统环境和业务情况,所使用的向量数据库必须满足两个基本要求:

  • 大规模的向量检索需要足够快;

  • 海量存储,成本要低。

爱云动最开始采用自己研发的人脸搜索系统,为了提升检索速度,所有数据都常驻内存。系统刚建设时,每年也就是百万级的照片量。这两年赛事业务飞速发展,2019 年一年的照片量就突破 6 千万。目前整个系统存储了上亿的照片,十几亿的人脸特征,这些数据让搜索系统越来越庞大,资源占用越来越多。为了保障搜索服务的高性能,只能不断地增加硬件投入。通过增加搜索服务器的数量进行横向扩容,增加内存和采用高性能 CPU 提高执行效率。但这样一来,服务器成本居高不下。为了节约运行成本和支持后续业务的更好发展,公司一直在酝酿对 现有系统的改造升级,尝试引入 Faiss 等向量索引库做优化处理。在调研中,无意发现了Milvus 系统。

Milvus 是一款开源的特征向量相似度搜索引擎,具有使用方便、实用可靠、易于扩展、稳定高效和搜索迅速等特点。Milvus 可以对接包括图片识别、视频处理、声音识别、自然语言处理等深度学习模型,为向量化后的非结构数据提供搜索分析服务。Milvus 的数据处理流程通常有以下几个步骤:

  • 通过深度学习模型或者其他算法将非结构化数据转化为特征向量;

  • 将特征向量导入 Milvus 库进行存储并建立索引;

  • 在 Milvus 中进行搜索,返回检索向量的相似结果。

我在哪?让 Milvus 给你答案—爱云动的 Milvus 实践

初步了解后,发现公司的业务完全能够迁移到 Milvus 系统中。公司从 2019 年底就开始对 Milvus 系统做测试。经过不断的深入了解,发现 Milvus 的性能很强劲,对数据支持多种索引处理,可以大大降低内存使用,同时提高搜索速度。而且,Milvus 系统版本更新很快。在我们测试期间,Milvus 官方就更新了多个版本。我们最开始测试使用的是 0.6.0 版本,经过几个月测试改造后,Milvus 官方已经更新到 0.10.1 版本了。

Milvus 系统很适合在爱云动这种依靠人脸特征进行图片搜索的业务中使用。通过人脸特征提取系统,将摄影师上传的赛事图片中的人脸进行检测并提取成特征向量导入到 Milvus 库,Milvus 对向量进行存储并建立索引。当用户上传一张自己的人脸图片进行检索时,首先把提交的人脸图像转化成 128 维的人脸特征向量,然后将这条特征向量拿到 Milvus 里面做搜索并返回相似向量结果。

在系统改造中,我们发现在 Milvus 系统中存储的每条人脸特征向量信息,没有存储附加信息的功能。与 Milvus 技术团队沟通后,得知在以后的版本中会支持这个功能。如果现在需要记录更多人脸信息,比如图片 ID、人脸坐标等,需要借助其他存储介质进行存储。我们把其他信息都存在数据库中,这样也能完成对业务的支持。Milvus 对每条特征记录都有唯一的主键 ID 并且可以自定义。为了把人脸特征和图片对应起来,我们改了 Leaf 算法(Leaf 是美团基础研发平台推出的一个分布式 ID 生成服务)的 ID 生成方法,让每个 ID 和业务存储数据库对应起来。这样,经过解析 ID,能够快速确定 ID 所在的数据库 ID 和其他信息,从而快速从业务数据库中查询出照片的其他信息。然后把数据库的查询信息和 Milvus 的查询信息合并后返还给业务调用者。

 

| 项目展示

用户打开爱云动 APP,首先展示的是当前最新赛事列表。点击图片,进入具体的赛事,顶部就会有人脸搜索入口。

 

 

我在哪?让 Milvus 给你答案—爱云动的 Milvus 实践

| 结语

本文从爱云动的实际场景出发,介绍了爱云动如何解决 “我在哪” 这个大规模人脸检索难题。项目引入了 Milvus 来进行特征向量检索,极大地节省了项目开发成本并显著地提高了系统检索性能。

希望 Milvus 在非结构化数据检索的道路上走得更远,为企业带去更多的价值。同时也希望更多志同道合的伙伴加入 Milvus 开源社区,一起参与、见证 Milvus 的成长。

 

 

| 欢迎加入 Milvus 社区

github.com/milvus-io/milvus | 源码

milvus.io | 官网

milvusio.slack.com | Slack 社区

zhihu.com/org/zilliz-11/columns | 知乎

zilliz.blog.csdn.net | CSDN 博客

space.bilibili.com/478166626 | Bilibili

我在哪?让 Milvus 给你答案—爱云动的 Milvus 实践