【深度学习基础知识 - 21】加快模型训练速度的方法

在深度学习任务中,虽然可以通过堆叠参数、设计更复杂的结构来提高模型的表征能力,但这也会导致模型的计算量增加,训练时间延长,大大降低模型的产出效率。这篇文章根据博主的经验简单介绍一些加快模型训练速度的方法,以及为什么需要关注模型的训练速度。

加快深度学习模型训练速度的方法

1. 合理的超参数设计

  • BatchSize。每次迭代batch的大小是影响每次推理速度的主要因素,而batchsize并非越大越好,一个经验性的可选数值是32、64、128,一般来说,每个batch的大小一旦超过64,继续增大batch带来的性能收益就微乎其微了,因此可以通过实验尝试一下这三个数值,在达到同样的性能前提下让batch尽可能的小,这也会给显存留下更大的空间,进而可以尝试更多的模型设计方式。
  • epoch、学习率策略。迭代次数和学习率这两个参数需要放在一起讲,我们在挑选这两个参数时,需要每100次迭代(或者其他)保存一次模型,然后把这些模型的精度曲线、loss、和当前的学习率画到一张图像中。从图像中就可以发现,在某些学习率设置下,可能训练几个epoch模型的性能就不会继续增加了,loss也不会降低,因此找到这个平衡点之后就可以将当前学习率下的后续epoch舍弃掉,进一步降低学习率训练。一个经验性的总结是:更小的学习率通常只需要更少的epoch。因此,可以通过修改学习率和训练epoch的策略来达到相同精度的前提下降低训练时间。

2. 权值共享

  • 每轮迭代的推理速度和模型的参数量、计算量息息相关,而通过设置参数权值共享,可以降低总的参数量和计算量,另外如tensorflow,pytorch等深度学习框架都有针对权值共享的推理优化,所以会有相对明显的加速效果。

3. 升级相关软件包

  • 如将cuda、tensorflow、pytorch进行升级,一般来说越新越好。旧版cuda可能只是针对一些显卡做了适配,但是新版cuda会针对一些新的算子、显卡做针对性优化,如常见的Tesla V系列显卡,采用cuda11的推理速度就明显快于cuda8、9。tensorflow、pytorch等框架也是同理。并且这些软件包都是向下兼容的,因此不用过于担心代码移植问题。

4. 多卡训练、数据并行

  • 在采用NVIDIA GPU进行训练的时候,可以通过$ watch -n 0.1 nvidia-smi命令时刻观察GPU显存和利用率情况,只有当GPU 利用率处于高位的时候GPU才是在高效的工作,否则大部分时间都是在闲置,而这一般是由于数据读取过慢导致的。可以通过自己实现多线程读数据或者采用tensorflow、pytorch等框架提供的并行读数据的方法让GPU保持较高利用率,从而减少GPU等待时间,降低整体训练耗时。

5. 混合精度训练

  • 通常参数都是采用float32进行计算的,而将参数保存为float16格式理论上能加快一倍的训练速度并且节省一倍的模型大小,同时精度损失不会太多,这就是混合精度训练方法。具体细节可以参照常见的深度学习框架提供的混合精度训练包。

加快模型训练速度的价值

最后简单说一下为什么应该关注模型训练速度。

  • 提高效率。不管是对于科研还是比赛,亦或者是实际的工作,模型的产出速度都极大的影响了实验的效率,有人需要一周才能出一个模型,而通过上述策略加快模型训练速度,可以将该时间降低到1天或者更快,这其中的价值不言自明。
  • 省钱。不管是企业还是高校实验室,GPU显卡或是买来的,或是租来的。如果采用的是腾讯云的GPU服务器,腾讯云和阿里云常被选择的企业级的GPU服务器价格通常是20,000~30,000/月,按照20,000/月计算每小时租金为28元,如果产出一个模型需要7天,那么一个模型的成本是4,704元,按照每10个模型产出一个有效模型来算,那么一个有效模型的成本就是47,040元,如果将模型训练时间缩短三倍,那么一个有效模型成本就缩短到了15,680元,节省31,360元,按照100个研究员/工程师每个月产出两个有效模型,每100个研究员/工程师一个月就节省了6,272,000元,也就是六百多万,不得不说AI部门的运营成本是真滴高。
  • 提高效率,节省时间。对于在校生做研究、打比赛来说,提高效率和模型产出,就能有更多实验数据和做更多尝试,或许paper就发出来了,比赛就拿名次了。对于企业来说,本质上还是省钱,把用人成本、运营成本都算上,提高效率就是大把大把的省钱。

所以,做实验的时候一定要考虑好效率问题,提高模型的训练速度。

博主会持续更新一些深度学习相关的基础知识以及工作中遇到的问题和感悟,喜欢请关注、点赞、收藏,感谢大家。

你可能感兴趣的:(深度学习,机器学习,人工智能,深度学习)