分布式和人工智能

2016 年 3 月,Google AlphaGo 与围棋世界冠军李世石进行围棋人机大战,以 4 比 1 的总分获胜。至此,人工智能技术被推向了高潮。现在,人工智能已经广泛渗入到了我们的生活中,比如手机拍照美化、人脸识别、平安城市、自然语言处理、语音识别等。顾名思义,人工智能就是机器模拟人的思维,像人那样智能呗。目前,对人工智能的定义大多可划分为四类,即机器“像人一样思考”“像人一样行动”“理性地思考”和“理性地行动”。这里的行动,指的是采取行动或制定行动的决策。

那人工智能是如何让机器像人那样智能呢?人并不是天生就会解决问题的,我们经常会听到一句经典的话“见多识广”,人遇到新的问题,是通过学习新知识,然后结合自己的经验去解决问题的。比如,人并不是生来就认识香蕉,而是通过后天的学习(包括学习香蕉的形状、颜色、口味等)来获取识别香蕉的经验,当下次再看到香蕉时,就知道这是香蕉了。

人工智能要模拟人的智能也类似,需要通过大量的数据进行学习和分析获得规律(即建立一个模型),然后利用该规律或模型对未知数据进行预测,以判断是否与建模数据具有相同特征。

从人工智能的定义可以看出,数据、模型(也叫作算法)、算力是人工智能的三大核心。可以说,在一定程度上数据决定了机器学习的上限,而模型为逼近这个上限提供方法,因此数据处理和模型训练是人工智能的关键技术,算力决定了数据处理和模型训练的实用性能,而分布式技术就是解决算力的不二妙招。接下来,我就对数据处理和模型训练进行具体分析,来帮助你了解人工智能中需要用到哪些分布式技术来解决算力问题。

数据处理

数据处理又称数据预处理,是指通过数据统计、数据集成、数据清理、数据规约、数据变换等方法,对数据缺失、数据噪声、数据冗余、多数据源等问题进行处理以得到高质量数据,为模型训练提供高质量输入,是人工智能不可缺少的环节。

其实,数据处理类似于我们的知识整理过程。一个精心打造的、体系化梳理过的专栏文章,可以帮助我们在学习一门课程时,少走弯路、避免踩雷、达到事半功倍的效果。同样地,一个精心处理过的数据集,对于人工智能的模型训练也能起到事半功倍的效果,一方面可以缩短机器学习的周期,另一方面也可以提高机器学习的质量。

数据统计(Data Statistics)。数据统计是数据预处理的第一步,其范围、规模、方式等会直接影响数据分析的结果。常见的统计特征有最大值、最小值、均值、中位数、方差、标准差等。

数据集成(Data Integration)。数据的收集有多种途径,比如文件数据、数据库数据、问卷数据等,而不同的数据源,其数据的存储方式、命名规则、单位等不尽相同,所以我们需要数据集成来将多个数据源的数据整合到一起,以保证数据结构、属性的一致性,并去除冗余数据,方便后续分析。

数据清理(Data Cleaning)。由于用户忘记或设备损坏,经常会造成部分数据缺失;由于仪器故障或用户填写错误,经常会出现数据错误(噪声数据)等。如果不对这些数据做任何处理,后面的模型训练过程将产生严重偏差。数据清理过程就是用来解决这个问题的,它可以通过平均值或众数等来填充丢失值或修改这些噪声值。

数据规约(Data Reduction)。由于机器学习中的数据量很大,因此会导致很多重复的特征,或者很多不重要的特征(比如 ID 号等)。数据规约的目的就是去除重复特征及不重要的特征,从而减少数据的维度或者数据量,降低问题复杂度,同时不影响后面训练的结果。数据规约的方法有主成分分析法 (Principal Component Analysis,PCA)、小波变换 (Wavelet Transform,WT) 等。

数据变换(Data Conversion)。数据经过集成、清理与规约等步骤后,要将数据进行标准化、离散化、分层化,使得数据更加一致、更加容易被模型处理。数据变换方法主要有数据标准化、数据离散化和数据泛化三类。

可以看出,数据预处理虽然很复杂,但可以拆分成多个步骤进行。对于小样本数据处理时,单台机器的处理能力就足够了,所以采用单台机器进行处理即可。但是对于大规模数据来说,单台机器的处理能力已成为瓶颈,此时,不得不需要分布式数据处理了。

目前,业界已经有很多大数据处理软件,比如分布式计算框架 MapReduce、Spark,分布式存储框架 HDFS、HBASE 等,来进行分布式数据处理。

分布式模型训练

模型训练就是从已知数据中找到规律。具体来说就是,不断通过已有数据进行验证增强,最终给出最适合的模型参数,以此来预测给定的未知数据。

比如有一堆橘子和西瓜,可以通过模型训练得到:大的、绿色的判定为西瓜,小的、黄色的判定为橘子。那么当给出一个未知数据时,我们通过它的大小及颜色信息就可以判断该水果是橘子还是西瓜。这就是模型训练。其中,大小和颜色属于预测的两个特征,而它们的具体数值 (比如,大于 10 厘米等,颜色 RGB 的数值范围)就是模型参数。

随着大数据时代的到来,人工智能技术逐渐向大规模训练数据、大模型训练等方向发展。比如,百度的 Deep Speech 2 系统使用了 11940 小时的语音数据以及超过 200 万句表述来训练英语的语音识别模型;2011 年谷歌训练出拥有十亿个参数的超大神经网络模型。很明显,单台计算机的存储能力、计算能力已经不能满足了,因此分布式模型训练诞生了。

研究表明,在一台具有一个现代 GPU 的单台机器上完成一次基于 ImageNet 数据集的训练要耗费多达一周的时间。这还仅仅只是一次训练迭代的时间,如果是比较严格的生产级业务,至少需要数十次迭代,训练累计时间将会达到数十周。试想一下,如果一个业务仅仅是模型训练就花费数十周,那么等到真正上线,恐怕最佳时间窗口也已经过去了。

在多台机器上的分布式训练无疑能极大减少训练时间,近期的一项研究通过分布式技术,使用一个包含 2048 个 GPU 的集群将 ImageNet 的训练时间降低到了 4 分钟。TensorFlow 是由 Google 首创且在业内非常流行的开源机器学习框架,它的分布式版本利用了 GPU 加速服务器的虚拟化集群,将深度学习的训练时间从数周缩短到数小时。

总结来讲,分布式训练可以大大提升训练效率,大幅缩短训练时间,从而缩短业务面市周期,所以各大公司都在研究分布式训练,比如华为、IBM、阿里巴巴等。分布式模型训练是利用分布式集群,将多个计算机的存储能力、计算能力等进行统一管理和调度,从而实现模型训练。分布式模型训练的前提是有一个分布式集群,因此一个高效、可靠的分布式集群是基础。而这个分布式集群的架构、选主、调度、可靠性等关键技术,便奠定了分布式模型训练的基础。

数据分布式训练

数据分布式训练主要是针对大规模训练数据的场景。如下图所示,数据分布式训练是在每个节点(假设,一台服务器代表一个节点)上都存储或运行一个完整的模型训练程序的基础上,将大规模数据进行划分,然后将划分后的数据子集分配到多个节点上,每个节点根据自己接收到的数据进行训练。

https://static001.geekbang.org/resource/image/8c/c2/8c3197afef4ca27cc155df39fcf64dc2.jpg

每个节点会根据自己拥有的数据子集训练出一个子模型,并按照一定的规则与其他节点通信,比如交互子模型参数或参数更新等信息,以保证最终可以有效整合来自各个节点的训练结果以得到全局的机器学习模型。比如,每个节点训练一个子模型得到自己的参数,最终的模型为多个节点的参数取平均值;可以看出,数据分布式有如下两个重要信息:

 数据需拆分存储到不同的节点进行训练,因此涉及了数据的拆分方法、数据的分布式存储和管理,其中数据拆分方法主要有两类,对训练样本进行划分和对每个样本的维度进行划分,这是非常基础的方法。目前,市面上大部分的书籍均有介绍,如果你感兴趣的话可以自行学习。

 节点之间需要通信交互信息。分布式通信是实现任何分布式技术的底座,没有分布式通信技术,分布式模型训练犹如纸上谈兵。

 备注:数据的分布式存储和管理,是数据分布式的基础,我会在“第五站:分布式数据存储”中与你详细讲述;而关于分布式通信的相关技术,我会在“第四站:分布式通信技术”与你介绍。

模型分布式训练

了解了数据分布式训练,我们再来看一下模型分布式训练。它针对的主要是大模型训练场景,在分布式领域中也被称为任务并行或任务分布式。

如下图所示,模型分布式训练是指将大模型进行拆分,然后将拆分后的子模型分配到不同的节点上进行训练。与数据分布式训练不同的是,首先每个节点上只存储和运行部分模型训练程序,而不是完整的模型训练程序;其次,各个子模型之间存在较强的依赖关系,比如节点 1 的输出是节点 2 和节点 3 子模型的输入,因此节点之间需要进行中间计算结果的通信。

https://static001.geekbang.org/resource/image/89/e4/89efd0455d8397a1331f546686ba35e4.jpg

可以看出,模型分布式训练包含如下两个关键信息:

 大模型拆分为多个小模型,其本质是将大任务拆分为多个子任务,这其实就是分而治之策略。而子任务之间的拆分,需要运用包括流水线、MapReduce 等在内的多种分布式计算模式。

 不同节点上的子任务之间,需要通过通信交互中间计算结果,涉及分布式通信技术。

 备注:任务拆分和流水线等分布式计算模式是模型分布式训练不可缺少的技术,我会在“第三站:分布式计算技术”与你详细介绍;而关于分布式通信的相关技术,你可以移步“第四站:分布式通信技术”中进行了解。

混合模型训练

混合模型训练,主要是针对大规模训练数据和大模型训练共存的场景。

所谓混合模型训练,就是将数据分布式训练和模型分布式训练结合起来。如下图所示,假设有一个多 GPU 集群系统,首先对模型进行拆分,将子模型分配到单节点上不同的 GPU,然后对数据进行划分,每个节点负责训练一部分数据,最后进行模型参数同步得到全局参数和全局模型。

https://static001.geekbang.org/resource/image/f9/ef/f96f4bc09fd9f95ddf9610b21d94e2ef.jpg

从混合模型训练的流程可以看出: 单节点或多节点实现模型并行或模型分布式训练,涉及模型拆分、并行与分布式计算模式等; 多节点之间实现了数据分布式训练,涉及数据的拆分方法和数据的分布式存储和管理等技术; 单节点之间的模型分布式训练,需要单节点上多进程之间通信;多节点之间的分布式训练需要跨节点跨进程通信。

https://static001.geekbang.org/resource/image/25/b0/25129d2a84f6d1db59038a3c587550b0.jpg

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐