感觉这个问题是年经贴(´-ω-`)
题主提到transformer,那我也针对transformer给点小显存设定下的训练trick吧,好久没去魔改其他模型的结构了qaq
ps:对视觉Transformer了解不深,本文仅从NLP领域的经典Transformer入手来分享一些tricks
从节省(训练)显存方法的有效性/性价比上排个序的话:
1. 砍输入的max len
2. 砍hidden size
3. 砍num layers
4. recompute
5. sharding
6. 小batch size+梯度累积
如果要考虑从预训练模型热启的话,可以去掉2,其他排序不变
为啥最推荐前俩呢,因为不用写代码哇...改改参数,训练显存占用平方级降低,注意是平方级!因此砍一半max seq len和砍一半hidden size比砍一半层数来的有效很多。
只不过砍一半hidden size就不好load预训练模型了,所以优先砍max len吧……
如果非要纠结模型能处理的最大输入长度,可以前90%的训练steps砍输入长度,后10%砍bs艰难finetune下position embedding。这也是预训练常用trick(虽然亲测也会损失一些模型的长文本处理performance)
4和5就是训练大型模型的标配技术了,主流深度学习框架基本都内置了API,调用还是相对方便的,而且不会损失太多训练速度
6就是兜底的办法了,需要写一些代码外加训练慢....
当然了,以上trick可以叠加混合使用,拿好不谢(^-^)
此外,还有一些不方便公开的内部黑科技就不写出来啦,感兴趣的小伙伴欢迎私信发我简历,组内还有实习head count噢!
坐标:北京,百度科技园
方向:NLP、搜索