数据与模型并行

author author     2023-05-12     464

关键词:

参考技术A

利用计算机集群,使机器学习算法更好地从大数据中训练出性能优良的大模型是分布式机器学习的目标。为了实现这个目标,一般需要根据硬件资源与数据/模型规模的匹配情况,考虑到计算任务、训练数据和模型进行划分,分布式存储、分布式训练。
分布式机器学习可以分为计算并行模式、数据并行模式和模型并行模式。

假设系统中的工作节点拥有共享内存(比如单机多线程环境),可以存储下数据和模型,并且每个工作节点对数据有完全地访问权限,对数据有读写权限。那么,在此类系统中实现分布式机器学习算法,对数据和模型不需要特殊处理,只需要把注意力集中在如何并行的执行相应的优化算法上。我们称这种并行模式为计算并行模式。
公式详见书中P119

数据样本划分和数据维度划分是两种常见的数据划分方法。其中,对于样本划分方法,又有随机采样和(全局/局部)置乱切分等方法。总体来说,进行数据划分时要考虑以下两个因素。
一是数据量和数据维度与本地内存的相对大小,以此判断数据按照样本划分和维度划分后能否合适地存储到本地内存
二是优化方法的特点。通常,样本划分更适合于随机抽取样本的优化方法(比如随机梯度下降法),维度划分更适用于随机抽取维度的优化方法(比如随机坐标下降法)。

那么为什么数据划分是合理的?因为在于机器学习中的目标函数,也就是训练数据集的经验风险函数,关于样本是可分的。因为经验风险函数是所有训练样本对应的损失函数取值的总和,所以如果将训练样本划分成多个数据子集,计算各个子集上的局部梯度值,再将局部梯度函数,任然可以得到整个经验风险函数的梯度值。
置乱切分相比于随机采样有以下好处:

当划分到本地的训练数据被优化算法依照顺序使用完一遍之后,有两种对数据进行再处理的方法:再次进行全局置乱切分和仅对本地数据进行局部置乱。为引用方便,我们分别称其为:“全局置乱切分”和“局部置乱切分”。
· 带有置乱切分的随机梯度下降法相比带有随机采样的随机梯度下降法,收敛速率要慢一些,这是因为置乱切分后样本不在是独立的,影响了收敛速率。
· 带有局部置乱切分的随机梯度下降法的收敛速率比带有全局置乱切分的随机梯度下降法的收敛速率慢。原因在于,局部置乱切分中,数据第一次切分之后,将不再进行全局置乱,局部数据的差异性始终保持,相比全局置乱的情形对于数据独立同分布假设的违背更加严重。

如果机器学习任务中所涉及的模型规模很大,不能存储到工作节点的本地内存,就需要对模型进行划分,然后各个工作节点负责本地局部模型的参数更新。对具有变量可分性的线性模型和变量相关性很强的非线性模型(比如神经网络),模型并行的方式有所不同。

把模型和数据按维度均等均分,分配到不同的工作节点,在每个工作节点使用坐标下降法进行优化。
对于线性模型而言,目标函数针对各个变量是可分的,也就是说某个维度的参数更新/梯度只依赖一些与目标函数值有关的全局变量,而不依赖与其他维度的参数取值。于是,为了实现本地参数的更新,我们只需要对这些全局变量进行通信,不需要对其他节点的模型参数进行通信。这是可分性模型进行模型并行的基本原理

神经网络由于具有很强的非线性,参数之间的依赖关系比线性模型严重的很多,不能进行简单的划分,也无法使用类似线性模型那样的技巧通过一个全局中间变量实现高效的模型并行,但是事务总是有两面性,神经网络的层次化借故偶也为模型并行带来了一定的便利性,比如我们可以横向按层划分、纵向跨层划分和利用神经网络参数的冗余性进行随机划分。不同划分模式对应的通信内容和通信量是不相同的。
1.横向按层划分
如果神经网络很深,一个自然并且易于实现的模型并行方法就是整个神经网络横向划分为K个部分,每个工作节点承担一层或者几层的计算任务。如果计算所需要的信息本工作节点没有,则向相应的其他工作节点请求相关的信息。模型横向划分的时候,通常我们会结合各层的节点数目,尽可能使得各个工作节点的计算量平衡。

2.纵向跨层划分
神经网络除了深度还有宽度(而且通常情况下宽度会大于深度),因此除了上一小节介绍的横向按层划分外,自然地可以纵向跨层划分网络,也就是将每一层的隐含节点分配给不同的工作节点。工作节点存储并更新这些纵向子网络。在前向和后传过程中,如果需要子模型以外的激活函数和误差传播值,向对应的工作节点请求相关信息进行通信。

实验表明:1,模型随机并行的速度比纵向按层划分快,尤其对于复杂任务下的大模型更是如此;2.选取适当的骨架比列会使并行速度进一步提高。

『ai原理解读』mindspore1.2强大并行能力介绍与解读

...的自动并行 MindSpore自动并行提供了5维的并行方式:数据并行、算子级模型并行、Pipeline模型并行、优化器模型并行和重计算,并且在图编译阶段,有机融合了5个维度的并行。这5维并行方式组合起来构成了盘古的并... 查看详情

『ai原理解读』mindspore1.2强大并行能力介绍与解读

...的自动并行 MindSpore自动并行提供了5维的并行方式:数据并行、算子级模型并行、Pipeline模型并行、优化器模型并行和重计算,并且在图编译阶段,有机融合了5个维度的并行。这5维并行方式组合起来构成了盘古的并... 查看详情

pysyft学习笔记四:minist数据集下的联邦学习(并行训练与非并行训练)(代码片段)

...)概述图导入基本包创建客户机设置训练参数初始化数据集搭建神经网络模型定义训练与测试函数定义主函数训练效果手写数字识别模型(并行训练)概述图导入必要的包建立客户机初始化训练参数定义训练集与测试... 查看详情

pysyft学习笔记四:minist数据集下的联邦学习(并行训练与非并行训练)(代码片段)

...)概述图导入基本包创建客户机设置训练参数初始化数据集搭建神经网络模型定义训练与测试函数定义主函数训练效果手写数字识别模型(并行训练)概述图导入必要的包建立客户机初始化训练参数定义训练集与测试... 查看详情

模型在分布式数据并行的情况下占用两倍的内存空间

】模型在分布式数据并行的情况下占用两倍的内存空间【英文标题】:Modeltakestwicethememoryfootprintwithdistributeddataparallel【发布时间】:2021-10-2704:32:53【问题描述】:我有一个模型可以在单个GPU上很好地训练。但是当我切换到Pytorch... 查看详情

并发与并行同步与异步,线程安全的实现

...内存模型中线程私有和线程共有栈、方法区、堆中存储的数据线程安全的数据线程不安全的数据i++的非原子性Java线程的工作内存与硬件内存的关系5.实现线程安全对线程进行同步控制对数据进行安全控制6.foreach循环中为什 查看详情

并发与并行同步与异步,线程安全的实现

...内存模型中线程私有和线程共有栈、方法区、堆中存储的数据线程安全的数据线程不安全的数据i++的非原子性Java线程的工作内存与硬件内存的关系5.实现线程安全对线程进行同步控制对数据进行安全控制6.foreach循环中为什 查看详情

并发与并行同步与异步,线程安全的实现

...内存模型中线程私有和线程共有栈、方法区、堆中存储的数据线程安全的数据线程不安全的数据i++的非原子性Java线程的工作内存与硬件内存的关系5.实现线程安全对线程进行同步控制对数据进行安全控制6.for循环中为什么... 查看详情

学习笔记tf040:多gpu并行

TensorFlow并行,模型并行,数据并行。模型并行根据不同模型设计不同并行方式,模型不同计算节点放在不同硬伯上资源运算。数据并行,比较通用简便实现大规模并行方式,同时使用多个硬件资源计算不同batch数据梯度,汇总梯... 查看详情

模型并行|大规模语言模型架构megatron

...泛使用。现行的分布式训练方法主要包含两个部分:数据并行(DataParallel)和模型并行(ModelParallel)。数据并行是将模型完整拷贝到多张显卡中,对批次数据进行并行计算,适合规模小而数据多的训练... 查看详情

数据流编程与 Actor 模型

】数据流编程与Actor模型【英文标题】:DataflowprogrammingvsActormodel【发布时间】:2013-09-1809:09:31【问题描述】:如何描述“数据流编程”和“Actor模型”之间的区别?据我了解,它们并非无关,但又不相同。DF是不是一个更广泛的... 查看详情

千万级类别人脸识别模型并行训练

并行训练的方式:1.nn.DataParallel数据并行。将一个batchsize中的数据分给多个GPU并行训练。2.模型并行。将FC层拆分给多个GPU进行并行训练。3.partial_fc。(抽样fc层)一、模型并行目前处理大规模(数据多、类别大)数据集... 查看详情

pytorch-4nn.dataparallel数据并行详解

...参数———————-导入PyTorch模块和定义参数设备虚拟数据集制造一个虚拟的(随机产生)数据集。你只需要实现Python的魔法函数getitem:简单模型对于演示,我们的模型只获得一个输入,执行一个线性操作,并给出一个输出。但是... 查看详情

并行程序没有速度增加与线性程序

...序,该程序将利用多线程和多个硬盘驱动器来提高性能。数据量如此之大,以至于无法将所有数据读入内存,因此数据将被读取、处理并以块的形式写回。该测试程序采用流水线设计,能够在3个不同的线程上同时读取、处理和... 查看详情

pytorch分布式训练(dataparallel/distributeddataparallel)(代码片段)

一、模型并行与数据并行并行训练分为模型并行和数据并行:模型并行:由于网络过大,将网络拆分成几个部分分别在多个GPU上并行训练;数据并行:将batch中的数据拆分为多份,分别在多个GPU上训练。二... 查看详情

如何超越数据并行和模型并行:从gshard谈起

撰文|袁进辉GShard的论文最早于2020.6.30放在arXiv上,包括《GShard:ScalingGiantModelswithConditionalComputationandAutomaticSharding (https://arxiv.org/pdf/2006.16668.pdf)》,还有一篇更系统的系统论文《GSPMD:Generalan 查看详情

mapreduce工作原理

mapreduce工作原理为:MapReduce是一种编程模型,用于大规模数据集的并行运算。mapreduce工作原理为:MapReduce是一种编程模型,用于大规模数据集的并行运算。MapReduce采用”分而治之”的思想,把对大规模数据集的操作,分发给一个... 查看详情

R中的并行计算:如何使用内核

...逻辑脊模型,我的计算机上目前有4个核心。我想将我的数据集平均分成4部分,并使用每个核心来训练模型(在训练数据上)并将每个核心的结果保存到单个向量中。问题是我不知道该怎么做,现在我尝试与foreach包并行,但问题 查看详情