在训练神经网络的时候,有时候数据的读取处理所占用的时间比较长,像数据量非常大的情况,或者是3D的数据预处理比较耗内存的情况。此时我们希望并行化,即数据处理与训练同时进行。
参考:https://tensorpack.readthedocs.io/tutorial/extend/input-source.html
图片上为两种数据处理的方式:并行化和串行化。
并行化:在处理数据的时候并进行训练,当gpu空闲的时候,已经训练好的数据能够及时的喂到显存中。串行化:必须对数据进行处理之后才可以送到gpu,gpu才可以开始工作,在数据处理完之前,gpu一直处于空闲状态,大大的浪费了资源。
在网络的训练过程中,必须要明确一点:在训练的同时准备数据!!
有三个原因:
数据准备通常会消耗大量的时间(取决于实际问题)。数据准备通常使用与训练时使用完全不同的资源(参见上面的图)——一起做并不会降低整体的速度。事实上,可以在准备过程中进一步并行化为不同的阶段,因为它们也使用不同的资源,即不论并行还是串行使用的都是不同的资源。数据准备通常不依赖于前一个训练步骤的结果。
让我们做一些简单的计算:根据tensorflow/benchmarks,4个P100 gpu可以以每秒852张图像的速度训练ResNet50,这些图像的大小为85222422434bytes = 489MB。假设您有5GB/s memcpy带宽(如果您运行单线程复制),简单地复制一次数据就需要0.1秒——这会使您的训练速度降低10%。考虑一下在预处理过程中还要复制多少份。