关于后端:Milvus在电商广告中的素材搜索实践

37次阅读

共计 2213 个字符,预计需要花费 6 分钟才能阅读完成。

飞书深诺团体(https://www.meetsocial.com/)
是专一海内数字营销解决方案的综合服务团体,为中国出海企业提供可定制组合的全链路服务产品,满足游戏、APP、电商、品牌等典型出海场景需要,陪伴品牌应答海内市场的种种挑战。

技术背景:

在服务电商客户的场景下, 创意部门经常要为客户制作素材,如:广告图,宣传视频,宣传文案等。通过以图搜图, 以视频搜视频,文本搜文本的形式, 挖掘素材,可能为设计人员提供创意上的参考。同时,也依据一些其余条件(比方热度,成果值等)作为辅助搜寻的条件,帮忙创意人员抉择适合的素材。因而,利用 Milvus 向量检索引擎在内的一系列技术,为业务部门提供一个素材的综合搜寻零碎,就是此我的项目的动机。

 

技术选型:

因为业务接口须要实时返回,还须要接受肯定水平的并发负载,因而咱们认为 milvus 是比拟适合的向量检索工具。它对 FAISS, ANN 等工具进行了封装, 建设本人的存储文件构造, 同时提供了不便的服务化接口, 能够算的上开箱即用了。在放弃检索速度快的同时, milvus 能够通过参数设置,对向量检索的准确性,资源占用做肯定的 tradeoff,比拟适宜在理论工程中应用。

咱们在返回类似向量的同时, 还须要图片 / 视频的一些对应信息, 咱们通过 kv 的模式放在 redis 缓存里,放慢获取的速度。在 web 接口封装方面,思考到团队里 python 程序员占支流,咱们选用了 nginx + flask + gunicorn + supervisor 的 web 经典套餐。

应用到的各工具和框架:

  1. Milvus(图片 / 视频 / 文本的向量类似检索)
  2. Redis(业务缓存)
  3. Nginx(负载平衡)
  4. Flask+Gunicorn(Web 框架 + 并发服务)
  5. Supervisor (服务的过程启动与异样主动重启)
  6. Docker(容器隔离部署)

我的项目实现:

在咱们的我的项目中,图片应用 EfficientNet 来提取特征向量,视频通过提取关键帧之后,再将每一帧图片进行向量提取之后叠加,文本采纳 BERT 来做特征提取。

架构示意:

 

抉择适合的索引:

图片 / 视频 / 文本向量在检索进去之后, 下层调用还要做一些业务操作, 留给咱们的接口的工夫就不能太多, 要求做到 1s 内返回。因为对速度的要求比拟高, 同时服务部署的机器内存又有肯定的限度, 咱们选用了 IVF_PQ 作为向量索引。这是一种有损压缩的向量索引, 它将所有向量分解成 m 段, 每一小段别离进行聚类,每小段由所属的聚类核心来示意,称为索引值。

如:一个 D =128 维的原始向量,它被切分成了 M = 8 个 d =16 维的短向量,同时每个 16 维短向量都对应一个量化的索引值,索引值即该短向量间隔最近的聚类核心的编号,每一个原始向量就能够压缩成 8 个索引值形成的压缩向量,即每个向量都用这 8 个索引值来示意,绝对于原始值有肯定的误差。

在理论应用的时候,事后计算好的各个聚类核心间的间隔(codebook 码表),通过查找表得出两个向量索引值之间的间隔,来近似代替两个向量的实在间隔,放慢了计算速度;在应用中能够通过参数 m 的设置, 使得向量压缩成很小的比例, 也大量缩小了内存占用(约为向量原始空间大小的 5%~10%)。

依据 milvus 官网提供的公式:

 
咱们计算得出适合的索引参数是 nlist=1024, m=8

 

应用分区进步速度:

目前素材中,图片靠近 4kw, 视频 1kw,文本 3kw, 为了进步检索速度, 分区变得十分必要。咱们通过一些业务属性, 依据属性值做笛卡尔积操作来建设分区:

例如,咱们向量对应的 Item 有两个属性:

属性 A,取值 1, 2, 3, 4

属性 B,取值 1, 2, 3

 
那么建设分区 A1_B1, A1_B2, A1_B3, A2_B1, A2_B2, A2_B3, …… A4_B3, 一共 12 个。通过分区操作,咱们将每个分区的向量规模管制在 500w 以下, 进一步提高了检索速度。

须要留神的是, 用来建设分区的属性应该是不会变动的根本属性, 因为如果产生变动, 从新建设分区, 导入数据, 建设索引是十分漫长的过程, 所以分区确定下来, 轻易不要扭转。另外分区及属性值不能太多, 否则各个属性值相乘 (笛卡儿积) 会让数量变得十分宏大, 使程序变得过于简单. 更多的属性检索或筛选, 咱们在 milvus 向量搜寻的后果上另外封装一层业务接口来实现。

 

零碎成果:

向量检索服务以 REST 接口的模式对外提供,前端团队调用接口,将后果展现在界面上。UI 示意如图(局部业务信息含糊解决),相似谷歌的以图搜图,百度的以影搜影等

性能指标:

目前咱们的图片总量大概在 3kw+,视频总量大概在 1kw,向量维数为 2048 维,文本 3kw 左右,768 维。图片检索耗时 0.2s 左右;视频检索耗时 0.1s 左右;文本向量检索耗时 <0.1s

 

 

对于 milvus 的一些教训与总结:

milvus 集成各种常见向量索引, 能满足工程中大部分的需要,存储操作和检索速度都达到了工业级的水准,提供服务化的接口, 基本上做到了开箱即用。不过 milvus 目前还不反对其余类型(字符型,整型)的属性检索(0.11 版中有反对, 但起初在正式版 1.0 中勾销了)。总体来说,对于须要疾速构建向量检索服务,又不想花太大老本(ES,SOLR)的轻量级我的项目来说,Milvus 是一个很好的抉择。

 
 

参考文献:

Product quantization for nearest neighbor search. Hervé Jégou, Matthijs Douze, Cordelia Schmid

正文完
 0