《解密并行和分布式深度学习:深度并发分析》摘要记录

2022-09-02 23:58:32 浏览数 (1)

这篇论文讲解基础知识点还是蛮全的。 篇幅很长,过第一遍记录,看的也不是很仔细。

推荐论文:https://arxiv.org/abs/1802.09941

  • 为了最小化的目的,一个样本损失函数ℓ应该是连续和可微的。
  • 回归问题中,可以使用直接的损失函数,如平方差。
  • 分类问题中,损失的简单定义如:ℓ(w, z) = 0 if fw(z)=h(z) else 1 (也称为二进制或0-1损失),不符合连续性和可微性准则。为了解决这一问题,突出的多类分类问题将Y定义为推断出的class类型的概率分布,而不是单个标签,模型输出通常使用softmax函数()来归一化为某种分布。损失函数然后计算预测与真实标签“分布”的差异,例如,使用交叉熵。
  • 交叉熵损失可以看作是逻辑回归的一种推广,为多类分类引出了一个连续的损失函数。
  • 机器学习中的优化主要是通过梯度下降进行的。然而,由于从未观察到完整的概率分布D,因此有必要获得梯度的无偏估计。可以在每次迭代中使用随机采样的数据进行下降,应用随机梯度下降(SGD)
  • SGD算法的权重初始化可能反映结果的最终质量。初始权值的选择可以来自随机值、知情决策(如Xavier初始化),或来自迁移学习方法中预先训练的权值。初始化不当可能会随着网络深度的增加而对泛化产生不利影响。
  • 权值更新规则:
    • Momentum,使用当前和过去权重的差值来避免局部极小值和 natural motion的冗余步骤。
    • RMSProp和Adam,使用梯度的第一和第二矩来适应每权重的学习率,比其他方法增强稀疏更新。
  • 为了获得最佳结果,超参数必须进行调优,这可以通过value sweeps或meta-optimization来执行。
  • 在实践中,minibatch采样是通过对数据集S进行shuffling实现的,并通过从中获得大小为B的连续片段来处理这种排列。
  • 对数据集的整个遍历称为epoch,一个完整的训练过程通常由几十到数百个epoch组成
  • 无监督学习:数据集S没有标记,训练通常会产生不同的目标函数,旨在从未标记的数据推断结构。有两种有用的实现:自动编码器生成对抗网络(GANs):
    • Auto-encoders:可以被构造成一个接收样本x作为输入,并输出一个尽可能接近x的值的神经网络。
    • GANs:利用深度神经网络通过同时训练两个网络来生成真实的数据(通常是图像)。训练第一个(discriminator)网络来区分"真实"数据集样本和"虚假"生成的样本,而训练第二个(generator)网络来生成尽可能与真实数据集相似的样本。
  • 强化学习:在给定的时间点观察环境的任务,训练优化动作策略函数,使观察者的奖励最大化。训练算法有Deep Q learning和A3C。
  • 并行计算体系结构:
    • 单机(通常是共享内存)系统
    • 多机(通常是分布式内存)系统
  • 加速的主要技术是利用学习工作负载中的固有并行性
  • 互连网络最重要的指标是延迟、带宽消息速率
  • 在使用分布式内存的多台机器上,可以使用简单的通信机制,如TCP/IP或远程直接内存访问(RDMA)。在分布式内存机器上,还可以使用更方便的库,如消息传递接口(MPI)Apache Spark。MPI是一个专注于提供可移植性能的低级库,而Spark是一个更专注于程序员生产力的高级框架。
  • 深度学习具有与大规模HPC应用非常相似的特征。因此,从2016年开始,建立的MPI接口成为分布式深度学习中事实上的便携通信标准
  • 计算机上的每一次计算都可以建模为有向无环图(DAG)。DAG的顶点计算,而数据依赖(或数据流)。这种图的计算并行性可以用两个主要参数来表征:
    • 图的工作量W:对应于顶点的总数。
    • 图的深度D:是DAG中任意最长路径上的顶点数量。

在单个处理器上处理图所需的时间是T_1 = W,在无限多个进程上处理图所需的时间是。计算中的平均并行度是,在个处理器上的执行时间受限于:

  • 在深度学习中的大多数操作都可以建模为对张量的操作(通常张量作为并行编程模型)。这样的操作是高度数据并行的,只有求和才会引入依赖关系。
  • 探索不同的底层通信、消息调度拓扑映射策略,这些在HPC领域广为人知,可以显著加快分布式深度学习中的通信速度
  • 神经元的稀疏连接权值共享有利于减少参数的数量
  • RNN包含自连接,因此不能单独用反向传播进行训练。解决这个问题最流行的方法是应用时间反向传播(backpropagation through time, BPTT),它将循环层展开到一定的序列长度,对每个时间点使用相同的权值。这就创造了一个更大的前馈网络,可以用通常的方法进行训练。
  • 全连通层可以表示为权值和神经元值矩阵-矩阵乘法(每小批量样本列)并建模。为此,可以使用高效的线性代数库,如CUBLASMKL
  • 计算卷积的第二种方法是利用傅里叶域,在傅里叶域中,卷积被定义为逐元素的乘法。在该方法中,数据和核都使用FFT进行变换,相乘,然后对结果进行逆FFT。卷积核越大,FFT效果越好。
  • 网络结构的并行化。神经网络的高平均并行度(W/D)不仅可以有效地计算单个算子,而且可以针对不同的维度并发地评估整个网络:
  • 数据并行:在minibatch SGD中,数据以N个样本的增量进行处理。由于大多数操作符相对于N是独立的,因此并行化的一个简单方法是将小批处理样本的工作划分到多个计算资源(核心或设备)中。在这种分区方法中,所有的DNN参数必须对所有参与的设备都是可访问的,这意味着它们应该被复制。然而,阻碍数据并行性扩展的一个瓶颈是BN操作符,它在调用时需要一个完整的同步点。目前可以利用高性能通信接口(如MPI)来实现细粒度的并行特性,例如通过异步执行和流水线减少延迟稀疏通信,以及利用给定计算资源内的并行性
  • 模型并行(网络并行):根据每一层的神经元(即四维张量中的C、H或W维)来划分工作。在这种情况下,采样的minibatch被复制到所有处理器,并且DNN的不同部分在不同的处理器上计算,这可以节省内存(因为整个网络不是存储在一个地方),但在每一层之后都会产生额外的通信
  • 流水线Pipelining:在深度学习中,流水线既可以指重叠计算,即在一层和下一层之间(当数据准备好时);或根据深度划分DNN,将层分配给特定的处理器。流水线可以看作是数据并行的一种形式,因为元素(样本)是通过网络并行处理的,但也可以看作模型并行,因为流水线的长度是由DNN结构决定的。
    • 第一种形式的管道可用于重叠前向计算、反向传播和权值更新。该方案在实践中得到了广泛应用,通过减少处理器空闲时间来提高利用率。在更细的粒度中,神经网络架构可以围绕重叠层计算的原则设计,深度堆叠网络(Deep Stacking Networks, DSN)就是这样。在DSN中,每一步都计算一个不同的完全连接的数据层。然而,前面所有步骤的结果都被连接到层输入。由于放松的数据依赖关系,这使得每一层都可以部分并行计算。
    • 优势:(a)在正向求值和反向传播过程中,不需要将所有参数存储在所有处理器上(与模型并行性一样);(b)处理器之间(在层边界)有固定数量的通信点,源处理器和目标处理器总是已知的。此外,由于处理器总是计算相同的层,权重可以保持缓存,以减少内存往返。缺点:为了充分利用系统,数据(样本)必须以特定的速率到达,并且延迟与产生的处理器数量成正比。
  • 混合并行:多种并行方案的组合可以克服每种方案的缺点。一个成功的混合方案的例子将数据并行性应用于卷积层模型并行性应用于全连接部分。使用这种混合方法,可以在一个8个以上的gpu上实现高达6.25×的加速,精度损失小于1%(由于小批量大小的增加)。DistBelief分布式深度学习系统结合了三种并行策略。在实现中,对多个模型副本同时进行训练,其中每个副本对不同的样本进行训练(数据并行性)。在每个副本, DNN既按同一层神经元分布(模型并行性),又按不同层分布(流水线)Project Adam扩展了DistBelief的思想,并展示了相同类型的并行性。然而,在Project Adam中,流水线被限制在同一个节点的不同CPU核上。
  • 训练的并行化。在分布式环境中,可能有多个独立运行的SGD实例(训练代理),因此必须对整个算法进行调整。深度学习的分布方案可以分为:模型一致性、参数分布和训练分布
  • 模型一致性:将每个人都能观察到的最新w的训练算法表示为一致的模型方法(图20a和图20b)。直接在节点之间划分计算创建了一种分布式形式的数据并行性,其中所有节点必须在获取新的小批处理之前将它们的更新传递给其他节点。最近的研究放宽了同步限制,产生了一个不一致的模型(图20c)。为了在异步的情况下提供正确性保证,SSP提出了一致和不一致模型之间的折衷。在SSP中(图20d),在某个节点可能达到最大的陈旧状态后,执行全局同步步骤强制限制梯度陈旧状态。这种方法在异构环境中尤其有效,在这种环境中滞后代理(掉线者)受到了控制。
  • 集中式:为DNN训练设计集中式分布式网络架构取决于多种因素,包括网络拓扑、带宽、通信延迟、参数更新频率期望的容错能力。集中式网络体系结构通常包括一个参数服务器(PS)基础设施(例如图20a, 20c, 21),它可能由一个或多个专门节点组成;而分布式架构(图20b, 20d)将依赖于allreduce在节点之间通信参数更新。通信结束后,集中式参数更新由PS执行,分布式更新由各节点单独计算。在后一种情况下,每个节点都创建自己的优化器。
  • 参数和梯度压缩:在分布式深度学习中,通常有两种节省通信带宽的方法:一种是通过有效的数据表示方式来压缩参数,另一种是避免发送不必要的信息,从而导致稀疏数据结构的通信。前一类中的方法与网络基础设施正交,后一类中应用的方法在使用集中(PS)和分散拓扑实现时不同。
    • 量化梯度(或参数)压缩的一个重要数据表示是量化,即将连续的信息映射到表示值集(通常是范围)的buckets中。研究表明,参数和梯度值的分布分散得很窄(图22a),因此这些方法可以有效地表示工作范围,减少每个参数的比特数。量化通常是通过减少浮点动态范围来实现的。量化训练对于有损压缩(如降低精度)并不能“开箱即用”。相反,它依赖于以一种保持参数期望值(E)的方式舍入参数局部梯度积累是有损量化SGD算法收敛的关键。特别是在分布式环境中,更新是不一致的,重要的是将量化误差带到下一个梯度,积累误差以避免漂移
  • 稀疏化。dnn(特别是cnn)在参数更新过程中表现出稀疏的梯度。这主要是因为大量的参数并不一定会立刻改变;以及算子如卷积,其中的优化过程可以提高某些卷积核的精度。梯度稀疏化的第一个应用使用静态阈值修剪梯度值,低于该阈值的元素不应发送。为了弥补稀疏化导致的精度损失,一些研究建议通过改变DNN结构来约束梯度值,添加各种归一化算子;而其他人则提出了局部梯度裁剪热身训练。在集中式设置中,分布稀疏梯度很简单——稀疏消息在训练代理和PS之间发送。然而,在分布式设置中实现必要的allreduce就不那么简单了,因为每个代理在其梯度中可能贡献不同的非零指数(维度)。Kylix用个步骤实现了稀疏的allreduce,首先交换索引,然后交换数据。虽然这对于每个节点的稀疏模式不改变的系统是可取的,但在深度学习中,梯度指数随着每次迭代的不同而不同。
  • 模型整合
    • 集成学习与知识蒸馏。一种广泛使用的训练后巩固技术集成学习。在集合中,w的多个实例在同一个数据集上分别训练,整体预测是集合成员预测的平均值。在深度学习时代之前,集成学习作为一种增强的形式在机器学习中得到了广泛的应用,通常可以提高单一模型的整体精度。TreeNets(章节6.2)等研究将集成学习与自定义(集成感知)损失函数相结合,以促进集成成员之间的多样性。考虑到集成消耗m倍的内存和计算能力,另一种训练后模型整合技术是使用知识蒸馏减少DNN的大小。在该方案中,训练分为两步进行:第一步,正常训练一个大型网络或集合;第二步训练单个神经网络来模拟大集合的输出。结果表明,第二个网络在集成上比在标记数据集上更容易训练,其错误率与10个dnn的集成相同。
    • 模型平均。另一种整合模型的技术是模型平均。这些方法可以在不同的机器上单独运行m个SGD实例,只聚合一次(训练后)或每隔几次迭代。为了克服由于不频繁平均而导致的精度下降,更复杂的固结方法包括弹性平均SGD(EASGD)和自然梯度下降。
  • 优化算法与体系结构搜索: 由于深度学习中的训练是一个非线性优化问题,其他表现出并发性的算法可以替代SGD。此外,它可能使用多余的计算能力来执行元优化,搜索更好的超参数DNN架构
    • 参数搜索。监督学习既可以被视为一次使用一个或一小批样本的随机优化过程,也可以被表示为一个批优化问题,其中整个数据集需要获得梯度下降。由于高维性,批处理方法在内存、通信计算方面的二次增长是不可取的。为了克服这些问题,L-BFGS的随机变量被提出,它估计逆Hessian矩阵,并被证明在强凸、lipschitz -连续环境中以线性速度收敛。应用于深度学习的其他优化算法试图:(a)减少随机抽样产生的SGD方差,(b)使用乘子交替方向法(ADMM)来完全跳过反向传播,(c)使用Neumann系列展开来近似Hessian矩阵,缩放到大的小批量大小(32k),没有精度损失或大量的计算开销。无梯度进化算法也被用于深度学习,其中包括遗传算法,神经进化,粒子群优化。除了重组/进化步骤,训练行为类似于集成学习,因此这些算法比传统的梯度下降更适合并行性。这种算法的梯度无关性质使它们能够用于超参数和DNN架构的元优化。
    • 超参数搜索。SGD中大量的超参数及其对结果精度的不利影响阻碍了对机器学习新技术的研究。直到最近,超参数搜索的主要方法是执行参数扫描(即在可行范围内的网格搜索)。研究表明,在分布式环境中,在训练过程中控制同步SGD节点组的大小可以提高精度性能元启发式优化算法可以将超参数调整与训练相结合,因此被用于dnn。这些方法包括基于粒子群优化的深度学;以及CoDeepNEAT,它是对NEAT算法的修改,可以同时搜索超参数和架构配置。由于有大量的独立计算,这种方法几乎是线性扩展的。基于种群的训练(population based Training, PBT)使用一种强化学习方法来“探索”和“利用”超参数空间。
    • 体系结构的搜索。手工制作DNN架构自然会受到人类智力和创造力的限制。这一限制促进了最近自动神经结构搜索研究的兴起。体系结构搜索可以分为三种方法:基于顺序模型的优化(SMBO)强化学习(RL)进化算法(EA)
  • 基于smbo的搜索方法依赖于优化架构候选,定义要探索的有限状态集(例如,搜索树的子节点),并遍历这些集合。因此,并发性取决于给定时间内搜索空间中的点的数量。许多最近的DNN架构表现出自相似性重复的子单元(模块)。如图24b所示,这种观察结果可以大大减少探索的架构的数量,由模块和基本块(例如卷积)分层组成网络。
  • 基于rl的架构搜索使用结果网络的准确性作为奖励函数,而对DNN或其超参数的修改动作
  • 进化算法(EA)对于架构搜索是有利的,因为任何函数(不一定是可微分的)都可以使用这些方法进行优化。遗传cnn采用遗传算法(GAs),将DNN连接编码为二进制基因(如图24c所示),并以最终精度作为适应度函数,以每一个时间步训练DNN种群。GAs对并行性具有很高的适应性,并已成功用于非常大规模的训练,其中18000个节点在Titan超级计算机上使用24小时,以获得最先进的分割和重建问题的精度。
  • 大规模进化也使用GAs,但定义了一组可应用的特定突变(例如,插入卷积,改变步幅)。大规模进化在准确性可扩展性方面优于一些现有的基于rl的方法,因为遗传算法可以并行运行整个种群(其精度随着预期的种群规模而增加)。但在一般情况下,遗传算法需要在时间步之间进行同步约简通信,以选择最优候选算法。为了克服这个问题,采用了竞赛选择,它只对种群成员进行两两比较。
  • 其他的GA架构搜索方法包括对dnn的多级分层表示(图24b),通过专门的变异实现异步分布式竞赛选择(集中式、基于队列的实现)。正则化进化(AmoebaNets)通过每次迭代从种群中移除最古老的样本(类似于自然界中的死亡),进一步扩展了遗传算法的竞赛选择,从而规范化了优化过程。
  • 并行和分布式深度学习未来的潜在研究方向:
    • 随着研究的进展,DNN架构正变得越来越深入,在连续和非连续层之间(“跳过连接”)更加互联。除了准确性,大量的工作致力于减少内存占用操作数量,以便成功地在移动设备上运行推断。这也意味着训练后的DNN压缩可能会得到进一步的研究,训练可压缩网络将是可取的。由于移动硬件的内存容量有限,且必须具有能源效率,因此经常有人提出专门的DNN计算硬件。我们在NVIDIA张量核心、张量处理单元、其他专用集成电路和fpga,甚至神经形态计算中看到了这一趋势。
    • 处理DNN稀疏性(例如,压缩后)是一些专用集成电路的一个重点,而循环网络注意力学习方面的进展表明,训练和推理硬件也需要在可变长度输入下有效工作。
    • 目前,计算单个算子是高度优化的,因此目前的研究方向是层间整个dnn优化。TensorFlow XLA, Tensor comprehension, Latte和TM一次性编译整个神经网络图,执行各种转换(如融合)来优化执行时间,比手动调优的单个操作实现了4倍的加速。我们希望在这个方向上继续研究,直到DNN的评估在操作共享内存优化方面接近最优。
    • 应用于分布式深度学习的技术正在趋同到可以设计标准编程接口(或框架)的地步。在未来,生态系统如Ease。Ml可以使训练方案的定义(例如,关于集中化和梯度一致性)更容易,隐藏了大多数底层基础设施设置。结合对云系统和弹性训练的日益增长的支持(节点可以随意旋转和移除)与进化算法的最新发展,我们可能会看到自适应和财务上可行的优化方法崛起。
    • 最后,深度学习被用于解决越来越复杂的问题,如路由算法分层任务组合人工通用智能的研究目前集中在多用途网络,这为模型并行不同的训练算法创造了新的、未探索的机会。寻找充分的多用途网络可能超出了人类团队的创造力,随着元优化(特别是架构搜索)和渐进式训练的可用性和质量的增加,参数扫描手动DNN架构工程将会过时。支持这一说法的事实是,目前最先进的计算机视觉CNN(CIFAR-10和ImageNet数据集)是自动架构搜索的结果。利用并行性是实现这些突破和其他突破的必要条件,这将与深度学习领域的进步携手并进。

0 人点赞