M 小编:
这次很高兴参与了「七牛云 Niu Talk」 数据科学系列论坛第三期,并在直播中与观众分享了 Milvus 作为 AI 时代的非结构化数据搜索引擎的技术架构与应用案例。下文是根据演讲内容整理的内容实录,另外还有直播回放让你能轻松回顾!
顾钧,Zilliz 的合伙人、首席布道师,拥有超过 16 年数据库产品经验。他目前还担任 LF AI 基金会的技术咨询委员会投票成员。在 Zilliz 之前,顾钧先后服务过工商银行(数据库工程师), IBM (信息管理产品售前技术专家), Morgan Stanley (副总裁,数据库专家),华为(数据库产品战略规划专家)。顾钧拥有北京大学的计算机科学学士学位。
在了解 AI 非结构化数据处理和分析之前,我们首先要了解什么是非结构化数据。数据可以分成三个大的类别——结构化数据、半结构化数据和非结构化数据。
在过往,非结构化数据一直都没有一个很好的处理的手段,大家很难去构建一个图片搜索引擎或自然语言问答系统。但随着越来越多的深度学习模型和算法日渐成熟,大家有了越来越好的非结构化数据处理和分析的技术,那么这些 AI 的深度学习模型就能把非结构化数据进行一系列转化,从中提取通常以向量形式作为表现的特征信息。这也就是我们所谓的 AI 非结构化数据处理和分析中,Milvus 这个项目所最关注的特征向量信息。
举个例子,比如对一段视频进行分析,我们有很多种办法可以来完成这项工作,像是基于 flow base 的方式去构建一系列的处理流水线:比如去为视频做一些分析,提取视频中的图像信息,进一步在每一个图中提取出关键帧做对象侦测,进行图像语义的提取;也可以构建流水线做音轨的处理分析,去提取其中声音的一些特征信息;当然你也可以用流水线专门去做一些自动的标签技术,对电影的年份、类型打上结构化标签。以上都是非常典型的流式 AI 应用,凭借起点低、灵活性高的特点,在现实当中得到非常广泛应用。但是它也会带来不小的挑战——数据管理和有效搜索。因为不同的流水线处理同一份的非结构化数据后,最终会形成各种不同的特征信息并分散在不同的流水线的终端。那么如何有效地把它们整合起来?最初的视频慢慢变成了图像特征、声音的特征,又变成了结构化信息,怎么能够将其联合起来做一个更有效的处理和分析?其实就是大家所面临的一个巨大的挑战。
要解决这样的问题,我们先尝试着换一个角度来看刚才的 AI 应用,换成一种层次性的结构去看,你会发现输入输出都还是非结构化数据,其实最重要的 AI 技术,在中间的这两个层次。
首先是 influence layer 模型推理层,也是 AI 应用中的第一个环节。Transformer 要能把你的非结构化数据进行一系列处理和提取后,形成特征信息、特征向量。接下来是数据服务层,Milvus 项目就构建在其上。它是 AI 应用为深度学习的机器学习应用,提供数据服务支撑的基础组件。
我们支持两种特征向量,一个是所谓的高维重力向量,它是深度学习中最典型的特征信息输出形式。另外一种是更偏向于传统机器学习的稀疏向量。但是光有向量是不够的,第二个非常重要的功能是结构化数据和非结构化数据联合查询的能力。在我们未来的规划上,我们会进一步去增加跨模态搜索等更加丰富的功能,去支撑大家的深度学习的应用。
虽然向量看起来是由数值组成的,但其实向量和数值是非常不一样的。第一个是数字的计算,通常是加减乘除,很简单。但是在下图右侧,是向量计算当中最典型的一种——计算两个向量之间的相似度,我们不难看出,从复杂程度上二者就有显著区别。
第二个区别在于数值之间是可以互相比较大小的,而向量不行。向量和向量之间没有大小关系的,两个向量之间只能是去计算相似度。所以基于这样的特性,我们完全没有办法用针对数值型的算法去构建向量世界。
首先在下面紫色部分,是我们对于异构处理器的支持。因为这是一个服务器端的项目,它本身很多场景是在 x86 芯片上,但是哪怕在 x86 的芯片上,也会有一些异构的执行资源。我们为 x86 芯片做了一系列适配,支持从 SSe4.2 一直到 aVX512 这些不同的向量化计算指令集。另外一点非常重要,是对 ARM 芯片的支持,主要体现在边缘场景。与此同时,我们也是做了对国内芯片的支持适配,
在蓝色部分中,是关于数据的管理。因为仅用一个算法很难解决针对海量数据流更新的场景。所以对数据定位,在数据服务类的基础组件中非常重要,也是非常基本的一个功能。怎么帮助用户去管好所有的这些数据,这些数据是进来之后我怎么去帮他构建索引,怎么去删除一条用户不想要的数据,或者说当你很多的应用场景。
黄色区域是第三个比较重要的基本部分,叫做执行引擎。这部分主要是对常用算法的一些吸收改良和集成,包括对于混合查询的支持,以及未来为多模态和打分机制所预留的部分。对于应用开发环境而言,工程师可以很方便地把它集成到自己的应用场景当中。
因为向量搜索往往数据量特别大,计算密度特别高,那这一过程中,它的性能表现如何呢?
我们完整跑完了 Ann benchMark,它是比较公认的测试工具集。配合了我们开源的向量特征的信息进行测试,在百万级的向量规模上,单台的云服务器可以做到 1000~2000 左右的吞吐量。当然它具体的数值会根据召回率的要求发生变化。
我们的社区用户使用 Milvus 构建了很多 AI 应用的实例,下面我们一起来看几个典型的案例。
智能写作助手来自于 WPS 的微信小程序,微信小程序首先会从各种网站收集语料信息,并做一系列的清洗,抽取原始语料当中的段落,再去抽取其中向量,最终把这些特征提取出来插入其中。当用户要发起一个写作请求的时候,其实也是把写作的请求,根据自然语言的模型提取成特征向量,再去语料库中做一次召回,将搜索到相关的元素组合起来反馈给用户。对于用户来说,他看到的就是一篇公文类草稿,他只要做一些定制化、个性化的修改,就可以使用了。
新闻推荐的功能涉及到了两个部分,一是把新闻的标题经过自然语言的模型提取成特征向量,然后存储在 Milvus 当中。另外一方面,当用户点开浏览器的时,它会根据用户的兴趣点以及阅读的历史召回向量,再形成一些比较相关的新闻。也就是说,这是一种类似于自然语言处理和推荐系统的场景。
第三个场景是商标搜公司,用户拥有 5500 万张中国企业的注册商标的图片,他们的需求是只要用手机拍摄一个商品,那么通过商品上的商标就可以找到商标背后的公司、公司的信息以及有没有类似的商标。这样场景相对来说会是比较简单的结构,原始的 5500 万张的商标图片,经过图像模型的提取之后,形成特征向量注入其中,当用户进行搜索时,相当于手机端把拍摄的商标照片做了物体识别,经过语义提取后把向量发送到服务器端进行检索。在这样的场景下,5500 万的向量在云服务器上,搜索仅仅消耗了 20 毫秒的时间。
第四个场景它就是一个制药领域的机器学习的场景,它用的是一种稀疏向量。右上角大家可以看到一个复杂的分子式,根据编码器可以把分子式转换成 1024 字节长度的二进制串,然后我们把它存在 Milvus 中。在这个场景当中,我们用了一个公开的数据集,有 8 亿的分子量,在单台服务器却只需要 500 毫秒的搜索时间。可能大家看起来没有直观感受,但是如果用 spark 的集群来做,一个 3000 万量级向量的搜索就需要花秒 14 秒。按照这样的比例和这样的方式,做 8 亿的搜索可能需要 500 秒的时间,而我们仅需 500 毫秒。所以当你使用了一个正确的、更适合的场景做算法和基本组件之后,可以有一个大幅度的性能的提升和一个成本的提升。
以上是 Milvus 实际使用上的一些案例,大家如果有兴趣的话,可以去我们 GitHub 站点上下载我们的 example 脚本,会非常完整地描述使用方法。
我们整个项目是从去年 10 月份正式开源的,目前已经完成了 6400 的 commits 和超过 4600 颗星,贡献者达到 121 位,在全球拥有超过 400 家的企业用户在使用它来构建 AI 应用。欢迎大家继续关注,支持 Milvus 开源项目。
欢迎加入 Milvus 社区
github.com/milvus-io/milvus | 源码
milvusio.slack.com | Slack 社区
zhihu.com/org/zilliz-11| 知乎
zilliz.blog.csdn.net | CSDN 博客
space.bilibili.com/478166626 | Bilibili
本文分享自微信公众号 - ZILLIZ(Zilliztech)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。