新数据库时代,数据库领域有哪些新技术、新应用?谁将改变数据库的游戏规则?
酷爱阅读科技杂志的 Z 宝,刚刚收到了刊登了 Zilliz 长篇署名文章的《新程序员》!
顺手一翻,Z 宝不禁感叹 CSDN 策划出品的这期杂志简直是众星云集:2020 年图灵奖得主 Jeffrey Ullman、2018 年图灵奖得主 Yann LeCun、MongoDB CTO Mark Porter、OceanBase 创始人杨振坤、TiDB 创始人黄东旭⋯⋯ 60 余位大咖分享技术前沿动向!
未来 80% 的数据是非结构化的,然而传统的数据分析手段很难挖掘非结构化数据中所蕴含的信息,也没法对这些信息进行统一的表示。如何深入理解这些棘手的「新数据」?Zilliz 研发工程团队「三剑客」郭人通、栾小凡、易小萌共同撰文,探讨了面向 AI 的通用向量数据库的设计和实践,以及当前主要的技术挑战。、
以下是三位的长文干货,快和 Z 宝一起阅读他们的思想结晶吧:
面向 AI 的通用向量数据库系统设计及实践
导读
现代数据应用面临着这样一种窘境,对于占比不到 20% 的传统结构化数据,具备丰富且成熟的基础软件栈。但对于超过 80% 的非结构化数据却还存在着巨大空洞。本文基于此深入探讨了传统数据分析手段挖掘非结构化数据的痛点,由此进行了面向AI的通用向量数据库系统设计及实践,及其当前面临的主要技术挑战。
作者简介
郭人通,Zilliz 合伙人、研发总监,华中科技大学计算机软件与理论博士, CCF 分布式计算与系统专委会委员。主要工作领域为数据库、分布式系统、缓存系统、异构计算,相关研究成果在 SIGMOD, USENIX ATC, ICS, DATE, IEEE TPDS 等国际顶级会议与期刊上发表。目前致力于探索面向AI的大型数据库系统技术,是 Milvus 项目的系统架构师。
栾小凡,Zilliz 合伙人、工程总监,LF AI & Data 基金会技术咨询委员成员,康奈尔大学计算机工程硕士。他先后任职于 Oracle 美国总部、软件定义存储创业公司 Hedvig、阿里云数据库团队,曾负责阿里云开源 HBase 和自研 NoSQL 数据库 Lindorm 的研发工作。
易小萌,Zilliz 高级研究员、研究团队负责人,华中科技大学计算机系统结构博士。主要工作领域为向量近似搜索算法和分布式系统的资源调度,相关研究成果在 IEEE Network Magazine, IEEE/ACM TON, ACM SIGMOD, IEEE ICDCS, ACM TOMPECS 等计算机领域国际顶级会议与期刊上发表。
AI 时代的数据变革
随着 5G、IoT 技术的高速发展,各行业都在着手构建丰富的数据采集通路,我们正在把现实世界更加立体地投射到数字空间。这给产业升级带来了巨大红利,同时也带来了严峻挑战。其中最棘手的一个问题就是,如何深入地理解这些“新数据”?
据 IDC 统计,在 2020 年这一年中,全球共产生了超过 40,000Exabytes 的新数据。其中,80% 以上都是非结构化数据,结构化数据占比不到 20%。结构化数据的主要单元是数值与符号,数据类型高度抽象且易于组织。基于数值运算与关系代数,可以轻松地对结构化数据进行分析。与之相比,非结构化数据在数据形态和语义内容等方面都表现得异常丰富,常见的类型包括文本、图像、音频、视频,也包括领域相关的类型,如病毒代码、社交关系、时空数据、化合物结构、点云等。
传统的数据分析手段难以挖掘非结构化数据中所蕴含的信息,也没办法对这些信息进行统一的表示。幸运的是,我们现在同时经历“非结构化数据”与“人工智能”两场变革,各类神经网络为我们提供了理解非结构化数据的途径。如图1 所示,通过神经网络,可以有效地将非结构化数据中的信息编码成向量。
Embedding 这类技术由来已久,在 Word2vec 出现以后迅速流行起来。发展到现在,“万物皆可 embedding”这种讲法已经开始大行其道。这样,就出现了两个主要的数据层。底层是原始数据层,包括非结构化数据和部分结构化数据。通过各类神经网络的 embedding,在原始数据层之上又形成了一个新的数据层,这个数据层中的信息主要以向量的方式存在。
向量化的数据层具有一系列很好的性质:
- Embedding 向量是一种抽象的数据类型,针对抽象的数据类型可以构建统一的代数系统,从而避免非结构化数据丰富的形态所带来的复杂性;
- Embedding 向量的物理表示是一种稠密的浮点数向量,这有助于利用现代处理器的 SIMD 能力提升数据分析速度,降低平均算力成本;
- Embedding 向量这种信息编码形式,通常比原始的非结构化数据要小得多,占用存储空间更低,并能提供更高的信息传输效率。
- Embedding 向量也有与其对应的算子系统,最常用的算子是语义近似匹配。图2 给出了一个跨模态语义近似匹配的例子。需要注意的是,图中给出的是匹配的结果。在具体运算过程中,文字和图片都会被映射到同一个 Embedding Space,在这个空间内进行向量化的语义近似分析。
除此之外,还有语义上的加法操作,如图3 所示的例子。
除了上述玩具性的功能,在实际应用场景中,这些算子还可以支持很复杂的查询语句。推荐系统是一个比较典型的例子,它所用到的数据主要是用户行为、内容两大类。通常会对每个内容及用户的浏览偏好进行 embedding,通过对用户偏好与内容间的向量进行语义相似度分析,就可以回答这样的查询语句:“一个用户在刷下一批新的内容时,哪些是他现在最想看的?”除此之外,向量数据层上的应用还包括电商、病毒代码检测、数据去重、生物特征验证、化学分子式分析、金融、保险等。
非结构化数据需要完善的基础软件栈
数据应用的基础是系统软件,在过去半个多世纪里,我们所构建的数据系统软件,如数据库、数据分析引擎等,主要都是面向结构化数据。但从上文例举的应用场景不难看出,新兴的数据应用将以非结构化数据作为数据基础,并以 AI 作为运算手段。这些数据基础与运算手段,在传统的数据基础软件的构建过程中还未出现,因此这些内容也很难被考虑到系统的设计中。
现代的数据应用面临了这样一种窘境——面向占比不到 20% 的传统结构化数据,我们拥有丰富且成熟的基础软件栈;但对于超过 80% 的非结构化数据,基础软件的探索才刚刚开始,在产业界的数据应用中出现了巨大的基础软件空洞。
为了应对这个问题,我们研发出了一个面向 AI 的通用向量数据库系统,命名为 “Milvus” 并将其开源(见参考资料1~2)。与传统的数据库系统相比,它作用于不同的数据层。传统的数据库,如关系数据库、KV 数据库、文本数据库、图像/视频数据库都作用于原始数据层,而 Milvus 则作用于其上的向量化数据层,解决 Embedding 向量的存储与分析问题。
在后续的几个章节中,我们将结合自身在项目中的思考及实践经验,和大家聊一聊这种面向 AI 与非结构化数据的向量数据库应该具备哪些特性、需要怎样的系统架构,以及面临着哪些技术挑战。
向量数据库的主要特性
向量数据库,顾名思义,首先解决的是向量存储、检索和分析的问题。其次,作为一个数据库,需要提供标准的访问接口和数据插入查询删除更新的能力。除了这些“标准”的数据库能力外,一个好的向量数据库还应该具备以下特性:
- 高效支持向量算子
分析引擎中对向量算子的支撑主要在两个层面。首先是算子类型,如上述的“语义相似性匹配”、“语义上的加法”等算子,其次是对相似性度量的支持。向量算子在底层执行的过程中都需要对“相似性”进行有效度量。这种相似性通常会被量化到空间上数据之间的距离,常见的距离量化方式包括欧式距离、余弦距离、内积距离等。
- 向量索引能力
相比传统数据库基于 B 树、LSM 树等结构索引,高维向量索引往往计算量更大,属于计算密集型场景。在索引算法层面,多采用聚类、图等技术。运算层面,以矩阵运算、向量为主。因此,充分挖掘现代处理器的向量加速能力,对于降低向量数据库的算力成本至关重要。
- 跨部署环境的一致使用体验
向量数据库通常会有不同的部署环境,这是由数据科学流程决定的。在前面阶段,数据科学家、算法工程师用系统主要是笔记本或工作站,因为他们关注验证速度和迭代速度。验证好后就需要部署,这就对应着私有集群或云上的大规模部署。因此,需要在不同的部署环境中都能让系统具备良好的表现。
- 支持混合查询
近年来,随着向量数据库的不断发展,越来越多的新需求涌现出来。其中最常见的一个需求就是其他数据类型和向量混合查询,比如基于标量过滤后再执行最近邻查询,基于全文检索和向量检索相结合的多路召回,以及时空时序数据和向量数据的结合。这要求向量数据库具备更加灵活的扩展能力以及更智能的查询优化,使向量引擎可以与 KV 引擎、文本检索引擎等进行高效协作。
- 云原生
随着非结构化数据规模快速增长,向量数据的体量也在不断增长,千亿规模的高维向量对应着数百 TB 级别的存储。这种存储规模远远超过了单机所能承担的范围,因此,横向扩展能力对于向量数据库而言也就变得非常重要。一个成熟的向量数据库应该满足用户对弹性和部署敏捷性的要求,借助云基础设施降低系统运维的复杂度,提升可观测性。此外,用户对于多租户隔离、数据快照和备份、数据加密、数据可视化等传统数据库能力也提出了越来越高的需求。
向量数据库的系统架构
目前,Milvus 已演进至 2.0 版本,其设计遵循日志即数据、流批一体、无状态化和微服务化的准则,整体架构设计可参见图4。
首先我们来看日志即数据,在 2.0 版本中没有维护物理上的表,而是通过日志持久化和日志快照来保证数据的可靠性。日志系统作为系统的主干,承担了增量数据持久化和解耦的作用。通过日志的发布-订阅机制,将系统的读、写组件解耦。如图5 所示,整个系统主要由两个角色构成,分别是“日志序列(Log Sequence)”与“日志订阅者(Log Subscriber)”。其中的“日志序列”记录了所有改变库表状态的操作,“日志订阅者”通过订阅日志序列更新本地数据,以只读副本的方式提供服务。发布-订阅机制的出现也给系统预留了很大的拓展空间,便于 Change data capture(CDC)、全球部署等功能的拓展。
再看流批一体化,借助日志流实现数据的实时更新,保证数据的实时可达。再将数据批量转换成日志快照,通过对日志快照构建向量索引实现更高的查询效率。查询时,通过合并增量数据和历史数据的查询结果,保证用户可以获取完整的数据视图。这种设计较好地满足了实时性和效率的平衡,降低了传统 Lambda 架构下用户维护离/在线两套系统的负担。
第三个设计准则是无状态化。借助云基础设施和开源存储组件,实现自身组件不需要保证数据的持久化。当前,Milvus 的数据持久化依赖三种存储,分别为元数据存储、消息存储和对象存储。常见的元数据存储如 Etcd、Zookeeper,主要负责元信息的持久化和服务发现、节点管理。消息存储如 Kafka、Pulsar,主要负责增量数据的持久化和数据的发布订阅。对象存储如 S3、Azure Blob、MinIO,主要负责用户日志快照、索引以及一些中间计算结果的存储。
最后是微服务化,其严格遵循数据流和控制流分离、读写分离、离线和在线任务分离。整体分为四个层次,分别为接入服务、协调服务、执行服务和存储服务。各个层次相互独立,独立扩展和容灾。接入层作为系统的门面,主要负责处理客户端链接,进行请求检查和转发。协调服务作为系统的大脑,负责集群拓扑管理、负载均衡、数据声明和管理。执行节点作为系统的四肢,负责执行数据更新、查询和索引构建等具体操作。存储层作为系统的骨骼,主要负责数据本身的持久化和复制。微服务化的设计保证了可控的复杂度,每一个组件专注于相对单一的功能。通过定义良好的接口清晰地表述服务边界,更细粒度的拆分也有利于更加灵活的扩展和更精确的资源分配。
向量数据库的技术挑战
在向量查询领域,以往的研究工作主要专注于高效率向量索引结构和查询方法的设计,与之相对应的业界主流产品为各式各样的向量搜索算法库(见参考资料3~5)。近年来,越来越多的学者和业界团队开始从系统设计的角度去审视和思考向量查询问题,并逐渐产生了一些针对向量搜索问题系统化的解决方案。通过对现有工作以及用户需求的总结,大致上可以将向量数据库系统的主要技术挑战分为以下三个方面:
- 针对负载特性的成本-性能优化
由于向量数据的高维特性,其分析过程相对传统数据类型具有更高的存储和计算成本。另一方面,不同用户的向量查询负载特性以及成本-性能偏好往往是不尽相同的。例如,部分用户的数据规模巨大,达到了百亿甚至千亿级别。此类用户通常需要较低成本的数据存储方案,同时能够容忍一定的查询延迟。另外也存在一些用户对查询性能非常敏感,通常要求单条查询的延迟稳定保持在若干毫秒。为了满足不同用户的偏好,向量数据库的核心索引组件需要有能力将索引结构和查询算法与不同类型的存储和计算硬件进行适配。
例如,为了降低存储成本,需要考虑将向量数据和索引结构存储在比内存更为廉价介质中(如 NVM 和 SSD)。然而,现有的向量搜索算法几乎都是基于数据可以完全驻留在内存中而设计的。为了尽量避免使用 NVM 或 SSD 带来的性能损失,需要结合搜索算法充分挖掘和利用数据访问局部性,并结合存储介质特性对数据和索引结构的存储方式进行调整(见参考资料6~8)。对于查询性能敏感的用户,目前主流的探索方向为使用 GPU、NPU、FPGA 等专有硬件加速查询过程(见参考资料9)。然而,不同加速硬件和专有芯片的结构设计均不相同,如何结合这些硬件的特性对高效地执行向量索引请求目前仍是一个尚未良好解决的问题。
- 智能化系统配置与调优
现有的几种主流向量查询算法都是在存储成本、计算性能以及查询准确度之间寻求不同的平衡点,算法的实际表现通常由算法参数和数据特性共同决定。考虑到用户对于向量查询成本和性能要求的差异性,如何针对用户需求以及数据特性为其选择合适的向量查询方法便成为了一个重要问题。
然而,由于向量数据的高维特性,使得人工方法通常难以有效分析数据分布特性对查询算法的影响。针对这一问题,学术界和工业界目前主要尝试使用基于机器学习的方法为用户推荐合适的算法配置(见参考资料10)。
另一方面,结合机器学习技术的智能向量查询算法设计也是研究的一个热门话题。当前的向量查询算法通常是在假设不知道向量数据特性的情况下进行设计的。这类算法具有较强的通用性,能够应对不同维度数量、不同分布类型的向量数据。相对应的,它们无法根据用户数据的特性进行针对性的索引结构设计,也就无法再进一步挖掘和利用其中的优化空间。如何使用机器学习方法有效地为不同用户数据量身定制索引结构是一个值得探索的重要问题(见参考资料11~12)。
- 对丰富查询语义的支持
随着各行各业数字化进程逐渐成熟,现代应用对数据的查询逻辑呈现出了多样化和多元化的趋势。一方面对向量数据查询语义在不同应用中存在多样性,正逐渐超越传统近邻查询的范畴。另一方面,对于多个向量数据联合搜索,以及向量数据和非向量数据的综合查询需求也在逐渐产生(见参考资料13)。
具体而言,对于向量数据查询,向量相似性的评价指标变得更加多样。传统的向量查询通常使用欧式距离、内积以及余弦距离作为向量的相似度指标。随着 AI 技术在各行各业的普及,一些领域特定的向量相似指标,如谷本距离、马氏距离以及用于计算化学分子超结构和子结构的距离指标正逐渐涌现。如何在现有的查询算法中有效地支持这些评价指标或相应地设计新型的检索算法成为了亟待研究的重要问题。
另一方面,随着用户业务的日益复杂,应用中对数据的查询通常包含了多个向量数据和非向量数据。例如,在为用户进行内容推荐时,通常需要结合用户个人的兴趣特征、用户的社交关系以及当前的热门话题进行综合性的分析和选择。此类查询通常需要结合多种数据查询方法,甚至通过多个数据处理系统交互完成,如何高效灵活地支持此类查询也是一个具有重要研究价值的问题。
参考资料
- Milvus Project: https://github.com/milvus-io/...
- Milvus: A Purpose-Built Vector Data Management System, SIGMOD'21
- Faiss Project: https://github.com/facebookre...
- Annoy Project: https://github.com/spotify/annoy
- SPTAG Project: https://github.com/microsoft/...
- GRIP: Multi-Store Capacity-Optimized High-Performance Nearest Neighbor Search for Vector Search Engine, CIKM'19
- DiskANN: Fast Accurate Billion-point Nearest Neighbor Search on a Single Node, NIPS'19
- HM-ANN: Efficient Billion-Point Nearest Neighbor Search on Heterogeneous Memory, NIPS'20
- SONG: Approximate Nearest Neighbor Search on GPU, ICDE'20
- A demonstration of the ottertune automatic database management system tuning service, VLDB'18
- The Case for Learned Index Structures, SIGMOD'18
- Improving Approximate Nearest Neighbor Search through Learned Adaptive Early Termination, SIGMOD'20
- AnalyticDB-V: A Hybrid Analytical Engine Towards Query Fusion for Structured and Unstructured Data, VLDB'20
Zilliz 以重新定义数据科学为愿景,致力于打造一家全球领先的开源技术创新公司,并通过开源和云原生解决方案为企业解锁非结构化数据的隐藏价值。
Zilliz 构建了 Milvus 向量数据库,以加快下一代数据平台的发展。Milvus 是 LF AI & Data 基金会的毕业项目,能够管理大量非结构化数据集,在新药发现、推荐引擎、聊天机器人等方面具有广泛的应用。