基于AI的数据管理技术的难点思考-李迁博士

2021-04-16

人工智能技术已经渗透到各行各业中。2020年,中国人工智能核心产业规模接近650亿元,涉及安防、金融、医疗、教育等诸多领域。面向不同的应用需求,人工智能技术已经衍生出了多种不同的机器学习算法,如深度学习、主动学习、强化学习等等。然而人工智能在落地过程中还面临着几个挑战性问题。

第一,AI使用门槛较高。人工智能算法实际的落地情况并不容乐观。在不同领域下,我们需要构建独立的人工智能系统来执行操作。如TensorFlow框架中,我们首先需要用Python语言书写程序,然后调用相应的机器学习库实际执行模型。整个程序设计和执行流程都需要专门的人力和资源投入,开销比较大。如谷歌公司进行大规模神经网络学习时,曾需要用有255台计算节点的集群单独训练具5.57亿个参数的AmoebaNet-B模型,每个节点上配备1024个TPU组成的芯片组。此外,这类机器学习框架难以与现有数据库兼容,存在数据转换和传输的额外开销。

第二,AI训练效率较低。首先,现有的AI系统缺少执行优化技术(如大规模缓存、数据分块分区、索引等),不仅会导致大量的计算、存储资源上的浪费,而且会提高程序异常的发生率(如内存溢出、进程阻塞等),严重影响了单个任务的执行效率。其次,传统AI的执行方式缺少灵活性,芯片(如CPU、ARM、GPU等)、算法优化(如优化函数、评价指标等)都需要人为指定,不仅提高了对使用人员编程能力的要求,而且难以最大限度地发挥硬件资源优势,如没有动态调度机制,很多AI任务会被阻塞,直到GPU资源满足要求为止,降低了整体的执行效率。

第三,AI依赖于高质量的训练数据。传统的数据治理工作非常繁杂,需要大量人的参与,并消耗了大部分的资源和时间。首先,大规模机器学习算法需要大量的数据进行训练,一方面,来自真实场景的原始数据大多不能直接使用,存在大量的缺失值、错误值和异常样本等;另一方面,一个训练集可能有多个数据源,数据源融合存在格式不一致、冗余信息多、连接开销大等问题。

通过结合数据管理技术,我们可以有效地解决以上3个难题:其一,声明式语言(类SQL)可以降低AI使用门槛;其二,数据库优化技术(如索引、计划选择、视图缓存等)可以提升训练速度,降低资源使用率;其三,数据治理技术可以提升数据质量和AI训练质量。因此,面向AI的数据库技术得到了广泛关注。

但是目前,数据库系统支持AI操作存在数据模型不一致的问题。数据库中的数据大多是关系型数据,而AI操作存在大量张量型数据。这导致在用数据库管理AI时存在大量的数据存储开销,如存在格式转换、数据丢失等问题;而且会降低执行效率,如在用机器学习做图片分类问题时,图片都是张量格式,而在进行类别判断(如“删掉标签‘狗’”等)时,需要进行一些标量计算,导致执行引擎需要在不同的数据模型上分别操作,增加了执行开销。所以,未来我们需要研究用统一的数据模型同时支持标量、向量、大规模张量等不同类型的数据操作,更好地支持AI计算和数据库查询。但是现有的数据模型(如关系表、键值对、时间序列等)都有着各自的局限性,所以Idreos等人提出了一种学习型数据结构设计引擎Data Alchemist。它混合不同粒度的数据结构的设计原则,构成一般化的设计空间。通过在设计空间中对不同的组合、调优和性能进行分析,自动生成合适的数据结构。

尽管已有工作利用声明性的语言模型支持AI算法,但在优化器生成实际AI操作阶段仍存在很多问题。一种方法是直接把类SQL程序转化成Python、R等语言执行(如SQLFlow、Rheem等),不仅增加了语言转化开销,也没有对算法流程进行优化。而另一种方法是预先针对AI算法定义了新的算子(如MADlib等) ,借助代码生成器将类SQL语句翻译成AI算子序列,但是不同于传统数据库查询生成执行计划,没有对算子类型选择以及算子之间的连接关系进行有效的优化。因此,未来我们将研究面向AI的优化器:首先,统计AI执行相关的物理信息(如芯片频率、磁盘读写速度等),建立AI算子的代价估计机制。其次,设计针对AI的执行计划选择机制。因为不同于数据库查询,除了数据建立的联系外,AI算子之间还存在环境、计算等依赖关系,或没有显式关系(泛化为“执行森林”)。所以计划选择算法(如泛化的动态规划、强化学习算法等)需要基于代价估计的结果,智能地选择合适的运行环境、算子类型、组织逻辑等,在算法的优化程度和选择效率之间实现平衡。

分布式机器学习包括多节点的机器学习算法和系统,用于提升执行性能、提高计算精度、扩展到更大的输入数据(帮助显著减少学习的错误率),因此,已被广泛应用在真实生产环境中,帮助公司、研究人员和个人从大量数据中得出有意义的结论。然而,分布式机器学习仍然面临着很多亟待解决的问题,如它不支持弹性调度。比如一个有N个GPU的集群上在运行一个作业,使用了一个GPU。此时,一个新提交的作业要求使用N个GPU,因为空闲GPU个数是N-1,所以这个新的作业不能开始执行,而是得一直等数小时甚至数天,直到前一个作业结束、释放那个被占用的GPU。在如此长的时间里,集群利用率<1/N,导致集群利用率很低。所以,我们可以结合数据库系统,提供多方面的系统性能上的优化。