ModelCube(modelcube.cn)是博雅数智自主研发的一站式人工智能科研平台。为全国高校和科研机构的大数据和人工智能科研团队提供一站式科研服务。基于MLOps的实践和企业核心技术,实现了科研场景中全类型数据管理与标注,实验环境快速获取与灵活定制,模型的全生命周期管理,科研成果的管理与发布,以及 AI驱动的论文检索和学习等功能。
1 分布式训练定义
分布式训练(Distributed Training)目的在于将原本巨大的训练任务拆解开成多个子任务,每个子任务在独立的机器上单独执行。在分布式训练中,模型参数的同步方式可以是同步的或异步的。同步训练要求所有设备在参数更新时保持同步,而异步训练允许设备独立地更新参数,通常更灵活,但可能引入一些不稳定性。在分布式训练过程中,并不是所有的训练任务都可以拆分,当前常用的拆分方式有如下几种:
数据并行:将数据集切分放到各计算节点,每个计算节点的计算内容完全一致,并在多个计算节点之间传递模型参数。可以解决数据集过大无法在单机高效率训练的问题。数据并行中每个分布式节点存储相同的参数,工作器节点需要在批处理计算结束时同步模型参数或梯度,以确保其训练的是一致的模型。
模型并行:模型的不同部分(通常是神经网络的层或模块)在不同的计算设备上并行计算。可以解决参数量巨大的问题,减轻了内存需求,有效地利用多个设备的计算资源,从而加速训练过程。在模型并行中,通常工作器节点只需要为每个前向或后向传播步骤同步共享的参数一次。
为了实现深度学习的分布式训练,需要采用单机多卡或者多机多卡的方式,让分布在不同 GPU 上的数据和模型协同训练。
单机单卡:使用一台计算机(单机)上的一块图形处理单元(GPU)来执行训练任务。这是最简单和最常见的深度学习训练配置,对于小规模数据集和相对较简单的模型,单机单卡训练可能足够快速和有效。 单机多卡:利用单机上的多个GPU来执行训练任务。这种配置充分利用了多个GPU的并行计算能力,以加速训练大型深度学习模型。单机多卡是在计算资源有限的情况下实现高性能深度学习训练的一种有效策略 多机多卡:一种高度并行的深度学习训练配置,利用多台计算机上的多个GPU来执行训练任务。通常,不同机器上的不同GPU卡处理不同数据批次,然后将梯度进行同步,以更新模型参数。同时可以使用模型并行性,其中不同GPU卡处理模型的不同部分。
在实际的分布式训练过程中,比较重要的评价指标有如下几个:
吞吐量(sequence/sec 或 FPS):每秒能处理的图片数或数据量。
加速比(speedup):多卡训练下的单卡吞吐量平均指标除以单卡训练下的吞吐量平均指标,体现的是训练集群的效率与可扩展性,越高的加速比表明训练集群的资源利用率越高。
收敛时间与训练次数(epoch):训练一个模型到收敛需要 24小时以上,都可以看做是生产不适用。
平均准确率:训练结束的平均准确率能达到阈值就认为训练是收敛的。
学习率:用于控制神经网络模型参数在每次训练迭代中的更新幅度。学习率大模型训练学习速度快,但是易导致损失率爆炸;学习率小模型训练学习速度慢,而且容易过拟合,收敛速度慢。
曲线拟合:XPU训练场景下,通常先用一个训练好模型为基础或先用GPU训练出一个基础模型,然后把XPU训练的结果跟基准指标进行比较,曲线拟合则认为训练结果达标。
2 常见名词解释
2.1 随机梯度下降(Stochastic Gradient Descent)
随机梯度下降(SGD)算法是基于梯度下降算法产生的一种常见的优化算法。梯度下降法的目标是优化损失函数,需要对每一个超参数求偏导得到当前这一轮的梯度,然后向梯度的反方向进行更新,通过不断迭代更新,可以得到超参数的全局最优解。假设模型为最基本的线性模型,则梯度下降的基本形式是:
其中, 为学习率。
随机梯度下降法,指的是每次随机从样本集中抽取一个样本对参数进行更新。学习率 不能设置太大,不然容易出现在最优解附近“震荡”,但始终无法更接近最优解的现象。
2.2 集合通信(Collective Communications)
集合通信是一个进程组的所有进程都参与的全局通信操作,其最为基础的操作有发送(send)、接收(receive)、复制(copy)、组内进程栅障同步(Barrier)以及节点间进程同步(signal +wait)。
Barrier同步操作会阻塞所有的调用者直到所有的组内成员都调用,用于一个集合通信子中所有进程的同步,调用函数时进程将处于等待状态,直到通信子中所有进程 都调用了该函数后才继续执行。 Signal与Wait属于记录型信号量机制,可用于解决进程间的同步问题,在通信原语里从一个节点发送一个数据到另外一个节点时,会同时signal一个event值到对端,对端的wait操作接收到这个event时会返回一个确认给signal,这样保证在节点的进程间进行数据的同步操作。
2.3 通信原语
最基本的操作经过组合构成了一组通信模板也叫通信原语。例如:1对多的广播(broadcast)、多对1的收集(gather)、多对多的收集(all-gather)、1对多的发散(scatter)、多对1的规约(reduce)、多对多的规约(all-reduce)、组合的规约与发散(reduce-scatter)、多对多的(all-to-all)等,集合通信的难点在于通信效率以及网络硬件连接拓扑结构的最佳适用。
Broadcast属于1对多的通信原语,一个数据发送者,多个数据接收者,可以在集群内把一个节点自身的数据广播到其他节点上。
Scatter也是1对多,与Broadcast不同的是Broadcast把主节点0的数据发送给所有节点,而Scatter则是将数据的进行切片再分发给集群内所有的节点。
Gather属于多对1的通信原语,具有多个数据发送者,一个数据接收者,可以在集群内把多个节点的数据收集到一个节点上。
All-gather属于多对多,具有多个发送者和多个接收者,可以在集群内把多个节点的数据收集到一个主节点上(gather),再把这个收集到的数据分发到其他节点上(broadcast),即收集集群内所有的数据到所有的节点上。
规约(Reduce)属于多对1的通信原语,具有多个数据发送者,一个数据接收者,可以在集群内把多个节点的数据规约运算到一个主节点上,得到精简数据。
Reduce-scatter属于多对多的通信原语,具有多个发送者和多个接收者,其在集群内的所有节点上都按维度执行相同的规约运算,再将结果发散到集群内所有的节点上,其等价于节点个数次的reduce操作,再执行节点个数的scatter次操作,其反向操作是All-gather。
All-reduce属于多对多的通信原语,具有多个数据发送者,多个数据接收者,其在集群内的所有节点上都执行相同的reduce操作,可以将集群内所有节点的数据规约运算得到的结果发送到所有的节点上。All-reduce可通过在主节点上执行Reduce + Broadcast或Reduce-scatter + All-gather实现。
All-to-all 每一个节点的数据会scatter到集群内所有节点上,同时每一个节点也会gather集群内所有节点的数据。其是对all-gather的拓展,all-gather中不同节点向某一节点收集到的数据是相同的,而all-to-all中不同的节点向某一节点收集到的数据是不同的。
2.4 结构设计
2.4.1 基于参数服务器(Parameter Server)
参数服务器(PS)由两部分组成:服务器(server/master)和节点(client/worker)。有一组机器只用来存储参数和梯度,其他所有的 Worker与PS服务器通信,把自己的梯度上传(Push)到 PS,PS 把所有 Worker 的梯度收集计算(通常是求均值),然后各Worker再从PS拉回(Pull)更新后的参数/梯度并应用到自己的参数上。在分布式训练中迭代前多出了pull操作,用以从server读取等待更新的参数,完成计算后需要push操作将产生的梯度返回给server。
2.4.2 基于规约模式(Reduce)
参数服务器的主要问题是多个 Worker 同时跟 PS 通信,PS 本身有可能成为瓶颈,随着 Worker 数量的增加,整体的通信量也线性增加,加速比可能会停滞在某个点位上。
Ring-allreduce是其中较为经典的一种,是一种分布式计算中的通信和同步算法,用于将数据从多个计算节点中的多个GPU收集、合并和同步。数据传输按环形路径进行,每次传递一部分数据,直到所有节点都收到了其他节点的数据,一旦所有节点都收到了其他节点的数据,它们可以合并数据,例如计算平均梯度或同步模型参数。通过环形路径传递数据,可以减少通信延迟,提高通信效率。同时因为数据可以绕过故障节点,对于一些计算节点的故障有一定的容错性。
2.5 MPI(Message Passing Interface)
MPI是一种用于编写并行计算程序的通信库和协议。它是一种标准的消息传递接口,广泛用于高性能计算(HPC)领域,特别是在超级计算机和并行计算集群中。MPI 的主要目的是允许多个进程或计算节点之间进行通信和数据交换,以便它们可以共同协作执行并行计算任务。可以用于不同类型的并行计算,包括数据并行和任务并行,它支持多种不同的通信模式,如点对点通信和集体通信。MPI 有多个实现版本,其中最著名的是MPICH和Open MPI。
2.6 NCCL(NVIDIA Collective Communications Library)
NCCL是由 NVIDIA 开发的一种通信库,专门用于在 GPU 加速计算中实现高性能的多 GPU 通信。其提供了一组高性能的基本通信原语,允许不同 GPU 之间的数据传输、点对点通信、规约操作和集体通信等。这些通信原语经过特别优化,以利用 NVIDIA GPU 的强大计算能力,从而提高了通信性能。NCCL 还具有 GPU 亲和性,允许应用程序将任务与特定 GPU 相关联,以进一步提高通信效率。
3 分布式训练方法总结
3.1 HogWild
Hogwild! 方法首先在2011年的论文《Hogwild!: A Lock-Free Approach to Parallelizing Stochastic Gradient Descent》中被提出,主要关注如何并行化SGD算法。Hogwild! 方法的核心思想是通过允许多个计算节点同时更新模型参数,而不需要显式的锁机制来进行同步,采用无锁(lock-free)的方式来实现分布式训练,以降低通信和同步开销,提高训练效率。
该策略允许多个处理器同时访问共享内存,并随意更新内存中的各个组件,而无需锁定。这种无锁策略可能会引发担忧,因为处理器可能互相覆盖彼此的进展。然而,研究表明,当数据访问是稀疏的,即每个SGD步骤只修改决策变量的一小部分时,内存覆盖是罕见的,且当发生覆盖时,几乎不会引入计算错误。
Hogwild!: A Lock-Free Approach to Parallelizing Stochastic Gradient Descent[1]. Feng Niu, Benjamin Recht, Christopher R ́e, Stephen J. Wright. NIPS 2011.
并行设置:算法假设存在一个共享内存模型,其中有 个处理器。每个处理器可以同时访问和修改决策变量 。 原子更新:每个处理器可以以原子方式更新 中的特定分量,而不需要额外的锁定结构。这确保了在多个处理器同时访问 时不会出现冲突。 算法:每个处理器在 中随机选择一个项 ,计算在 处的函数 的梯度(或子梯度),然后将这个梯度的一部分应用于 。处理器只更新 中由 索引的变量,不会影响其他变量。 决策变量状态:决策变量 ,表示在进行 次更新后的状态。尽管处理器不了解其他处理器是否已修改 ,但 的定义确保了状态的一致性。 渐进性收敛:如果底层函数 的超图(超图是与 相关的数据结构)是各向同性和稀疏的,那么该算法将以几乎与其串行版本相同数量的梯度步骤收敛,这意味着在使用多个处理器时可以获得几乎线性的性能加速。
3.2 Parameter Server
2014年的论文《Scaling Distributed Machine Learning with the Parameter Server》主要内容是介绍了一种用于扩展分布式机器学习的技术,即参数服务器(Parameter Server)。
允许同时运行多个不同的机器学习算法,节点分为服务器组和多个工作组:1)服务器组中的节点负责维护全局共享的模型参数,它们之间相互通信,以确保参数的可靠性和扩展性;2)每个工作组运行一个机器学习应用程序,通常在本地存储一部分训练数据用于计算本地统计信息。工作组的节点只与服务器组中的节点通信,用于更新和获取共享的模型参数。 参数服务器复用已有的资源管理系统,如 Yarn、Mesos 或者 Kubernetes 作为 resource manager;训练数据则使用分布式文件系统存储,一般是 HDFS。 一个具体任务运行时,task scheduler 负责通知每个 worker 加载自己对应的数据,然后从 server 上拉取一个要更新的参数分片,用本地数据计算参数分片对应的变化量,然后同步给 server;server 在收到自己负责的参数分片对应的所有 worker 的更新后,对参数分片做一次更新。 支持不同的参数命名空间,允许不同的工作组隔离其共享参数集。多个工作组也可以共享相同的参数命名空间,以增加并行性。 它支持线性代数操作、节点之间的参数推送和拉取、异步任务执行、不同的一致性模型以及参数通信方式,旨在简化开发分布式机器学习应用程序。
Scaling Distributed Machine Learning with the Parameter Server[2]. Mu Li, David G. Andersen, Jun Woo Park, Alexander J. Smola, Amr Ahmed, Vanja Josifovski, James Long, Eugene J. Shekita, Bor-Yiing Su. BigDataScience 2014.
3.3 ImageNet in 1 hour
本文比较系统的探讨了深度学习训练中的一些技巧,同时从同步SGD的角度对如何在数据量大的时候既保持训练速度又保持泛化精度的问题进行了思考。传统的SGD训练通常使用小批量数据(minibatch),这意味着每次迭代更新模型参数时只使用少量样本,该文章尝试将批量大小增加到更大的程度,以提高训练速度。
论文提出了两种warmup策略:
恒定warmup: 在最开始的5个epoch中使用一个较小的学习率,然后再使用 作为后面的学习率。 渐变warmup: 在最开始的1个epoch使用一个较小的学习率,然后在5个epoch中逐步将学习率增加到 。
文章采用梯度聚合(gradient aggregation)方法,将各个GPU上的梯度信息,都聚合到一个GPU上,并且将这些梯度加起来。其采用all-reduce操作,用于服务器内和跨服务器之间的通信:(1) 来自服务器内的 8 个GPU的缓冲区被汇总成每个服务器的单一缓冲区;2) 结果缓冲区在所有服务器之间共享和相加;3) 将结果广播到每个GPU。
其主要包括两种算法:递归减半和翻倍算法以及桶算法(环算法)。递归减半和翻倍算法需要较少的通信步骤,因此在延迟受限的情况下表现更好,而在32台服务器(256个GPU)上使用递归减半和翻倍算法相对于桶算法能够实现3倍以上的速度提升。
Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour[3]. Priya Goyal, Piotr Dollár, Ross Girshick, Pieter Noordhuis, Lukasz Wesolowski, Aapo Kyrola, Andrew Tulloch, Yangqing Jia, Kaiming He. arXiv 2017.
3.4 Gradient Sparsification
梯度稀疏化(Gradient Sparsification)于2017年被提出,是一种分布式训练技术,其目的是通过将随机梯度稀疏化,以减少通信成本,同时只略微增加迭代次数。该技术的关键是舍弃随机梯度的一些坐标(或分量),然后适当增加其余坐标的权重,以确保稀疏化的随机梯度仍然是无偏的。梯度稀疏化方法是一种用于减少通信开销的技术,可以与同步的分布式随机优化算法一起使用,以帮助降低梯度传输的通信成本。此外,异步算法也可以使用梯度稀疏化技术,实现方式与同步算法类似。
同时提出了一种凸优化形式,用于在给定依赖于计算复杂度的方差预算的情况下,最小化随机梯度的编码长度。
下面两种算法展示了如何计算一个优化概率向量,一种是基于封闭形式解的算法(Algorithm 2),另一种是一种贪心算法(Algorithm 3),用于近似解决问题。这些算法的目标是根据特定条件和约束找到满足优化要求的概率向量。
Gradient Sparsification for Communication-Efficient Distributed Optimization[4]. Jianqiao Wangni, Jialei Wang, Ji Liu, Tong Zhang. NIPS 2017.
3.5 Horovod
Horovod是Uber的开发者在百度的ring-allreduce算法的基础上构建的分布式深度学习框架,主要解决的是tensorflow分布式训练过程比较复杂以及拓展性不好的问题。Horovod采用p2p的ring-allreduce方法代替PS架构进行分布式训练,这个方式最早是由百度结合HPC中的方法提出来的,但做了如下几点提升:
将TensorFlow ring-allreduce算法的实现转化为一个独立的Python包,可以方便的嵌入到不同版本的tensorflow中,可移植性更好。 引入了NCCL作为底层通信的库,nccl支持ring-allreduce,而且也支持跨机器通信。 增加了对适用于单个服务器(可能在多个GPU中)的模型的支持。 更改了一些API接口,添加 broadcast 操作,把root设备上的params广播到其他设备上。新的API将用户向其单个GPU程序引入的操作数量减少到四个,使得嵌入到训练框架中更加方便。
Horovod: fast and easy distributed deep learning in TensorFlow[5]. Alexander Sergeev, Mike Del Balso. arXiv 2018.
具体的实现流程如下图。 个节点中的每个节点与其两个对等节点进行通信,共进行了 次通信,节点发送和接收数据缓冲区的块。在第一次 次迭代时,接收到的值会被添加到节点缓冲区。在第二次 次迭代时,接收到的值将替换节点缓冲区中的值。
3.6 Hierarchical All-Reduce
当使用Ring All-Reduce对小张量进行通信时,性能较差。为了解决小张量通信的问题,引入了分层 All-Reduce方法。这个方法将GPUs分组,使用三阶段算法在所有GPUs之间执行all-reduce操作,从而减少通信步骤。这种方法在减少通信延迟的同时,充分利用了多个 GPU 的并行性能。
首先,在同组内进行reduce。每个GPU将其张量与同组内其他GPU的张量相加,得到一个部分结果。这个部分结果将被存储在同组内的一个主GPU中。 其次,跨组执行ring all-reduce。将主GPU的部分结果传递到每个组内的主GPU,然后执行ring all-reduc操作,将这些部分结果从每个组内的主 GPU 传递给其他组内的主 GPU。 最后,同组内进行broadcast。一旦每个组内的主GPU获得了来自其他组内的部分结果,它们将执行广播操作,将最终的结果传播到同组内的每个GPU。这确保了每个GPU都拥有最终的all-reduce结果。
Highly Scalable Deep Learning Training System with Mixed-Precision: Training ImageNet in Four Minutes[6]. Xianyan Jia, Shutao Song, Wei He, Yangzihao Wang, Haidong Rong, Feihu Zhou, Liqiang Xie, Zhenyu Guo, Yuanzhou Yang, Liwei Yu, Tiegang Chen, Guangxiao Hu, Shaohuai Shi, Xiaowen Chu. NeurIPS 2018
3.7 3LC(3-value Lossy Compression)
3LC是一种用于减小分布式机器学习通信负担的压缩技术。它采用轻量级的压缩算法,以减少通过网络传输的数据量,从而提高性能。其主要结合3-value quantization with sparsity multiplication、Quartic encoding和Zero-run encoding三种技术。
3-value quantization with sparsity multiplication:这是一种有损转换技术,将表示状态变化的浮点数映射到三个值 {-1,0,1} 之一。它有一个用于控制数据压缩程度的参数。这种转换会引入一些量化误差,但可以通过使用错误累积缓冲区来随时间校正这些误差。由于它对训练模型的准确性影响较小,因此不需要通过机器学习算法更改来弥补潜在的准确性损失。 Quartic encoding:一种无损编码技术,将每组五个3值 {-1,0,1} 折叠成一个字节,采用快速向量化操作,比简单的2位编码的3值数据占用更少的空间。Quartic编码的输出易于进一步压缩。 Zero-run encoding:也是一种无损编码技术,通过使用一种专为Quartic编码数据设计的变种游程编码来缩短连续运行的常见字节(包含五个零值)。它实现了约2倍或更高的压缩比,具体取决于状态变化值的分布。
3LC: Lightweight and Effective Traffic Compression for Distributed Machine Learning[7]. Hyeontaek Lim, David G. Andersen, Michael Kaminsky. arXiv 2018.
3.8 GPipe
GPipe使用模型并行方案,将模型切分成一连串stage,每个stage放在独立的设备(GPU/TPU)上,实现对超大规模模型的支持,同时利用Pipeline的方案,提高了模型并行模式下的设备利用率。GPipe将mini-batch进一步划分成更小的micro-batch,同时利用pipeline方案,每次处理一个micro-batch的数据,得到结果后,将该micro-batch的结果发送给下游设备,同时开始处理后一个micro-batch的数据,通过这套方案减小设备中的空闲时间(Bubble)。
Pipeline:因为层与层之间是跨设备的,就导致了有些设备在空转,如图(b)所示,同一时间有三个设备是没有计算任务的。Pipeline实现了计算的时候将一个大batch切成很多小batch,梯度在所有的小batch都计算完之后进行累加,从而实现并行化。同时,把大batch切分以后,就导致在一个设备上占用的内存峰值变小了,因而就需要比较少的设备。
Re-materialization:在前向计算过程中,GPipe只记录stage划分处的输出,在计算梯度时,GPipe会重新执行前向计算逻辑,从而得到各个算子的前向结果,然后再计算梯度结果。Re-materialization的好处是不用保存中间层输出的激活值,大大减少了内存需求,可以有效增大训练的batch_size。
GPipe: Efficient Training of Giant Neural Networks using Pipeline Parallelism[8]. Yanping Huang, Youlong Cheng, Ankur Bapna, Orhan Firat, Dehao Chen, Mia Chen, HyoukJoong Lee, Jiquan Ngiam, Quoc V. Le, Yonghui Wu, zhifeng Chen. NeurIPS 2019.
3.9 PipeDream
PipeDream是融合了流水线(Pipeline)、模型并行(model-parallism)以及数据并行(data-parallelism)三个机制的高效模型训练方案。PipeDream使用多个输入数据的流水线作业,来克服模型并行训练时硬件效率限制的问题。在图像模型上测试可以达到1.45至6.76的加速比。
Pipeline Parallelism:PipeDream使用pipeline parallelism(流水线并行),将深度神经网络(DNN)模型的层划分为多个阶段,每个阶段包含模型中一系列连续的层,每个阶段映射到一个独立的GPU,用于执行该阶段内所有层的前向传播和反向传播。 多批次并行: 在最简单的情况下,系统中只有一个小批次活跃,一次最多只有一个GPU处于活跃状态。为了充分利用所有GPU,系统将多个小批次依次注入到pipeline中。当某一阶段完成了前向传播后,它会异步将输出激活值传递给下一阶段,并同时开始处理另一个小批次。最后阶段在前向传播完成后立即开始对另一个小批次执行反向传播。每个阶段完成反向传播后,会异步将梯度传递给前一阶段,同时开始计算下一个小批次。
PipeDream: generalized pipeline parallelism for DNN training[9]. Deepak Narayanan, Aaron Harlap, Amar Phanishayee, Vivek Seshadri, Nikhil R. Devanur, Gregory R. Ganger, Phillip B. Gibbons, Matei Zaharia. SOSP 2019.
下面是关于深度学习并行训练的一篇综述文章:
3.10 Distributed Overview
深度神经网络(DNNs)已成为现代计算应用中的重要工具。加速其训练是一个主要挑战,技术手段包括分布式算法到低层次电路设计。在综述中,作者从理论角度描述了这个问题,然后介绍了其并行化的方法。作者展示了DNN架构的趋势以及这些趋势对并行化策略的影响。接着,作者回顾并建模DNN中不同类型的并发性:从单个操作符,到网络推断和训练中的并行性,再到分布式深度学习。作者讨论了异步随机优化、分布式系统架构、通信方案以及神经架构搜索。基于这些方法,作者推断出深度学习中并行性的潜在方向。
Demystifying Parallel and Distributed Deep Learning: An In-Depth Concurrency Analysis[10]. Tal Ben-Nun, Torsten Hoefler. ACM Computing Surveys 2019.
Hogwild!: A Lock-Free Approach to Parallelizing Stochastic Gradient Descent: http://modelcube.cn/paper/detail/45
[2]Scaling Distributed Machine Learning with the Parameter Server: http://modelcube.cn/paper/detail/46
[3]Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour: http://modelcube.cn/paper/detail/39
[4]Gradient Sparsification for Communication-Efficient Distributed Optimization: http://modelcube.cn/paper/detail/40
[5]Horovod: fast and easy distributed deep learning in TensorFlow: http://modelcube.cn/paper/detail/41
[6]Highly Scalable Deep Learning Training System with Mixed-Precision: Training ImageNet in Four Minutes: http://modelcube.cn/paper/detail/43
[7]3LC: Lightweight and Effective Traffic Compression for Distributed Machine Learning: http://modelcube.cn/paper/detail/42
[8]GPipe: Efficient Training of Giant Neural Networks using Pipeline Parallelism: http://modelcube.cn/paper/detail/2385212
[9]PipeDream: generalized pipeline parallelism for DNN training: http://modelcube.cn/paper/detail/47
[10]Demystifying Parallel and Distributed Deep Learning: An In-Depth Concurrency Analysis: http://modelcube.cn/paper/detail/18
阅读原文,了解更多信息:ModelCube一站式人工智能科研平台
http://modelcube.cn/paper/reading-list-detail/42