赞
踩
分布式训练就是指将模型放置在很多台机器并且在每台机器上的多个GPU上进行训练,之所以使用分布式训练的原因一般来说有两种:其一是模型在一块GPU上放不下,其二使用多块GPU进行并行计算能够加速训练。但是需要注意的是随着使用的GPU数量增加,各个设备之间的通信会变得复杂,导致训练速度下降。
一般来说,分布式训练主要分为两种类型:数据并行化 (Data Parallel) 以及模型平行化(Model Parallel)。
当训练的数据量非常大时,假设模型的结构能够放置在单个GPU上时,就可以采用数据平行化的方式来进行分工合作。
常用的做法是依照一些规则将数据分配到不同的GPU上,并且每个GPU都有相同的模型构架,也就是会在每个GPU上复制一份相同的模型,各自进行训练后,将计算结果合并,再进行参数更新。如下所示:
此时的参数更新的方式又分为同步及异步两种:
当训练的模型构架太大以至于在一个GPU放不下时,可以采用模型平行化的方式来将模型拆解并分配到不同的GPU上。如下所示:
由于模型层与层之间通常有依赖性,也就是指在进行前向传播、反向传播时,前面及后面的层会作为彼此的输入和输出,在训练速度上会有一定的限制,因此若非使用较大的模型较不建议采用模型平行化。
当然也可以采用结合数据平行化与模型平行化的方式,如下图所示:
此时的做法是将模型拆解并分配到单个机器中不同的GPU上,并且在其他机器中的每个GPU都复制一份相同的模型构架(拆解后的部分模型),而数据数据也会依照一些规则分配到不同的GPU上。
Pytorch提供了两种分布式训练方法—DataParallel(DP)、DistributedDataParallel(DDP)。
通常来说,DP的code写法较为简单,但由于DDP的执行速度更快,官方更推荐使用DDP。
本文介绍了分布式训练的三种实现方式,即数据并行化,模型并行化以及二者的混合,并给出了相应的图例来讲解其背后的原理。
您学废了吗?
关注公众号《AI算法之道》,获取更多AI算法资讯。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。