论文总结与思路分享

当AI遇上数据库?将会上演何剧情?

2019-12-07  本文已影响0人  CPinging

前文小言:最近想要从数据库角度入手来提升AI应用训练过程的效率,所以找到了这篇2016年的文章《Database Meets Deep Learning: Challenges and Opportunities》。文章只有6页,读完后有一些想法体会,于是将相关收获与文章内容总结于此。欢迎一同交流。

文章概述

深度学习的火爆程度我就不用举例来说明了,现在各大实验室基本均将AI这个工具纳入麾下。而数据库作为计算机领域的老牌技术,也已经深入学术界与企业内部。那么当新旧两种事务相见时会发生怎样的故事呢?他们有何相似性呢?又如何发掘各自的特征来相辅相成呢?听文章娓娓道来。:)

背景介绍

深度学习其实早在20年前就 已经出现,而为何在当今时刻复苏呢?原因可以归结为:(1)GPU等的出现使得算力越来越强,以至于新的模型能够很快的被建立;(2)数据集的获取越发的方便,并且更多领域的知识容易通过数据集来被机器所获知。

对于数据库领域的研究人员来说,当自身的研究方向遇上了发展迅猛的AI应该怎么考虑问题呢?

首先,数据库领域的知识能否帮助AI?其中包括AI的训练与推理阶段。一般来说,一个效果显著的模型都不外乎具有大的数据集来训练并且模型相对较为复杂。但是两面性同样存在,这么大的数据集与这么复杂的模型势必会带来大的训练开销。于是像Caffe,Tensorflow等框架孕育而生。了解这些框架的学者不难发现,AI应用于数据库需要考虑相似的问题来进行优化,例如分布式与内存管理。

第二,深度学习的技术能否反馈与数据库?以此帮助数据库更好的发展?这个问题同样值得深入考虑,尤其是需要针对数据库与AI各自的特性来进行思考。

深度学习有什么特性呢?首先它在预测未知事件上是“专家”。然而深度学习需要前期大量的数据集来补充“知识”,而数据库中的数据也有其各自的特点,所以如何在减少预测开销与难度的情况下做到对未知事件的准确预测,无疑是一个挑战。

由于许多读者对AI并不是特别了解,这里我也简单的介绍一下AI的一些背景。

image.png

如上图所示,深度学习模型在训练的时候包括如下几步:(1)初始化网络参数,这里可以随机,可以使用一些技巧;(2)读取一批次的数据用于训练;(3)计算梯度,这里通常有一些算法,例如Back Propagation (BP);Contrastive Divergence (CD) 与Back Propagation Through Time (BPTT),这里就不详细说明各个算法的具体内容,总之这些算法能够使得我的模型向着更好的解移动;(4)更新梯度。

这其中设计到底层相关的数据读取问题,数据处理问题,同时还包括计算时临时数据是否会非常大等问题。这些问题都有待我们使用更优的算法解决。

AI老兄,让数据库拉你一把

目前的AI训练包括单机与分布式。我们首先看单机情况。

目前提升训练效率的最有效方案是使用GPU,其中也包括FPGA。

我们如何更高效的使用硬件资源?

image.png

如上图所示,在运行该流程之前系统可以对整个计算进行检测,此时系统发现W1与W2之间并没有依赖,于是a1与a2操作可以并行执行。而这种并行操作的思想在数据库中也类似。数据库中在事务执行与查询过程中同样需要考虑之间是否有依赖,并且如何解决这些依赖对我整体性能的影响。论文中介绍到数据库习惯使用额外的消费模型来评价数据库的操作是否划算。而对于DL来说,我们是否同样可以利用此想法来寻求一个评价模型帮助我们评价并行是否合理的问题。并且可以将资源的问题引入来将有限的资源用到更重要的地方。

第二个要考虑的地方是内存管理的问题。

深度学习模型势必随着发展而越来越大,占用内存空间将越来越多。而许多研究同样来解决内存占用越来越大的问题,比如(1)《 Low precision arithmetic for deep learning》中CUDA目前使用16位的单精度浮点数来进行计算,从而降低存储使用量;(2)同样内存共享也被使用,例如上图中变量x = sigmoid(x),输入输出均为x则可以共享使用;(3)GPU与CPU的共享同样解决的GPU空间不足的问题,其中将一些变量在两者之间交换从而解决一些问题;(4)除此之外,一些系统在运行过程中释放掉了一些暂时不使用的变量内存,并且在必要时再对其进行计算。

在数据库领域中,内存管理同样是个热点问题。其中包括空间局部性,page与cache优化问题等。除此之外数据恢复在数据库中同样重要。于是log技术在数据库中出现的次数很多。而在考虑Deep Learning的时候,是否需要考虑垃圾回收?是否需要使用内存池技术?结合GPU的情况下上述方案如何进行设计?

分布式训练

为了加速训练过程,通常的做法是使用分布式的方法。其中最常用的方案是PS架构(有主服务器),节点将参数传递给主服务器,并由其来分发更新的参数。在分布式的做法中包括了两种并行方案:数据并行与模型并行。数据并行需要各个节点持有部分数据,而模型并行使得每个节点分的模型的一部分与整个数据。

在这个领域我们需要讨论通信的问题。由于模型参数较多,所以worker 与服务器之间的通信开销非常大。所以同样有一些一部的通信方案被提出。此外,单机中的多个GPU之间的通信问题同样值得思考。

(1)参数与梯度是否可以被压缩?或者如何压缩以减少通信量?
(2)如何设计新的集群管理方案来减少单节点的压力?
(3)是否可以使用更高效的网络方案,如RDMA?该如何使用?

一致性问题我们同样需要考虑,例如同步与异步训练下如何保持各个节点上参数一致性?

错误的恢复在数据库中是一个非常重要的研究方向。其中通过log与checkpoint可以解决这个问题。而目前深度学习框架主要基于checkpoint文件。然而这里我们需要注意的是,频繁的checkpoint会导致严重的开销。与数据库不同的地方是,AI系统中例如SGD可以容忍一定程度的错误,所以log并不需要进行次数太多。

这里我们需要注意的是如何根据SGD的特性与系统的特性来设计新的高效容错方案。由于分布式训练系统会复制模型的状态信息,所以这里可以使用模型状态来代替ckpt文件。

最后我们放一张图来总结一下目前的AI系统所具有的技术。此图中的技术截至到2016年7月。

image.png

总结

总结来说,数据库中许多思想其实可以用于AI系统,而我们是否可以考虑使用数据库本身这个技术来反馈AI?后期需要结合这两个领域多多思考。本文为一些个人想法,其中结合所阅读的文章与最近的一些积累。将此记录于此,欢迎批评指正。

上一篇下一篇

猜你喜欢

热点阅读