文章目录

  • Intro
  • 2 RANGE INDEX
    • 2.3 A First, Naïve Learned Index
  • 3 THE RM-INDEX
    • 3.2 递归模型索引
    • 3.3 Hybrid Indexes
  • 3.4 Search Strategies and Monotonicity
  • 3.5 Indexing Strings
  • 3.6 Training
    • 3.7 Result
      • 3.7.1 Integer Datasets
      • 3.7.2 String Datasets.
  • 4 POINT INDEX
  • 7 CONCLUSION AND FUTURE WORK

Abstract
索引是一种模型:B-Tree-Index可以被看作是将键映射到排序数组中的记录位置的模型,Hash-Index是将键映射到未排序数组中的记录位置的模型,而BitMap-Index是指示数据记录是否存在的模型。在这篇探索性的研究论文中,我们从这个前提出发,认为所有现有的索引结构都可以被其他类型的模型所取代,包括深度学习模型,我们称之为学习索引。我们从理论上分析了在哪些条件下,学习型索引的性能优于传统索引结构,并描述了设计学习型索引结构的主要挑战。我们的初步结果显示,我们的学习型索引可以比传统索引有明显的优势。更重要的是,我们相信通过学习模型来取代数据管理系统的核心组件的想法对未来的系统设计有深远的影响,这项工作只是提供了可能的一瞥。

Intro

每当需要高效的数据访问时,索引结构就是答案,而且有各种各样的选择来解决各种访问模式的不同需求。例如,B-Tree是范围请求的最佳选择(例如,检索某个时间段内的所有记录);Hash-map在单键查询的性能上难以超越;而Bloom filter通常用于检查记录的存在。由于索引对数据库系统和其他许多应用的重要性,在过去的几十年里,索引已经被广泛地调整,以提高内存、缓存和/或CPU效率[11, 29, 36, 59]。
然而,所有这些索引仍然是通用的数据结构;它们对数据分布没有任何假设,也没有利用现实世界数据中普遍存在的更常见的模式。例如,如果目标是建立一个高度调整的系统来存储和查询一组连续的整数键(例如,键1到100M)上的固定长度的记录范围,我们就不会在键上使用传统的B-Tree索引,因为键本身可以被用作偏移量,使得查询任何键或键的范围的开始是O(1)而不是O(log n)操作。同样地,索引的内存大小也将从O(n)减少到O(1)。也许令人惊讶的是,类似的优化对于其他数据模式也是可能的。换句话说,知道确切的数据分布能够高度优化几乎任何索引结构。
当然,在大多数现实世界的用例中,数据并不完全遵循一个已知的模式,为每个用例建立专门的解决方案的工程努力通常太高。然而,我们认为,机器学习(ML)为学习反映数据模式的模型提供了机会,从而能够以较低的工程成本自动合成专门的索引结构,称为学习索引。
在本文中,我们探讨了包括神经网络在内的学习模型在多大程度上可以被用来增强甚至取代从B-Tree到Bloom过滤器的传统索引结构。这似乎是反直觉的,因为ML不能提供我们传统上与这些索引相关的语义保证,而且因为最强大的ML模型,神经网络,传统上被认为是非常昂贵的计算。然而,我们认为,这些明显的障碍都不像它们看起来那样有问题。相反,我们关于使用学习模型的建议有可能带来巨大的好处,特别是在下一代硬件上。
在语义保证方面,索引在很大程度上已经是学习过的模型,使得用其他类型的ML模型替代它们变得出奇的简单。例如,B-Tree可以被认为是一个模型,它将一个键作为输入,并预测一个数据记录在一个排序的集合中的位置(数据必须被排序以实现有效的范围请求)。布隆过滤器是一个二进制分类器,它基于一个键来预测一个键是否存在于一个集合中。显然,存在着细微但重要的区别。例如,布隆过滤器可以有假阳性,但没有假阴性。然而,正如我们将在本文中展示的那样,通过新的学习技术和/或简单的辅助数据结构来解决这些差异是可能的。
在性能方面,我们观察到每个CPU都已经拥有强大的SIMD能力,我们推测许多笔记本电脑和手机很快就会有一个图形处理单元(GPU)或张量处理单元(TPU)。我们还可以合理地推测,CPU-SIMD/GPU/TPU将越来越强大,因为与通用指令集相比,神经网络所使用的有限的(并行)数学操作集更容易扩展。因此,执行神经网络或其他ML模型的高成本在未来可能实际上可以忽略不计。例如,Nvidia和谷歌的TPU都已经能够在一个周期内执行数千次甚至数万次神经网络操作[3]。此外,有人说,到2025年,GPU的性能将提高1000倍,而CPU的摩尔定律基本上已经失效[5]。通过用神经网络取代分支重的索引结构,数据库和其他系统可以从这些硬件趋势中受益。虽然我们看到了学习型索引结构在专门硬件上的前景,比如TPU,但本文完全专注于CPU,并令人惊讶地表明,即使在这种情况下,我们也能取得明显的优势。
值得注意的是,我们并不主张用学习型索引完全取代传统的索引结构。相反,本文的主要贡献是概述和评估了一种建立索引的新方法的潜力,它补充了现有的工作,可以说为一个已有几十年历史的领域开辟了一个全新的研究方向。这基于一个关键的观察,即许多数据结构可以被分解成一个学习模型和一个辅助结构,以提供相同的语义保证。这种方法的潜在力量来自于描述数据分布的连续函数,可以用来建立更有效的数据结构或算法。当在合成和真实世界的数据集上评估我们的方法时,我们在经验上得到了非常有希望的结果,用于只读分析工作负载。然而,许多开放性的挑战仍然存在,例如如何处理大量写入的工作负载,我们概述了未来工作的许多可能方向。此外,我们相信,我们可以用同样的原理来取代(数据库)系统中常用的其他组件和操作。如果成功的话,将学习到的模型深深嵌入到算法和数据结构中的核心思想可能会导致与目前开发系统的方式彻底不同。
本文的其余部分概述如下。在接下来的两节中,我们以B-Tree为例介绍了学习索引的一般概念。在第4节中,我们将这个想法扩展到哈希图,在第5节中扩展到布鲁姆过滤器。所有章节都包含一个单独的评估。最后在第6节中我们讨论了相关的工作,并在第7节中得出结论。

2 RANGE INDEX

范围索引结构,像B-Tree,已经是模型了:给定一个键,它们 "预测 "一个值在一个键排序的集合中的位置。要看到这一点,请考虑图1(a)所示的分析型内存数据库(即只读)中的一个B-Tree索引,该索引覆盖了排序后的主键列。在这种情况下,B-Tree提供了一个从查询键到排序后的记录数组内某一位置的映射,并保证该位置的记录的键是第一个等于或高于查询键的键。数据必须被排序以允许有效的范围请求。同样的一般概念也适用于二级索引,数据将是<key,record_pointer>对的列表,key是索引值,pointer是对记录的引用。
出于效率的考虑,通常不对排序后的记录的每一个键进行索引,而只对每n个记录的键进行索引,即一个页面的第一个键。这里我们只假设固定长度的记录和连续内存区域的逻辑分页,即单个阵列,而不是位于不同内存区域的物理页(物理页和可变长度记录在附录D.2中讨论)。只对每一页的第一个键进行索引,有助于大大减少索引需要存储的键的数量,而不会有任何明显的性能损失。因此,B-Tree是一个模型,或者用ML术语来说,是一个回归树:它将一个键映射到一个有最小和最大误差的位置(最小误差为0,最大误差为页面大小),如果键存在的话,可以保证在该区域找到它。因此,我们可以用其他类型的ML模型代替索引,包括神经网络,只要它们也能提供类似的关于最小和最大误差的有力保证。
乍一看,似乎很难为其他类型的ML模型提供相同的保证,但实际上却非常简单。首先,B-Tree只对存储的密钥提供强大的最小和最大错误保证,而不是对所有可能的密钥。对于新数据,B树需要重新平衡,或者在机器学习术语中重新训练,以便仍然能够提供相同的错误保证。也就是说,对于单调模型,我们需要做的唯一一件事就是为每个键执行模型,并记住对位置的最坏过度和不足预测,以计算最小和最大误差。第二,更重要的是,甚至不需要强错误界限。无论如何,必须对数据进行排序以支持范围请求,因此任何错误都可以通过围绕预测的局部搜索(例如,使用指数搜索)轻松纠正,因此,甚至允许非单调模型。因此,我们能够用任何其他类型的回归模型(包括线性回归或神经网络)来代替B-树(见图1(B))。
现在,在用学习型索引取代B-Tree之前,我们还需要解决其他的技术挑战。例如,B-Tree在插入和查找方面的成本是有限制的,而且特别善于利用缓存的优势。另外,B-Tree可以将键映射到没有连续映射到内存或磁盘的页面。所有这些都是有趣的挑战/研究问题,并在本节和附录中详细解释,以及潜在的解决方案。
同时,使用其他类型的模型作为索引可以提供巨大的好处。最重要的是,它有可能将B-Tree查找的log n成本转化为一个恒定的操作。例如,假设一个有1M个唯一键的数据集,其值在1M和2M之间(所以值1,000,009被存储在位置10)。在这种情况下,一个简单的线性模型,包括一个单一的乘法和加法,可以完美地预测任何键的位置,进行点查询或范围扫描,而B-Tree则需要对数n次操作。机器学习,特别是神经网络的魅力在于,它们能够学习各种数据分布、混合物和其他数据的特殊性和模式。挑战在于如何平衡模型的复杂性和其准确性。
在本文的大部分讨论中,我们保持本节的简化假设:我们只索引一个按键排序的内存密集数组。这似乎是限制性的,但许多现代硬件优化的B-Tree,例如FAST[44],都是完全相同的假设,而且这些索引在内存数据库系统中相当普遍,因为它们比扫描或二分搜索的性能更优越[44, 48]。然而,虽然我们的一些技术可以很好地转化为某些场景(例如,磁盘驻留数据与非常大的块,例如在Bigtable[23]中使用),但对于其他场景(细粒度分页,插入式重载工作负载等)需要更多的研究。在附录D.2中,我们更详细地讨论了其中的一些挑战和潜在的解决方案。
2.1 What Model Complexity Can We Afford?
为了更好地理解模型的复杂性,重要的是要知道在遍历B-Tree的相同时间内可以进行多少操作,以及模型需要达到什么样的精度才能比B-Tree更有效率。
考虑一个索引1亿条记录的B-Tree,页面大小为100。我们可以把每个B-Tree节点看作是划分空间的一种方式,减少 “误差”,缩小寻找数据的区域。因此,我们说页数为100的B-Tree的每个节点的精度增益为1/100,我们总共需要遍历log100N个节点。所以第一个节点将空间从100M分割到100M/100=1M,第二个节点从1M分割到1M/100=10k,以此类推,直到我们找到记录。现在,用二分搜索遍历一个B-Tree页面大约需要50个周期,而且是众所周知的很难并行化。相比之下,现代的CPU每周期可以进行8-16次SIMD操作。因此,只要一个模型在每50∗8=400次算术运算中具有比1/100更好的精度增益,就会更快。请注意,这个计算仍然假设所有的B-Tree页面都在缓存中。一个缓存缺失会花费50-100个额外的周期,因此会允许更复杂的模型。
此外,机器学习加速器正在完全改变游戏规则。它们允许在相同的时间内运行更复杂的模型,并从CPU卸载计算。例如,英伟达最新的Tesla V100 GPU能够实现120 TeraFlops的低精度深度学习算术运算(每周期≈60,000次运算)。假设整个学习的索引适合于GPU的内存(我们在第3.7节中表明,这是一个非常合理的假设),在短短的30个周期内,我们可以执行100万次神经网络操作。当然,从GPU传输输入和检索结果的延迟仍然明显较高,但考虑到批处理和/或最近更紧密地整合CPU/GPU/TPU的趋势,这个问题并非不可克服[4]。最后,可以预见的是,GPU/TPU的能力和每秒浮动/int操作的数量将继续增加,而提高CPU执行if语句的性能的进展基本上停滞不前[5]。尽管我们认为GPU/TPU是在实践中采用学习型索引的主要原因之一,但在本文中,我们将重点放在更为有限的CPU上,以更好地研究在不受硬件变化影响的情况下通过机器学习取代和增强索引的意义。
2.2 Range Index Models are CDF Models
如本节开头所述,索引是一个模型,它将一个键作为输入并预测记录的位置。对于点查询来说,记录的顺序并不重要,而对于范围查询来说,数据必须根据查询键进行排序,这样才能有效地检索到范围内的所有数据项(例如,在一个时间范围内)。这导致了一个有趣的观察:一个预测给定键在排序数组内的位置的模型有效地接近了累积分布函数(CDF)。我们可以对数据的CDF进行建模,以预测位置,如下
其中p是位置估计,F(Key)是数据的估计累积分布函数,用于估计观察到小于或等于查找键P(X≤Key)的可能性,N是键的总数(也见图2)。这一观察开辟了一系列新的有趣的方向。首先,它意味着索引实际上需要学习一个数据分布。B-Tree通过建立一个回归树来 "学习 "数据分布。一个线性回归模型将通过最小化一个线性函数的(平方)误差来学习数据分布。第二,估计一个数据集的分布是一个众所周知的问题,学习索引可以从几十年的研究中受益。第三,学习CDF在优化其他类型的索引结构和潜在算法方面也起着关键作用,我们将在本文后面概述。第四,关于理论CDF与经验CDF的接近程度的研究由来已久,这为从理论上理解这种方法的好处提供了立足点[28]。我们在附录A中对我们的方法的扩展性给出了一个高水平的理论分析。

2.3 A First, Naïve Learned Index

为了更好地理解通过学习模型取代B-Tree的要求,我们使用了2亿条网络服务器日志记录,目的是使用Tensorflow[9]在时间戳上建立一个二级索引。我们使用ReLU激活函数训练了一个两层完全连接的神经网络,每层有32个神经元;时间戳是输入特征,排序数组中的位置是标签。之后,我们用Tensorflow和Python作为前端,测量了一个随机选择的密钥的查询时间(不考虑第一个数字,取几次运行的平均值)。
在这种情况下,我们实现了每秒≈1250次的预测,也就是说,用Tensorflow执行模型需要≈80,000纳秒(ns),不包括搜索时间(从预测位置找到实际记录的时间)。作为一个比较点,在相同的数据上进行B-Tree遍历需要≈300ns,在整个数据上进行二进制搜索大约需要≈900ns。仔细观察,我们发现我们的天真方法在几个关键方面受到限制:(1)Tensorflow的设计是为了有效地运行更大的模型,而不是小模型,因此,有很大的调用开销,特别是在Python作为前端的时候。(2) B-Tree,或一般的决策树,在用少数操作过度拟合数据方面确实不错,因为它们使用简单的if语句递归地划分空间。相比之下,其他模型在近似CDF的一般形状方面效率明显更高,但在单个数据实例水平上的准确性却有问题。要看到这一点,请再次考虑图2。该图表明,从顶层来看,CDF函数显得非常平滑和规则。然而,如果放大到单个记录,就会出现越来越多的不规则现象;这是一个众所周知的统计效应。因此,像神经网络、多项式回归等模型,在将一个项目的位置从整个数据集缩小到数千个区域时,可能更节省CPU和空间,但单个神经网络通常需要更多的空间和CPU时间来完成 “最后一英里”,以便将误差从数千个进一步减少到数百个。(3) B-Tree的缓存和操作效率非常高,因为它们总是将顶部节点放在缓存中,并在需要时访问其他页面。相反,标准的神经网络需要所有的权重来计算预测,这在乘法的数量上有很高的成本。

3 THE RM-INDEX

为了克服这些挑战并探索模型作为索引替代或优化的潜力,我们开发了学习索引框架(LIF)、递归模型索引(RMI)和基于标准错误的搜索策略。我们主要关注简单的、全连接的神经网络,因为它们的简单性和灵活性,但我们相信其他类型的模型可能提供额外的好处。
3.1 The Learning Index Framework (LIF)
LIF可以被看作是一个索引合成系统;给定一个索引规范,LIF会生成不同的索引配置,对其进行优化,并自动测试。虽然LIF可以即时学习简单的模型(如线性回归模型),但它依靠Tensorflow来学习更复杂的模型(如NN)。然而,它从未在推理中使用Tensorflow。相反,给定一个经过训练的Tensorflow模型,LIF会自动从模型中提取所有的权重,并根据模型规范在C++中生成高效的索引结构。我们的代码生成是专门为小模型设计的,并消除了Tensorflow在管理大模型时的所有不必要的开销和工具。这里我们利用了[25]的想法,它已经展示了如何避免Spark运行时间的不必要的开销。因此,我们能够以30纳秒的速度执行简单的模型。然而,应该指出的是,LIF仍然是一个实验性的框架,它被用来快速评估不同的索引配置(如ML模型、页面大小、搜索策略等),这引入了额外的计数器、虚拟函数调用等形式的开销。此外,除了编译器所做的矢量化之外,我们没有利用特殊的SIMD内核。虽然这些低效率在我们的评估中并不重要,因为我们总是使用我们的框架来确保公平的比较,但对于生产环境或与其他实现比较所报告的性能数字时,这些低效率应该被考虑/避免。

3.2 递归模型索引

如第2.3节所述,建立替代性学习模型以取代B-Tree的关键挑战之一是最后一英里搜索的准确性。例如,使用单一模型将1亿条记录的预测误差减少到几百个,这通常是很困难的。同时,将误差从100M减少到10k,例如,通过一个模型替换B-Tree的前2层,精度增益为100∗100=10000,即使是简单的模型也更容易实现。同样地,将误差从10k减少到100是一个更简单的问题,因为模型可以只关注数据的一个子集。
基于这一观察,并受专家工作[62]的启发,我们提出了递归回归模型(见图3)。也就是说,我们建立了一个模型层次结构,在每个阶段,模型都将键作为输入,并根据它选择另一个模型,直到最后阶段预测位置。更正式地说,对于我们的模型f(x),其中x是键,y∈[0,N]是位置,我们假设在阶段l中有Ml个模型。我们在第0阶段训练模型,f0(x)≈y。l阶段中的第k个模型表示为fl(k),loss

注意,我们这里使用递归表示方法。总的来说,我们用损失Ll迭代训练每个阶段,以建立完整的模型。
思考不同模型的一种方式是,每个模型对钥匙的位置做一个有一定误差的预测,预测结果用来选择下一个模型,这个模型负责钥匙空间的某个区域,以较低的误差做更好的预测。然而,递归模型索引不一定是树。如图3所示,一个阶段的不同模型有可能在下面的阶段挑选相同的模型。此外,每个模型不一定像B-Tree那样覆盖相同数量的记录(即一个页面大小为100的B-Tree覆盖100或更少的记录)。最后,根据所使用的模型,不同阶段之间的预测不一定可以被解释为位置估计,而应该被视为挑选一个对某些键有更好知识的专家(也见[62])。
这种模型结构有几个好处。(1) 它将模型的大小和复杂性与执行成本分开。(2) 它利用了很容易学习数据分布的整体形状这一事实。(3) 它有效地将空间划分为较小的子范围,就像B-Tree一样,使其更容易以较少的操作达到所需的 "最后一英里 "的精度。(4) 在各阶段之间不需要搜索过程。例如,模型1.1的输出被直接用于挑选下一阶段的模型。这不仅减少了管理结构的指令数量,而且还允许将整个索引表示为TPU/GPU的稀疏矩阵乘法。

3.3 Hybrid Indexes

递归模型指数的另一个优点是,我们能够建立混合模型。例如,在顶层,一个小型的ReLU神经网可能是最好的选择,因为它们通常能够学习广泛的复杂数据分布,而在模型层次结构的底部的模型可能是成千上万的简单线性回归模型,因为它们在空间和执行时间上都很便宜。此外,如果数据特别难学,我们甚至可以在底部阶段使用传统的B-Tree。
在本文中,我们重点关注2种类型的模型,即具有零到两个全连接隐藏层和ReLU激活函数的简单神经网络,层宽不超过32个神经元的B-Tree(又称决策树)。注意,零隐藏层的NN相当于线性回归。给定一个索引配置,其中指定阶段的数量和每阶段的模型数量为一个大小数组,混合指数的端到端训练按算法1所示进行。

从整个数据集开始(第3行),它首先训练顶部节点模型。基于这个顶节点模型的预测,它再从下一阶段挑选模型(第9行和第10行),并添加所有属于该模型的键(第10行)。最后,在混合索引的情况下,如果绝对最小/最大误差超过预定的阈值,则用B-Tree替换NN模型来优化索引(行11-14)。
请注意,我们将每个模型的标准误差和最小、最大误差存储在最后阶段。这样做的好处是,我们可以根据每个键所使用的模型来单独限制搜索空间。目前,我们通过简单的网格搜索来调整模型的各种参数(即阶段的数量,每个模型的隐藏层等)。然而,存在许多潜在的优化,以加快从ML自动调整到采样的训练过程。
请注意,混合索引允许我们将学到的索引的最坏情况下的性能与B-Tree的性能相联系。也就是说,在极难学习的数据分布的情况下,所有的模型都会被B-Tree自动取代,这实际上是一个完整的B-Tree。

3.4 Search Strategies and Monotonicity

范围索引通常实现一个 upper _bound(key) [lower _ bound(key)] 接口,以找到排序数组中第一个等于或高于[低于]查询键的键的位置,从而有效地支持范围请求。因此,对于学习过的范围索引,我们必须在预测的基础上找到比查找键高[低]的第一个键。尽管做了很多努力,但反复报道[8],二进制搜索或扫描具有小的有效载荷的记录通常是在一个排序的数组中找到一个键的最快策略,因为替代技术的额外复杂性很少得到回报。然而,学习型索引在这里可能有一个优势:模型实际上预测了钥匙的位置,而不仅仅是钥匙的区域(即页面)。这里我们讨论两个简单的搜索策略,它们利用了这一信息。
Model Biased Search:我们的默认搜索策略,它与传统的二进制搜索的区别仅在于第一个中间点被设置为模型预测的值。
Biased Quaternary Search:四次搜索采取的是三点代替一个分割点,希望在数据不在缓存中的情况下,硬件能一次性预取所有三个数据点,以达到更好的性能。在我们的实现中,我们将四级搜索的初始三个中间点定义为pos-σ ,pos,pos+σ。也就是说,我们猜测大部分的预测是准确的,并首先围绕位置估计集中注意力,然后继续进行传统的四元搜索。
在我们所有的实验中,我们使用最小误差和最大误差作为所有技术的搜索区域。也就是说,我们对每个钥匙都执行了RMI模型(recursive-model indexes),并存储了每个最后阶段模型最差的过度和不足预测值。虽然这种技术保证了找到所有现有的钥匙,但对于不存在的钥匙,如果RMI模型不是单调的,它可能会返回错误的上界或下界。为了克服这个问题,一个选择是强迫我们的RMI模型是单调的,正如机器学习中所研究的那样[41, 71]。
另外,对于非单调性模型,我们可以自动调整搜索区域。也就是说,如果找到的上(下)限键在最小和最大误差所定义的搜索区域的边界上,我们就逐步调整搜索区域。然而,另一种可能性是,使用指数搜索技术。假设误差呈正态分布,这些技术的平均效果应该和其他搜索策略一样好,同时不需要存储任何最小和最大误差。

3.5 Indexing Strings

我们主要关注实值键的索引,但许多数据库依赖于字符串的索引,幸运的是,大量的机器学习研究都集中在对字符串进行建模。和以前一样,我们需要设计一个高效而富有表现力的字符串模型。为字符串做好这一点,会带来一些独特的挑战。
第一个设计考虑是如何将字符串变成模型的特征,通常称为标记化(tokenization)。为了简单和高效,我们认为一个n长的字符串是一个特征向量x∈Rn,其中xi是ASCII十进制值(或Unicode十进制值,取决于字符串)。此外,如果所有的输入都是同等大小,大多数ML模型的运行效率更高。因此,我们将设置一个最大的输入长度N。由于数据是按词典排序的,我们将在标记化之前将键截断到长度为N。对于长度为n<N的字符串,我们设置i>n的xi=0。
为了提高效率,我们一般采用与实值输入类似的建模方法。我们学习一个相对较小的前馈神经网络的层次结构。线性模型w - x + b的乘法和加法的数量与输入长度N呈线性关系。即使只有一个宽度为h的隐藏层的前馈神经网络也会进行O(hN)的乘法和加法。
最终,我们相信未来有重大的研究,可以优化字符串键的学习索引。例如,我们可以很容易地想象其他标记化算法。在自然语言处理中,有大量关于字符串标记化的研究,以将字符串分成对ML模型更有用的部分,例如,翻译中的词件[70]。此外,将后缀树的想法与学习索引结合起来,以及探索更复杂的模型架构(例如,循环和卷积神经网络)可能是有趣的。

3.6 Training

虽然训练(即加载)时间不是本文的重点,但应该指出的是,我们所有的模型,浅层NN或甚至简单的线性/多变量回归模型,训练速度都相对较快。而简单的NNs可以使用随机梯度下降法有效地训练,并且可以在随机数据上不到一次到几次的时间内收敛,线性多变量模型(例如,也是0层的NN)存在一个封闭式的解决方案,它们可以在排序的数据上一次性训练完成。因此,对于2亿条记录来说,训练一个简单的RMI指数不会超过几秒钟,(当然,这取决于进行了多少自动调整);神经网络可以在每个模型上训练几分钟,这取决于复杂性。还要注意的是,在整个数据上训练顶级模型通常是没有必要的,因为那些模型甚至在对整个随机数据进行一次扫描之前就经常收敛了。这部分是因为我们使用的是简单的模型,并不太关心精度的最后几个数字点,因为它对索引性能的影响不大。最后,来自ML社区的关于改善学习时间的研究[27, 72]适用于我们的背景,我们期望未来在这个方向上有很多研究。

3.7 Result

我们在几个真实的和合成的数据集上评估了所学的范围索引的空间和速度,与其他读优化的索引结构进行比较

3.7.1 Integer Datasets

作为第一个实验,我们在三个不同的整数数据集上比较了使用2阶段RMI模型和不同的第二阶段大小(10k、50k、100k和200k)的学习索引与不同页面大小的读优化B-Tree。对于数据,我们使用了2个真实世界的数据集,(1)Weblogs和(2)Maps[56],以及(3)一个合成数据集,Lognormal。Weblogs数据集包含了数年来对一个主要大学网站的每个请求的2亿条日志。我们使用唯一的请求时间戳作为索引键。这个数据集对于学习索引来说几乎是最坏的情况,因为它包含了由课程表、周末、假期、午休、部门活动、学期休息等引起的非常复杂的时间模式,这些都是众所周知的难以学习的。对于地图数据集,我们索引了全球范围内≈2亿个用户维护的特征(例如道路、博物馆、咖啡店)的经度。不出所料,地点的经度是相对线性的,比网络日志数据集的不规则性要少。最后,为了测试该指数在重尾分布上的工作情况,我们生成了一个由1.9亿个独特的值组成的合成数据集,这些值是从一个对数正态分布中抽样出来的,μ=0,σ=2。这些值被放大为整数,最大为1B。当然,这个数据是高度非线性的,使得使用神经网络学习CDF更加困难。对于所有的B-Tree实验,我们使用64位的键和64位的有效载荷/值。
作为我们的基线,我们使用了一个高质量的B-Tree实现,它与stx::btree类似,但有进一步的缓存线优化,密集的页面(即填充因子为100%),并且性能非常有竞争力。为了调整2阶段的学习索引,我们使用了简单的网格搜索,在具有零到两个隐藏层的神经网络上进行搜索,层宽从4到32个节点不等。一般来说,我们发现第一阶段的简单(0个隐藏层)到半复杂(2个隐藏层和8-或16个宽度)的模型效果最好。对于第二阶段,简单的线性模型有最好的表现。这并不奇怪,因为对于最后一英里来说,执行复杂的模型往往是不值得的,而线性模型可以被最佳地学习。
Learned Index vs B-Tree performance:
主要结果显示在图4中。注意,B-Tree的页面大小表示的是每页的键数,而不是以字节为单位的大小,后者实际上更大。作为主要指标,我们显示了以MB为单位的大小,以纳秒为单位的总查询时间,以及以纳秒为单位的模型执行时间(无论是B-Tree遍历还是ML模型),以及与总时间相比的百分比。此外,我们在括号中显示了与页面大小为128的B-Tree相比的速度和空间节省,作为大小和查找栏的一部分。我们选择128页的大小作为固定的参考点,因为它为B-Tree提供了最好的查找性能(注意,通过简单地没有索引来节省空间而牺牲查找性能总是很容易的)。在加速和大小这两栏中的颜色编码表示索引相对于参考点的快慢程度(大或小)。
可以看出,在几乎所有的配置中,学习型索引都比B-Tree索引要快1.5-3倍,而体积却小两个数量级。当然,B-Tree可以进一步压缩,但要付出解压的CPU时间。然而,这些优化大多是正交的,同样适用于神经网络(如果不是更多)。例如,神经网络可以通过使用4位或8位整数而不是32位或64位浮点值来表示模型参数(这个过程被称为量化)进行压缩。这种程度的压缩可以释放出学习指数的额外收益。
不出所料,第二阶段的规模对索引大小和查找性能有很大影响。就第2.1节的分析而言,在第二阶段使用10,000个或更多的模型尤其令人印象深刻,因为它表明我们的第一阶段模型可以比B-Tree中的单个节点在精度上有更大的跳跃。最后,我们没有报告这些数据集的混合模型或二进制搜索以外的其他搜索技术,因为它们没有提供明显的好处。
Learned Index vs Alternative Baselines:
除了针对我们的读优化B-Trees详细评估学习到的索引之外,我们还将学习到的索引与其他替代基线进行了比较,包括第三方的实现。在下文中,我们将讨论一些替代基线,并在适当的时候将它们与学习索引进行比较。
直方图:B-树近似于基础数据分布的CDF。一个明显的问题是直方图是否可以作为CDF模型使用。原则上,答案是肯定的,但是为了实现快速的数据访问,直方图必须是CDF的低度近似。通常情况下,这需要大量的桶,这使得搜索直方图本身很昂贵。尤其是当这些桶有不同的桶的边界以有效地处理数据倾斜时,这更是如此,所以只有少数桶是空的或太满。对这个问题的明显解决方案将产生一个B-Tree,因此直方图没有进一步讨论。
Look-up table:
B-Tree的一个简单的替代品是(分层的)查找表。通常,查找表有一个固定的大小和结构(例如,64个槽,每个槽指向另一个64个槽,等等)。查找表的优点是,由于其固定的大小,它们可以使用AVX指令进行高度优化。我们包括了与3级查找表的比较,它的构造是将每64个键放入一个数组,包括填充使其成为64的倍数。然后我们在没有填充的数组上再重复一次这个过程,总共创建两个数组。为了查找一个键,我们在顶层表上使用二进制搜索,然后对第二层表和数据本身使用AVX优化的无分支扫描[14]。与其他方法(例如在顶层使用扫描,或在第二层数组或数据上使用二进制搜索)相比,这种配置导致了最快的查询时间。
FAST: FAST[44]是一个高度SIMD优化的数据结构。我们使用来自[47]的代码进行比较。然而,应该注意的是,FAST总是要求以2的幂数分配内存,以使用无分支的SIMD指令,这可能会导致索引明显增大。
固定大小的B-树和插值搜索:
最后,正如最近的一篇博文[1]中提出的,我们创建了一个固定高度的B-Tree,并进行插值搜索。B-Tree高度的设置,使树的总大小为1.5MB,与我们学习的模型相似。
Learned indexes without overhead:
对于我们的学习index,我们使用了一个2阶段的RMI指数,顶部是多变量线性回归模型,底部是简单的线性模型。我们通过自动创建和选择key、log(key)、key2等形式的特征,对顶部模型使用简单的自动特征工程。多变量线性回归是NN的一个有趣的替代方案,因为它特别适合于只用一些操作来拟合非线性模式。此外,我们在我们的基准框架之外实现了学到的index,以确保公平的比较。

为了进行比较,我们使用了对数正态数据,其有效载荷为一个8字节的指针。结果可以在图5中看到。从公平条件下的数据集可以看出,学习型索引提供了最好的整体性能,同时节省了大量的内存。应该指出的是,由于对齐要求,FAST索引是很大的。
虽然结果是非常有希望的,但我们绝不是说学习型索引在规模或速度方面永远是最好的选择。相反,学习型索引提供了一种思考索引的新方法,需要更多的研究来充分理解其影响。

3.7.2 String Datasets.

我们还在一个大型网络索引的1000万个非连续的文档-ID上创建了一个二级索引,作为谷歌一个真实产品的一部分,以测试学习索引在字符串上的表现。基于字符串的文档-ID数据集的结果显示在图6中,其中也包括混合模型。此外,我们在表中包括了我们最好的模型,这是一个带有四级搜索的非混合型RMI模型索引,名为 “学习型QS”(表格底部)。所有的RMI指数在第二阶段使用了10,000个模型,对于混合指数,我们使用了两个阈值,128和64,作为模型在被B-Tree替换之前的最大容忍绝对误差。
可以看出,对于字符串来说,学习索引比BTrees的速度提升并不突出。部分原因是模型执行的成本比较高,GPU/TPU可以解决这个问题。此外,在字符串上的搜索要昂贵得多,因此更高的精度往往会得到回报;混合索引有助于提高性能的原因在于,通过B-Trees取代性能不好的模型。
由于搜索的成本,不同的搜索策略会产生较大的差异。例如,如图6所示,一个具有1个隐藏层的NN和有偏见的二进制搜索的搜索时间为1102ns。相比之下,我们的有偏二元搜索在相同的模型下只需要658ns,这是一个显著的改进。有偏见的搜索和四元搜索表现更好的原因是它们考虑到了模型误差。

4 POINT INDEX

除了范围索引之外,用于点查询的哈希图在DBMS中也起着类似的重要作用。从概念上讲,哈希图使用一个哈希函数来确定地将键映射到数组中的位置(见图7(a))。任何高效的哈希图实现的关键挑战是如何防止太多的不同键被映射到哈希图中的同一位置,因此被称为冲突。例如,我们假设有1亿条记录,哈希图的大小为1亿条。对于一个均匀随机化密钥的哈希函数来说,预期冲突的数量可以类似于生日悖论得出,预期会有33%或33M个槽。对于这些冲突中的每一个,Hash-map架构都需要处理这个冲突。例如,单独的链式哈希图将创建一个链接列表来处理冲突(见图7(a))。然而,存在许多替代方案,包括二次探测,使用有几个槽的桶,直至同时使用一个以上的哈希函数(例如,如Cuckoo Hashing [57])。
然而,无论哈希图架构如何,冲突都会对性能和/或存储需求产生重大影响,机器学习模型可能会提供一个替代方案来减少冲突的数量。虽然学习模型作为哈希函数的想法并不新鲜,但现有的技术并没有利用底层数据分布的优势。例如,各种完美的散列技术[26]也试图避免冲突,但作为散列函数一部分的数据结构随着数据大小的增长而增长;学习模型可能不具备这种属性(回顾一下,在1到100M之间索引所有键的例子)。就我们所知,还没有探索过是否有可能学习产生更有效的点索引的模型。
4.1 The Hash-Model Index
令人惊讶的是,学习键值分布的CDF是学习更好的哈希函数的一个潜在途径。然而,与范围索引相比,我们的目标不是紧凑地存储记录或严格排序。相反,我们可以通过哈希图的目标大小M来扩展CDF,并使用h(K)=F (K)∗ M,以密钥K作为我们的哈希函数。如果模型F完美地学习了钥匙的经验CDF,就不会存在冲突。此外,哈希函数与实际的哈希图架构是正交的,可以与单独的链或任何其他的哈希图类型相结合。
对于模型,我们可以再次利用上一节中的递归模型架构。显然,像以前一样,在索引的大小和性能之间存在着一个权衡,这受到模型和数据集的影响。
请注意,如何处理插入、查找和冲突取决于哈希图的架构。因此,与传统的哈希函数相比,学习的哈希函数所提供的好处取决于两个关键因素,即把钥匙映射到一个均匀分布的空间。(1) 模型如何准确地代表观察到的CDF。例如,如果数据是由均匀分布产生的,一个简单的线性模型将能够学习一般的数据分布,但产生的哈希函数不会比任何足够随机的哈希函数更好。(2) 哈希图架构:根据架构、实现细节、有效载荷(即值)、冲突解决策略,以及将或可以分配多少更多的内存(即槽),大大影响了性能。例如,对于小的键和小的或没有的值,传统的Cuckoo散列函数可能会工作得很好,而较大的有效载荷或分布式散列图可能会从避免冲突中受益更多,从而从学习的散列函数中受益。

存在索引
虽然范围索引和点索引都学习了键的分布,但存在索引需要学习一个将键与其他事物分开的函数。换句话说,对于一个点索引来说,一个好的散列函数是一个在键之间有很少碰撞的函数,而对于一个布隆过滤器来说,一个好的散列函数是一个在键之间有很多碰撞,在非键之间有很多碰撞,但在键和非键之间有很少碰撞的函数。我们在下面考虑如何学习这样一个函数f,以及如何将其纳入存在索引。
虽然传统的布隆过滤器保证假阴性率(FNR)为零,并为事先选择的任何一组查询提供特定的假阳性率(FPR)[22],但我们遵循的理念是,我们希望在保持FNR为零的同时,特别为现实的查询提供特定的FPR。也就是说,我们在一个保留的查询数据集上测量FPR,这在评估ML系统时很常见[30]。虽然这些定义不同,但我们相信,我们可以观察到查询的分布,例如从历史日志中观察到查询的分布,这个假设在许多应用中都是成立的,特别是在数据库中。
传统上,存在性指数不利用键的分布,也不利用它们与非键的区别,但学习型布鲁姆过滤器可以。例如,如果我们的数据库包括0≤x<n的所有整数x,那么只要计算f(x)≡1[0≤x<n],就可以在恒定时间内计算出存在指数,而且几乎没有内存占用。
在考虑用于ML目的的数据分布时,我们必须考虑非键的数据集。在这项工作中,我们考虑的情况是,非键来自可观察到的历史查询,我们假设未来的查询来自与历史查询相同的分布。当这一假设不成立时,可以使用随机生成的密钥、由机器学习模型生成的非密钥[34]、直接解决协变量转移的重要性加权[18],或者为了稳健性而进行对抗性训练[65];我们将此作为未来工作。我们用K表示钥匙集,用U表示非钥匙集。
构建存在指数的一种方式是作为一个二元概率分类任务。也就是说,我们要学习一个模型f,它可以预测一个查询x是一个钥匙还是非钥匙。例如,对于字符串,我们可以训练一个循环神经网络(RNN)或卷积神经网络(CNN)。

7 CONCLUSION AND FUTURE WORK

我们已经表明,学习型索引可以通过利用被索引的数据的分布来提供显著的好处。这为许多有趣的研究问题打开了大门。
Other ML Models:虽然我们的重点是混合专家的线性模型和神经网络,但还有许多其他ML模型类型以及将它们与传统数据结构相结合的方法,值得探索。
Multi-Dimensional Indexes:

[论文阅读] The Case for Learned Index Structures相关推荐

  1. CDFShop: Exploring and Optimizing Learned Index Structures(SIGMOD21)

    索引是数据管理应用程序的一个关键组件.虽然树状结构(如b -树)已经获得了巨大的成功,但最近的工作表明,由机器学习模型支持的索引结构(学习的索引结构)可以在减少内存占用的情况下实现较低的查找时间.这个 ...

  2. 经典 Learned Index 结构设计及其应用

    引言 学习索引是一种新型的索引结构,可以帮助数据库更快地查找数据.学习索引的诞生可以追溯到 2017 年,由 Google Brain 团队的 Kraska 等人在论文[1]中首次提出,探讨了使用神经 ...

  3. 论文阅读——Updatable Learned Index with Precise Positions(VLDB‘21)

    1.介绍: 索引在现代数据库引擎中起着至关重要的作用,可以加速查询处理."学习索引"的新模式显著改变了DBMS中索引结构的设计方式.关键的想法是,learned index把索引结 ...

  4. 【论文阅读】SIGMOD‘19 FITing-Tree: A Data-aware Index Structure

    [论文阅读]SIGMOD'19 FITing-Tree: A Data-aware Index Structure 介绍 传统的索引结构(比如B+tree),需要消耗大量的空间,在一些OLTP负载下, ...

  5. 【论文阅读】A Gentle Introduction to Graph Neural Networks [图神经网络入门](7)

    [论文阅读]A Gentle Introduction to Graph Neural Networks [图神经网络入门](7) Into the Weeds Other types of grap ...

  6. 深度学习论文阅读(四):GoogLeNet《Going Deeper with Convolutions》

    深度学习论文阅读(四):GoogLeNet<Going Deeper with Convolutions> Abstract 摘要 1.Introduction 引言 2. Related ...

  7. 【论文阅读】A Gentle Introduction to Graph Neural Networks [图神经网络入门](2)

    [论文阅读]A Gentle Introduction to Graph Neural Networks [图神经网络入门](2) Graphs and where to find them 图以及在 ...

  8. 深度学习论文阅读目标检测篇(一):R-CNN《Rich feature hierarchies for accurate object detection and semantic...》

    深度学习论文阅读目标检测篇(一):R-CNN<Rich feature hierarchies for accurate object detection and semantic segmen ...

  9. 深度学习论文阅读目标检测篇(三):Faster R-CNN《 Towards Real-Time Object Detection with Region Proposal Networks》

    深度学习论文阅读目标检测篇(三):Faster R-CNN< Towards Real-Time Object Detection with Region Proposal Networks&g ...

最新文章

  1. 【天池直播】图像系列直播第一讲--带你入坑深度学习
  2. 【Json】json解析
  3. AI:一个20年程序猿的学习资料大全—区块链/大数据/数据集/云计算/前沿大会资料——只有你不想要的,没有你找不到的
  4. python滚动条_python中selenium操作下拉滚动条的几种方法汇总
  5. C#中如何获取鼠标及控件的位置坐标(相对于屏幕)
  6. 从键盘上录入学生人数和每个学生的分数,按分数降序输出所有的分数,java冒泡排序应用
  7. Merkle Patricia Tree 详解
  8. easyui onclickrow 中获取列名_获取Chrome浏览器历史浏览记录实例
  9. BZOJ.5093.[Lydsy1711月赛]图的价值(NTT 斯特林数)
  10. linux 微信客户端 mojo,QQ微信一体客户端教程
  11. 北京林业大学matlab公选课,北京林业大学公选课要求及分类.doc
  12. 一文读懂DEFI借贷以及清算的含义
  13. openresty ngx.ctx表
  14. 云原生|kubernetes|minikube的部署安装完全手册(修订版)
  15. 9种小程序赚钱方法!看懂的人已经在行动了
  16. CAD建筑制图入门加老虎窗
  17. java visibility_CSS visibility属性
  18. Centos7安装trac手册
  19. 【vue-router源码】十二、useRoute、useRouter、useLink源码分析
  20. 经典论文解析——YOLOv1——目标检测

热门文章

  1. 数字面板仪表的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  2. Yan Goodfellow 在生成对抗网络(GANs)论文中提到的比喻 “the Helvetica Scenario” 的解释及其来龙去脉
  3. 前端:一键清除项目中无用的console.log代码
  4. HelloWorld详解
  5. steam 32位 linux 下载,Steam将停止支持基于32位兼容性的Ubuntu Linux
  6. 基于Springboot+Mybatis的学校教务管理系统
  7. 大连话翻译成普通话(看谁翻译的准确)
  8. Unity录屏实现(一)
  9. 云原生和云计算的区别
  10. 通过例子学TLA+(五)--FIFO Sequences