做分布式计算的基本上10年之前只听说过MPI,14年之前只听过hadoop的MapReduce,17年之前只听过TensorFlow。
那么这三个分布式计算软件或者说框架有什么区别呢???现在都是搞deep learning的为主,也就是Tensorflow和Pytorch的,那么之前的MPI,Mapreduce还有发展前景吗???
这里首先说明下,本文中所说的TensorFlow,PyTorch 都是运行在GPU端的Tensorflow-gpu,PyTorch-gpu,而不是运行在CPU端的Tensorflow-cpu,PyTorch-cpu。
本文要讨论的三个代表性的计算方式:
MPI,MapReduce,Deeplearning
其实准确的来说现在的Deeplearning并不能归为一种计算方式,如果说要归纳为一种分布式计算方式,我想还是叫 —— “大规模非逻辑向量运算” 的好。
因此本文要讨论的计算方式可以说是:
MPI,MapReduce,“大规模非逻辑向量运算”
而,实际上MPI指的是分布式计算过程中消息传递的一种标准,MapReduce其实指的是分布式计算中的一种经典计算模式,而“大规模非逻辑向量运算”指的是一种具体的计算场景或是计算任务类型。
还要说明一点的是本文讨论的运行硬件不包括大型的非一致内存存取的大型机,而是主要是指分布式集群环境。
为什么会想起来本文的内容呢???那就是我上大学的时候听的分布式计算都是MPI,研究生的时候听到的都是hadoop,而读上博士就只听到Tensorflow了,突发疑问所以有了本文。
其实刚刚说了这三种有代表的计算方式:MPI,MapReduce,“大规模非逻辑向量运算”
相应的经典代表的计算软件(框架):
openmpi/mpich2, hadoop, Tensorflow-gpu
其实分别是分布式消息传递规范,计算模式,和计算场景(任务)。其中Tensorflow-gpu之类的分布式底层一般又是nccl,所以上面分类中Tensorflow-gpu也并不是很准确,或者用nccl更好。
==============================================
以计算地点分类:
我们在考虑使用这三种计算框架或计算方式时如果先按照计算地点来看还可以再分,这里的计算地点是指我们是使用CPU做具体的计算还是使用GPU做具体的计算。
而如果使用CPU来做计算的话上面的Tensorlow-gpu是不存在的,而这时“大规模非逻辑向量运算”的代表软件为Tensorflow-cpu。又由于Tensorflow所使用的消息传递规范为Google推出的通信方式(协议),其实现原理和功能基本与MPI类似,或者说是MPI的缩减版说是特定计算场景下的仿制版。
那么都是在CPU上运行的OpenMPI和hadoop又有什么区别呢,其实如果按照通信方式的方面来看还真没有啥区别。MPI为分布式通信最经典最权威的通信规范,基本上后的所有分布式通信方式都已经是它所涵盖好了的,不论是hadoop的MapReduce还是Tensorflow-gpu的NCCL其实实现的通信方式可以说是MPI的一个子集而已。换句话说如果用通信方式来划归的话,大家使用几乎所有的分布式通信的协议和规范都是被MPI所涵盖的,因此通信方式上不能讲方式,只能讲具体软件和具体应用场景。而本就是MPI所涵盖的Mapreduce为什么后来被单独被hadoop所发展呢,其实这时候就要知道MPI的不足了。
MPI准确的说是分布式通信的一种协议,具体实现其的软件如OpenMpi等只实现了其通信方式而没有实现其他的计算组件,这时候由于Mapreduce计算模式所能应用的场景和任务越来越多,Google就把MPI中的Mapreduce提出来单独发展了一套计算组件,这也就是后来的hadoop。因为之前的OpenMPI并没有为其定制分布式文件系统和分布式数据库,因为传统的计算任务需要的计算数据不大但是计算量大,所以使用一些简单的分布式文件系统容nfs等就可以了,但是后来互联网应用场景中计算的数据集也很大甚至是以万倍或千万倍的级别增长,这时传统的nfs就不适用了,于是Google就推出了自己的分布式文件系统hdfs;又由于传统的MPI并没有实现容错机制,并且计算周期也不用太长,并且都是运行在超算这样的集群上,但是Google提出如果我们要是需要运行在普通的机房,用普通的电脑来运行,那么容错机制就显得很重要了,我们假设应用场景中是会出现一定的异常硬件错误导致我们计算任务的中断,那么这时MPI下的MapReduce就不能胜任了,于是Google就推出了自己的Mapreduce计算框架hadoop,hadoop不仅实现了对硬件的容错机制同时还由于其自身还设计了分布式文件系统hdfs很好的切割了数据集,因此hadoop还实现了文件(数据集)为驱动的计算负载,而这些负载、容错又是可以自动实现的,因此就有了后来的hadoop这类的MapReduce计算框架,他们可以说是mpi的一个子集针对特定计算任务和场景独立发展出来的一套软件框架。
上面我们说了是以计算地点为分类的,但是这个计算地点的分类又是依靠什么呢,其实这个计算地点的分类也是要看计算的具体任务的计算类型的。
CPU的计算类型是逻辑控制和数值计算能力均可以,属于全能型的,我们日常生活中使用的大部分软件都是这个类型的。
GPU的计算类型是以数值计算能力为主,而逻辑控制能力特别的弱,我们平时看电影,绘图,打游戏等渲染类的计算任务则是GPU实现的。
以前很少听说GPU来进行计算任务的,原因就是GPU基本上可以认为是只能进行数值计算而不太能进行逻辑控制的一种硬件,换句话说就是GPU可以很好的进行向量计算而很难处理复杂的逻辑控制计算,而且GPU的计算核心是非常的多,特别的多,超多,一个性能爆掉的CPU也就是几十个计算核心,而一个普通的GPU就可以达到几千甚至是几万的计算核心,虽然GPU的指令集和主频低等问题,但是总的来说进行大规模的向量计算GPU的性能是顶级CPU的数倍,数十倍,甚至是百倍。
向量计算在某种意义上来说就是矩阵运算,也就是说GPU是十分适合矩阵运算的,而对于其他的非矩阵类运算是极为不适合的,GPU设计之初也是专为矩阵运算任务而设计的。而现如今最火热的Tensorflow , PyTorch也是主要进行矩阵运算的,或者说Deep Learning本身就是在说矩阵运算的。
设么时候用GPU运算,什么时候用CPU运算呢,那就是看你的运算是否是向量计算为主,并且没有太多的逻辑控制,这时候我们就选择GPU运算,如现在的deep learning主要进行矩阵运算,除此之外我们都是需要使用CPU进行运算的。如果一个计算任务中逻辑控制较多本身我们是难以使用GPU进行运算的,因为GPU中逻辑控制单元比较少,不论软件编码还是实际的运行性能都是差强人意的;如果一个任务并不是大规模向量计算的话我们也是没有必要使用GPU进行运算的,因为GPU之所以运算能力强就是因为其运算核心比较多,而如果是进行较小计算量的向量计算的话我们也是无法从GPU运算上获得任何性能上的提升,甚至很可能没有使用CPU的速度快。
====================================================
上面是对MPI,Hadoop,Tensorflow-gpu的一些分析,但是对于消息传递来说MPI是一直以来的经典,但是近些年随着GPU应用的增加又出现了一种新的消息传递的软件那就是NCCL, 那么NCCL又是怎么回事呢???
其实NCCL和MPI的功能基本相似,原理也基本一样,但是如果说谁功能更强大或者能力更强可能还是要说是MPI,但是NCCL的价值又在哪呢,为什么现在的Tensorflow-GPU,PyTorch-GPU又都是再使用NCCL呢。其实虽然NCCL的功能没有MPI的强大,但是它的优势是工作在GPU端,而MPI是工作在CPU端的,也就是说MPI进行消息传递时消息存储的位置是host内存,而NCCL进行消息传递时消息存储的位置是Device,也就是说在使用MPI时如果我们想将CPU工作的host内存数据发送是可以直接发送的,而想将GPU中的数据进行发送的话我们是需要将GPU中的消息copy到Host对应的CPU内存中然后再发送的,也就是说使用MPI传递GPU中的数据是有一个步骤是从Device拷贝数据到Host的,而NCCL是直接工作在GPU端的,NCCL是直接将GPU中的数据进行发送和传递的,也就是说在发送GPU中的数据时NCCL要比MPI少两次拷贝(一次是发送时将Device内数据拷贝到Host中,一次是接收时将Host内数据拷贝到Device中)。
那么MPI和NCCL的发展前景呢???
其实这个还是要看CPU进行分布式计算还是使用GPU进行分布式计算,如果使用CPU进行分布式计算自然是使用MPI,但是如果适合GPU进行分布式计算,那么自然是使用NCCL。现在来看确实是GPU计算比较火热,但是CPU计算也是存在的,比较CPU计算才是以前的主流,要不是出现了Deep Learning那么估计也没有GPU计算什么事。虽然美国鼓吹GPU计算十多年,但是真正意义上来说 GPU计算在我国火热起来还是在Deep Learning兴起之后,毕竟10多年前我学CUDA的时候只有教程想找个有NVIDIA GPU的电脑都找不到,而现在不同,现在基本上除非你用Mac或者AMD的显卡,其他的估计都是用NVIDIA的显卡,因此NCCL的前景十分火热。而使用MPI的场景还是比较少,比较使用MPI的都是超算,而使用NCCL的一般都显卡的台式机就OK了,一般使用NCCL顶配就是4卡泰坦,而使用MPI的顶配却是银河超算,太湖之光超算啥的,比较超算这东西离我们还是有些距离的。
总的来说就是MPI使不太能被淘汰的,会一直存在,比较CPU进行逻辑计算的分布式场景会一直存在的,而未来至少短的几年之内GPU应用会越来越火热的,也就是MPI不死,而NCCL会愈来愈火热。
但是有一点是我们需要注意的,那就是MPI的很多应用是需要我们手动编码的,而NCCL的应用基本都是已经被封装好的,我们是不太需要编码的,毕竟你在使用Tensorflow-gpu,PyTorch-gpu时调用封装好的函数就可以了。或者说MPI虽然不能火热,但会一直存在,并且需要人工编码,NCCL会愈来愈火热,但是不太需要人工编码,你只需要会用相关软件,框架中的函数调用即可(除非你本身就是研究GPU底层通信优化的除外)。
MPI的使用需要一定的编码能力,虽然很小众,但是会一直存在,这东西很底层,有些应用还是需要手动编码的。NCCL未来会更加火热,不过这东西不太用学,你只需要会调用Tensorflow-gpu,PyTorch-gpu中的函数调用即可。
======================================================