人工智能已经进入到了提升、堆积算力的时代,除了硬件厂商在芯片设计、晶体管数量、3D等封装技术等方面不断改进外,似乎软件算法的改进进入到了瓶颈阶段,不过,在系统架构方面,一直存在着并行计算。特别是在用于机器学习、深度学习等方面的模型训练,GPU上的分布式训练对人工智能的算力提升有着很大的帮助。
为什么以及如何使用多个 GPU 进行分布式训练
大规模训练 AI 模型的数据科学家或机器学习爱好者将不可避免地达到上限。当数据集大小增加时,处理时间可能会从几分钟增加到几小时到几天到几周!数据科学家转向包含多个 GPU 以及机器学习模型的分布式训练,以在很短的时间内加速和开发完整的 AI 模型。我们将讨论 GPU 与 CPU 对机器学习的用处,为什么使用多个 GPU 进行分布式训练最适合大型数据集,以及如何开始使用最佳实践训练机器学习模型。
为什么 GPU 适合训练神经网络?
训练阶段是构建神经网络或机器学习模型中资源最密集的部分。神经网络在训练阶段需要数据输入。该模型基于数据集之间所做的更改,基于层中处理的数据输出相关预测。第一轮输入数据本质上形成了机器学习模型理解的基线;随后的数据集计算权重和参数 以训练机器预测精度。
对于简单或少量的数据集,等待几分钟是可行的。然而,随着输入数据量的增加,训练时间可能会达到数小时、数天甚至更长。
CPU 难以处理大量数据,例如对数十万个浮点数的重复计算。而深度神经网络由矩阵乘法和向量加法等操作组成。
提高此过程速度的一种方法是使用多个 GPU 切换成分布式训练。基于分配给训练阶段的张量核心的数量,用于分布式训练的 GPU 可以比 CPU 更快地处理。
GPU 或图形处理单元最初设计用于处理重复计算,为视频游戏的图形推断和定位数十万个三角形。再加上大内存带宽和执行数百万次计算的先天能力,GPU 非常适合通过数百个 epoch(或模型迭代)进行神经网络训练所需的快速数据流,非常适合深度学习训练。
有关 GPU 如何更好地用于机器和深度学习模型的更多详细信息,请关注我们或者联系作者(微信同名)。
什么是机器学习中的分布式训练?
分布式训练承担训练阶段的工作量并将其分布在多个处理器上。这些微型处理器协同工作以加快训练过程,而不会降低机器学习模型的质量。由于数据被并行划分和分析,每个微型处理器在不同批次的训练数据上训练机器学习模型的副本。
结果在处理器之间进行通信(当批次完全完成时或每个处理器完成其批次时)。下一次迭代或 epoch 再次从一个稍微新训练的模型开始,直到它达到预期的结果。
在微型处理器(可能是 GPU)之间分配训练有两种最常见的方式:数据并行和模型并行。
数据并行
数据并行是数据的划分并将其分配给每个 GPU 以使用相同的 AI 模型进行评估。一旦所有 GPU 完成前向传递,它们就会输出梯度或模型的学习参数。由于有多个梯度只有 1 个 AI 模型要训练,所以梯度被编译、平均、减少到一个值,最终更新模型参数,用于下一个 epoch 的训练。这可以同步或异步完成。
同步数据并行是 GPU 分组必须等到所有其他 GPU 完成梯度计算,然后再进行平均,并减少它们以更新模型参数。一旦更新了参数,模型就可以继续下一个 epoch。
异步数据并行是 GPU 独立训练而无需执行同步梯度计算的地方。相反,梯度在完成时会传回参数服务器。每个 GPU 不等待另一个 GPU 完成计算,也不计算梯度平均,因此是异步的。异步数据并行需要一个单独的参数服务器用于模型的学习部分,因此成本更高。
在每一步之后计算梯度并对训练数据进行平均是最耗费计算的。由于它们是重复计算,因此 GPU 一直是加速此步骤以达到更快结果的选择。数据并行性相当简单且经济高效,但是有时模型太大而无法容纳在单个微型处理器上。
模型并行
与拆分数据相比,模型并行性在工作 GPU 之间拆分模型(或训练模型的工作负载)。分割模型将特定任务分配给单个工作单元或多个工作单元以优化 GPU 使用。模型并行可以被认为是一条人工智能装配线,它创建了一个多层网络,可以处理数据并行不可行的大型数据集。模型并行性需要专家来确定如何对模型进行分区,但会带来更好的使用和效率。
多 GPU 分布式训练更快吗?
购买多个 GPU 可能是一项昂贵的投资,但比其他选择要快得多。CPU 也很昂贵,不能像 GPU 那样扩展。跨多个层和多个 GPU 训练机器学习模型以进行分布式训练可提高训练阶段的生产力和效率。
当然,这意味着减少训练模型所花费的时间,但它也使您能够更快地产生(和重现)结果并在任何事情失控之前解决问题。在为您的努力产生结果方面,它是训练数周与数小时或数分钟训练之间的差异(取决于使用的 GPU 数量)。
您需要解决的下一个问题是如何开始在机器学习模型中使用多个 GPU 进行分布式训练
如何使用多个 GPU 进行训练?
如果想使用多个 GPU 处理分布式训练,首先要确定是否需要使用数据并行性或模型并行性。该决定将基于数据集的大小和范围。
能否让每个 GPU 使用数据集运行整个模型?或者在具有更大数据集的多个 GPU 上运行模型的不同部分是否会更省时?
通常,数据并行是分布式学习的标准选项。在深入研究需要单独的专用参数服务器的模型并行或异步数据并行之前,先从同步数据并行开始。
我们可以开始在分布式训练过程中将 GPU 链接在一起。根据并行决策分解数据。例如,可以使用当前数据批次(全局批次)并将其划分为八个子批次(本地批次)。如果全局批次有 512 个样本并且您有 8 个 GPU,则 8 个本地批次中的每一个都将包含 64 个样本。
八个 GPU 或迷你处理器中的每一个都独立运行本地批处理:前向传递、后向传递、输出权重梯度等。
局部梯度的权重修改在所有八个微型处理器中有效混合,因此一切都保持同步,并且模型已经适当训练(当使用同步数据并行时)。
重要的是要记住,一个用于分布式训练的 GPU 需要在训练阶段托管收集的数据和其他 GPU 的结果。如果不密切注意,可能会遇到一个 GPU 内存不足的问题。
除此之外,在考虑使用多个 GPU 进行分布式训练时,收益远远超过成本!最后,当你为模型选择正确的数据并行化时,每个 GPU 都会减少在训练阶段花费的时间、提高模型效率并产生更高端的结果。
分布式训练的价值
神经网络是高度复杂的技术,仅训练阶段就可能令人生畏。通过利用和了解更多关于如何利用额外的硬件在更短的时间内创建更有效的模型,数据科学可以改变我们的世界!如果可以在数周和数月而不是数月和数年的时间内创建更有效的神经网络时,用于分布式训练的 GPU 非常值得初始投资。