![e07ee1e99ba66c217cd67ab9fded4ee6.png](https://i-blog.csdnimg.cn/blog_migrate/d2e4177aea7fa005a6167f2c7598c346.jpeg)
本篇文章主要是对深度学习中运用多GPU进行训练的一些基本的知识点进行的一个梳理
文章中的内容都是经过认真地分析,并且尽量做到有所考证
抛砖引玉,希望可以给大家有更多的启发,并能有所收获
介绍
大多数时候,梯度下降算法的训练需要较大的Batch Size才能获得良好性能。而当我们选择比较大型的网络时候,由于GPU资源有限,我们往往要减少样本数据的Batch Size。
当GPU无法存储足够的训练样本时,我们该如何在更大的batch size上进行训练?
面对这个问题,事实上我们有几种工具、技巧可以选择,它们也是下文中将介绍的内容。
在这篇文章中,我们将探讨:
- 多GPU训练和单GPU训练有什么区别
- 如何最充分地使用多GPU机器
- 如何进行多机多卡训练?
更多关于多机多卡的分布式训练的详细架构理解和实践请参考我的下一篇文章:
Zhang Bin:深度学习分布式训练相关介绍 - Part 2 详解分布式训练架构PS-Worker与Horovodzhuanlan.zhihu.com![f6b2595689d275f8ee79be68e976b1bb.png](https://i-blog.csdnimg.cn/blog_migrate/049b02a93840c8cceb7bba51e36d37e4.jpeg)
本文章介绍的内容在框架间是通用的,代码示例为:在不借助外部框架的情况下,将单GPU训练TensorFlow代码改为支持多GPU的训练代码
单GPU训练 vs 多GPU训练
单GPU训练 一般代码比较简单,并且能满足我们的基本需求,通常做法是设定变量CUDA_VISIBLE_DEVICES的值为某一块GPU来Mask我们机器上的GPU设备,虽然有时当我们忘了设定该变量时程序会自动占用所有的GPU资源,但如果没有相应的代码去分配掌控GPU资源的使用的话,程序还是只会利用到第一张卡的计算资源,其他的资源则仅是占用浪费状态。
多GPU训练 则可以从两个方面提升我们模型训练的上限:1. 超过单卡显存上限的模型大小, 2. 更大的Batch Size和更快训练速度。相应的,目前各大主流框架的多GPU训练一般存在两种模式:
- 模型并行 :分布式系统中的不同GPU负责网络模型的不同部分,进而可以 构建超过单卡显存容量大小的模型 。比如,可以将神经网络的不同层分配到不同的GPU设备,或者将不同的参数变量分配到不同的GPU设备。
- 数据并行 :不同的 GPU设备有同一模型的多个副本,将数据分片并分配到每个GPU上,然后将所有GPU的计算结果按照某种方式合并,进而可以增加训练数据的Batch Size