飞书深诺团体(https://www.meetsocial.com/)
是专一海内数字营销解决方案的综合服务团体,为中国出海企业提供可定制组合的全链路服务产品,满足游戏、APP、电商、品牌等典型出海场景需要,陪伴品牌应答海内市场的种种挑战。
技术背景:
在服务电商客户的场景下, 创意部门经常要为客户制作素材,如:广告图,宣传视频,宣传文案等。通过以图搜图, 以视频搜视频,文本搜文本的形式, 挖掘素材,可能为设计人员提供创意上的参考。同时,也依据一些其余条件(比方热度,成果值等)作为辅助搜寻的条件,帮忙创意人员抉择适合的素材。因而,利用Milvus向量检索引擎在内的一系列技术,为业务部门提供一个素材的综合搜寻零碎,就是此我的项目的动机。
技术选型:
因为业务接口须要实时返回,还须要接受肯定水平的并发负载,因而咱们认为milvus 是比拟适合的向量检索工具。它对FAISS, ANN等工具进行了封装, 建设本人的存储文件构造, 同时提供了不便的服务化接口, 能够算的上开箱即用了。在放弃检索速度快的同时, milvus能够通过参数设置,对向量检索的准确性,资源占用做肯定的 tradeoff,比拟适宜在理论工程中应用。
咱们在返回类似向量的同时, 还须要图片/视频的一些对应信息, 咱们通过 kv的模式放在 redis 缓存里,放慢获取的速度。在web接口封装方面,思考到团队里python程序员占支流,咱们选用了 nginx + flask + gunicorn + supervisor 的web经典套餐。
应用到的各工具和框架:
- Milvus (图片/视频/文本的向量类似检索)
- Redis (业务缓存)
- Nginx(负载平衡)
- Flask+Gunicorn (Web框架+并发服务)
- Supervisor (服务的过程启动与异样主动重启)
- 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