摘要:本系列文章分为三部分,第一部分主要讲基本概念、背景、选型及服务的整体架构;第二部分主要讲针对低延时、高吞吐需求,我们对Milvus部署方式的一种定制;第三部分主要讲实现数据更新、保证数据一致性,以及保证服务稳定及提高资源利用率做的一些事情。
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)。
随着计算机技术及机器学习技术的发展,特征向量作为一种对多媒体数据(复杂文本、语音、图片)的描述方式,逐渐成熟起来,而向量搜索(向量相似计算)也逐渐成为一种通用的需求。
近些年,贝壳找房业务迅猛发展,在搜索、推荐、图谱、智能客服等业务场景下,对向量搜索提出了比较强的需求。
面对多业务的需求,结合对业界已有工具的调研,最终选择了milvus做为底层引擎,建设了一个通用的向量搜索平台,以解决向量相似计算
这个共性的问题。
在技术选型阶段,我们调研了业界已经比较成熟的工具,如facebook的faiss[5]、微软的SPTAG[8],以及国内发起的开源项目Vearch[13],Milvus[1]。具体对比见表1,2。
Vearch和Milvus属于同类型产品,对比faiss和SPTAG的优势在于,后两者为开发库,不能开箱即用,在生产环境中使用涉及更多的开发、维护成本。Milvus和Vearch是两款基于现有的开发库,开箱即用的应用,在实现基本的相似计算功能的基础上,围绕服务整体易用性、部署、稳定性等方面做了更多工作。另外,Milvus对比Vearch,在社区活跃度、支持度上具有更明显的优势。基于以上的调研,综合考虑各方面的成本,我们选择Milvus作为底层引擎。
如图1所示,Milvus基于Faiss、Annoy等比较成熟的开源库,并针对性做了定制,支持结构化查询、多模查询等业界比较急需的功能;Milvus支持cpu、gpu、arm等多种类型的处理器;同时使用mysql存储元数据,并且在共享存储的支持下,Milvus可以支持分布式部署。
如图2所示,整体架构分三层,网关层、应用层和引擎层。
网关层:主要负责服务整体的访问控制和监控报警,并对外暴露api,属于应用的通用能力,这里不详细讲。
应用层:应用层的定位是面向使用方,提供通用的向量搜索能力,同时屏蔽掉底层引擎的细节;应用层主要分为读模块、写模块以及管理模块。写模块定位是数据更新,抽象出了一组通用的写入api,以实现对数据的更新,并保证数据更新的一致性。读模块定位是支撑向量搜索,适配用户的查询请求,转换成具体引擎的查询,最后把结果转换成通用格式;读模块借助读缓存,来提高有重复查询请求时的整体吞吐量。我们使用ID映射模块来完成业务id和引擎id的内部转换,为通用读/写做支撑。另外,我们使用集群管理模块来实现集群的创建、配置更新以及状态的监控。
引擎层:引擎层基于docker+kubernetes,实现了Milvus引擎的部署、服务发现、数据存储以及资源的管理。
Milvus的向量搜索实践(二):Milvus项目在调研、实施以及最终上线使用过程中,遇到的问题。
由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:
(1)点击页面最上方"AINLP",进入公众号主页。
(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。
感谢支持,比心。
推荐阅读
征稿启示| 200元稿费+5000DBC(价值20个小时GPU算力)
完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)
模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法
文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化
斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用
关于AINLP
AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。
阅读至此了,分享、点赞、在看三选一吧🙏