跟着 https://zhuanlan.zhihu.com/p/75323303 开启CV学习之旅
卷一学习参考 https://www.cnblogs.com/paladinzxl/category/1263454.html?page=2
博主的github,其中包括了starter bundle与practitioner bundle同步更新: https://github.com/meng-ding/deeplearning_cv.git
在大规模的数据集上训练深度神经网络需要很长的时间,即使是单一的实验也需要几天时间才能完成。为了加快训练过程,我们可以使用多个GPU。虽然Theano和TensorFlow(以及Keras)等后端确实支持多GPU训练,但建立多GPU实验的过程是艰巨的,也是不容易的。
因此,对于深度神经网络和大型数据集,作者强烈建议使用mxnet库[5],并将在本书剩余部分的大部分实验中使用它。mxnet深度学习库(用C++编写)提供了与Python编程语言的绑定,并且擅长分布式多机学习–在海量数据集(如ImageNet)上训练最先进的深度神经网络架构时,跨GPU/设备/节点并行训练的能力至关重要。
mxnet库也非常容易操作–考虑到在本书前几章中使用Keras库的背景,会发现使用mxnet很容易、很直接,甚至很自然。
值得注意的是,ImageNet Bundle中的所有神经网络都可以使用单个GPU进行训练–唯一需要注意的是时间。一些网络,如AlexNet和SqueezeNet,只需要几天的时间就可以在单个GPU上进行训练。其他架构,如VGGNet和ResNet,可能需要在单个GPU上训练一个月以上。
值得注意的是,ImageNet Bundle中的所有神经网络都可以使用单个GPU进行训练–唯一需要注意的是时间。一些网络,如AlexNet和SqueezeNet,只需要几天的时间就可以在单个GPU上进行训练。其他架构,如VGGNet和ResNet,可能需要在单个GPU上训练一个月以上。
在本章的第一部分,我将强调我们将要讨论的网络架构,这些架构可以很容易地在单个GPU上训练,如果可能的话,哪些架构应该使用多个GPU。然后,在本章的后半部分,我们将研究在使用多个GPU训练卷积神经网络时可以期待的一些性能提升。
如果你问任何经验丰富的深度学习从业者,你需要多少个GPU来在一个大数据集上训练一个合理的深度神经网络,他们的回答几乎总是 “越多越好”。使用多个GPU的好处是显而易见的–并行化。
然而,我们有些人在阅读这本书时可能只有一个GPU。这就提出了一些问题。
无论你有一个GPU还是八个GPU,你都能够复制本章中详述的网络性能,但要再次牢记时间的注意事项。你的GPU越多,训练的速度就越快。如果你只有一个GPU,不要感到沮丧–只要有耐心,并理解这是过程的一部分。ImageNet Bundle的主要目标是为你提供实际的案例研究和详细信息,说明如何在具有挑战性的ImageNet数据集上训练最先进的深度神经网络(同时还有一些额外的应用)。无论你有一个GPU还是八个GPU,你都能从这些案例研究中学习,并在自己的应用中使用这些知识。
对于使用单个GPU的读者,我强烈建议将大部分时间花在训练AlexNet和SqueezeNet的ImageNet数据集上。这些网络比较浅显,在单个GPU系统上的训练速度要快得多(AlexNet的训练时间为3-6天,SqueezeNet为7-10天,这取决于你的机器)。较深的卷积神经网络,如GoogLeNet,也可以在单个GPU上训练,但可能需要7-14天。
较小的ResNet变体也可以在单个GPU上训练,但对于本书涉及的较深版本,我建议使用多个GPU。
我不建议使用一个GPU来训练的唯一网络架构是VGGNet–不仅调整网络超参数会很麻烦(我们在本书后面会看到),而且由于其深度和完全连接的节点数量,该网络的速度非常慢。如果你决定从头开始训练VGGNet,请记住,即使使用四个GPU,也可能需要14天时间来训练网络。
同样,正如我在本节前面提到的,你现在正在跨越从深度学习从业者到深度学习专家的门槛。我们正在研究的数据集是大型的、具有挑战性的–而我们将在这些数据集上训练的网络是深度的。随着深度的增加,执行前向和后向传递所需的计算量也会增加。现在花点时间来设定你的期望,这些实验不是你可以让它运行一晚上,第二天早上收集结果–你的实验将需要更长的时间来运行。这是每个深度学习研究者必须接受的事实。
但是,即使你在单个GPU上训练自己的最先进的深度学习模型,也不要着急。我们用于多个GPU的技术也可以应用于单个GPU。ImageNet Bundle的唯一目的是让你获得成功地将深度学习应用于自己的项目所需的知识和经验。
在一个理想的世界里,如果一个给定的数据集和网络架构的单个历时在单个GPU上需要N秒才能完成,那么我们会期望同一个历时用两个GPU在N/2秒内完成。然而,这种期望并不是实际情况。训练性能在很大程度上取决于你的系统的PCIe总线,你正在训练的特定架构,网络中的层数,以及你的网络是否通过计算或通信进行约束。
一般来说,用两个GPU进行训练往往能提高速度≈1.8倍。当使用四个GPU时,性能扩展到≈2.5 - 3.5倍,取决于你的系统[6]。因此,训练不会随着系统中GPU数量的增加而线性减少。受计算约束的架构(随着GPU数量的增加,更大的批处理量也会增加)在使用多个GPU时将会有更好的扩展,而依赖于通信的网络(即更小的批处理量),其延迟开始在性能下降中发挥作用。
为了进一步研究GPU的扩展性,让我们看看图3.1中NVIDIA发布的官方基准测试。在这里,我们可以看到三种类型的GPU(Tesla K80、Tesla M40和Tesla P400),它们被用来使用Caffe[7]深度学习库在ImageNet数据集上训练GoogLeNet。X轴绘制了GPU的数量(分别为1个、2个和4个),而Y轴描述了每秒训练的图像数量(前向和后向)。平均而言,当从一个GPU切换到两个GPU时,我们看到性能增加了≈1.82倍。当比较一个GPU和四个GPU时,性能增加到≈2.71倍。
随着更多的GPU被添加到系统中,性能将继续提高,但请记住,训练速度不会随着GPU数量的增加而线性扩展–如果你用一个GPU训练一个网络,然后用四个GPU再次训练它,不要指望训练网络的时间会减少4倍。也就是说,用更多的GPU来训练深度学习模型是有性能提升的,所以如果你有可用的GPU,尽可能使用它们。
在本章中,我们讨论了使用多个GPU训练深度学习架构的概念。为了执行本书中的大多数实验,我们将使用mxnet库,它为多GPU训练进行了高度优化。鉴于你在本书前几章中使用Keras库的经验,你会发现使用mxnet很自然,函数和类的名称非常相似。
从那里我们讨论了使用单个GPU和多个GPU训练网络时的基本期望。是的,用单个GPU在大数据集上训练深度网络会花费更多时间,但不要气馁–你用于单个GPU实例的技术也将适用于多个GPU实例。请记住,你现在正在跨越从深度学习从业者到深度学习专家的门槛–我们在这里进行的实验将更具挑战性,需要更多时间和精力。现在就像所有深度学习研究人员在其职业生涯中所做的那样,设定这个期望值。
在第六章,我们将在ImageNet数据集上训练我们的第一个卷积神经网络AlexNet,复制Krizhevsky等人在2012年的开创性工作中的表现[8],该工作永远改变了图像分类的格局。