| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 一种增大Batch的训练方法,低显存GPU也能加载更大的Batch -> 正文阅读 |
|
[人工智能]一种增大Batch的训练方法,低显存GPU也能加载更大的Batch |
?炼丹药的迷惑 相信各位丹友在炼丹期间都会遇到各种各样的问题,有些问题查查资料,做做实验就解决了,有些问题可能还是需要等大佬们去解决。本人在炼丹期间,就遇到了一个问题,这里简单分享一下,一般我们训练模型的时候,选择一个较大的Batch加载训练数据是一个高效训练的方法,当然也不是说Batch越大就越好,一个合适的Batch size对于模型训练才是最好的选择。如果输入是高分辨率图像的时候,由于显存的限制,batch就会变得很小,而且GPU显存总是告急,但是GPU计算资源却大量冗余。如何在加载大分辨率图像的时候增大Batch,有效的利用计算资源,是我们需要解决的问题。 一般当图像分辨率较小的时候,我们不会过于担心训练过程中Batch size的设置问题,由于图像分辨率较小,加载较大Batch不会出现显存不够用的情况,但是当遇到较大分辨率的图片做为训练数据的时候,情况就不一样了,这时候往往会需要更大显存来加载数据,模型训练中一般会出现一次加载的Batch极度变小的情况,这无疑加大了模型的训练时间,对于加了BN层的模型来说还会影响到训练效果。比如在训练YOLO模型的时候,当图像的大小达到了640*640,在6G的显存上一次只能加载几张图片。而对于训练一个泛化性能较好的模型,往往需要更大的数据集来学习,一边是捉襟见肘的显存,一边是更大的训练数据集,显而易见,扩大显存已经是迫在眉睫。 增加显存最好的方法,是更换更大显存的GPU,但是这种从硬件上直接下手的方法不是谁都有这个资本的,毕竟显卡是用真金白银换来的,所以最好办法是从模型上下手去操作。我们在训练大分辨率的图像数据的时候,最容易出现的情况就是一边是显存溢出,一边算力闲置。 所以联想到能否以闲置的计算资源来换取匮乏的显存呢?其实大佬们早以为我们提供了方法。 大批量的炼药方法 2020年6月17日发布的论文《Dynamic Tensor Rematerialization》全面论述了以计算资源换取显存的可行性。该论文在此后的时间了进行了几次改进,直到2021年3月18日出现了V4版本,论文也提供了pytorch中的使用方法。论文介绍中也简单的阐述了基本的实现思路:
?基本操作就是使用GPU的计算资源换取神经网络每次前向传播过程中的部分中间缓存值,简而言之,就是以GPU的计算力换取GPU的显存空间,从而加载更大的batch。具体做法就是释放模型中的部分前向激活输出值,等后向传播的时候再从当前节点的上一层重新计算一次该层的输出,而不是一直保存在显存中,这样就等于提前释放了这部分显存空间,等下一次加载新的数据的时候就可以加载更大的batch。 下图是正常的模型前向和后向运行过程中每个节点的张量释放情况: 下图是使用了以计算资源来换取显存后的模型每个节点的张量释放情况: 关于释放哪一部分缓存值才是最高效的替代方法,也有一定的讲究。具体来说满足以下三个需求即可: ①被释放后需要重新计算的张量对于GPU的开销越小越好 ②被释放的张量占用的显存越大越好 ③被释放的张量在显存中占用的时间越长越好 ? 其中,H localDTR为被释放的最优张量;C0(t)为重新计算张量时该算子运行的时长,运行时间越短对于GPU的开销越小;s(t)是张量进入显存的时长,越长越好;m(t)是张量占用的内存,越大越好。
? 论文中比较了不同模型上的不同方法,比较了不同预算(原始峰值内存使用量的一小部分)的计算减速率。每个图中的黑色区域对应于存储输入和权重所需的内存,而灰色区域表示需要同时使用最多内存的单个操作符。虚线和虚线分别表示抖动和内存不足错误之前的最后一个比率。 以下是论文中对于使用DTR前后的显存情况对比: 此外,论文中还提出了DTR的三种变种体:DTR-Full、DTR-EqClass、DTR-Local,对于3种主要hDT R变体,通过不同的内存比率比较启发式评估和元数据维护引起的总存储访问。 关于tensorflow和pytorch上的使用方法:https://github.com/merrymercy/dtr-prototype 最后祝大家在炼丹的路上越走越好,有什么好的方法也可以互相讨论。 关注微信公众号:深度人工智能学院,获取更多人工智能方面的知识! ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? 官方公众号? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 官方微信号 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 6:29:38- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |