贝壳找房 | 基于 Milvus 的向量搜索实践(一)
摘要: 本系列文章分为三部分,第一部分主要讲基本概念、背景、选型及服务的整体架构;第二部分主要讲针对低延时、高吞吐需求,我们对Milvus部署方式的一种定制;第三部分主要讲实现数据更新、保证数据一致性,以及保证服务稳定及提高资源利用率做的一些事情。
1.名词解释
Milvus[1]:一种基于Faiss[5],NMSLIB[6] 和 Annoy[7]的相似特征向量搜索引擎。
向量:即特征向量,是对客观世界物体特征的数值表示;比如我们用RGB(红绿蓝)三元色来表示物体的颜色,那么对于一个像素点,我们可以用数组[255,255,255]表示白色,用数组[0,0,0]表示黑色,这里[255,255,255]、[0,0,0]可以认为是物体该像素点的特征向量。
向量搜索:也叫最邻近搜索,是指按照一定的相似/距离算法[9-12],从指定集合中搜索(计算)出与输入的某个向量最相似的N个向量(即topN)。
2.背景
随着计算机技术及机器学习技术的发展,特征向量作为一种对多媒体数据(复杂文本、语音、图片)的描述方式,逐渐成熟起来,而向量搜索(向量相似计算)也逐渐成为一种通用的需求。
近些年,贝壳找房业务迅猛发展,在搜索、推荐、图谱、智能客服等业务场景下,对向量搜索提出了比较强的需求。
面对多业务的需求,结合对业界已有工具的调研,最终选择了milvus做为底层引擎,建设了一个通用的向量搜索平台,以解决 向量相似计算
这个共性的问题。
3. 技术选型
在技术选型阶段,我们调研了业界已经比较成熟的工具,如facebook的faiss[5]、微软的SPTAG[8],以及国内发起的开源项目Vearch[13],Milvus[1]。具体对比见表1,2。
Vearch和Milvus属于同类型产品,对比faiss和SPTAG的优势在于,后两者为开发库,不能开箱即用,在生产环境中使用涉及更多的开发、维护成本。Milvus和Vearch是两款基于现有的开发库,开箱即用的应用,在实现基本的相似计算功能的基础上,围绕服务整体易用性、部署、稳定性等方面做了更多工作。另外,Milvus对比Vearch,在社区活跃度、支持度上具有更明显的优势。基于以上的调研,综合考虑各方面的成本,我们选择Milvus作为底层引擎。
表1:Milvus对比FAISS、SPTAG[3]
表2:Milvus对比Vearch(2019.11数据)
4. Milvus引擎简介
如图1所示,Milvus基于Faiss、Annoy等比较成熟的开源库,并针对性做了定制,支持结构化查询、多模查询等业界比较急需的功能;Milvus支持cpu、gpu、arm等多种类型的处理器;同时使用mysql存储元数据,并且在共享存储的支持下,Milvus可以支持分布式部署。
图1 Milvus架构[1]
5.服务整体架构
图2 服务整体架构如图2所示,整体架构分三层,网关层、应用层和引擎层。
网关层:主要负责服务整体的访问控制和监控报警,并对外暴露api,属于应用的通用能力,这里不详细讲。
应用层:应用层的定位是面向使用方,提供通用的向量搜索能力,同时屏蔽掉底层引擎的细节;应用层主要分为读模块、写模块以及管理模块。写模块定位是数据更新,抽象出了一组通用的写入api,以实现对数据的更新,并保证数据更新的一致性。读模块定位是支撑向量搜索,适配用户的查询请求,转换成具体引擎的查询,最后把结果转换成通用格式;读模块借助读缓存,来提高有重复查询请求时的整体吞吐量。我们使用ID映射模块来完成业务id和引擎id的内部转换,为通用读/写做支撑。另外,我们使用集群管理模块来实现集群的创建、配置更新以及状态的监控。
引擎层:引擎层基于docker+kubernetes,实现了Milvus引擎的部署、服务发现、数据存储以及资源的管理。
6.参考文献
- https://github.com/milvus-io/milvus
- https://github.com/milvus-io/milvus/tree/0.11.1/shards
- https://github.com/milvus-io/docs/blob/master/v0.6.0/site/en/reference/comparison.md
- https://milvus.io/docs/v0.11.0/vector.md
- https://github.com/facebookresearch/faiss
- https://github.com/nmslib/nmslib
- https://github.com/spotify/annoy
- https://github.com/microsoft/SPTAG
- https://en.wikipedia.org/wiki/Euclidean_distance
- https://en.wikipedia.org/wiki/Taxicab_geometry
- https://en.wikipedia.org/wiki/Hamming_distance
- https://en.wikipedia.org/wiki/Minkowski_distance
- https://github.com/vearch/vearch
作者简介
下期精彩
Milvus的向量搜索实践(二):Milvus项目在调研、实施以及最终上线使用过程中,遇到的问题。