混合精度训练
论文:https://arxiv.org/pdf/1710.03740.pdf
译文:混合精度训练
摘要
增加神经网络的size,可以提高准确率。但同时,也加大了训练模型所需的内存和计算量。我们介绍一种使用半精度浮点数来训练深度神经网络的方法,不会损失准确率,也不需要修改超参数。这种方法让内存需求减半,而且在最近的GPU上,加速了算术运算。权值、激活值和梯度都以IEEE半精度格式存储。由于半精度的数值范围比单精度小,我们提出3种技术避免关键信息丢失。1)我们维护一份权值的单精度copy,2)我们放大损失,来保留较小的梯度。3)我们证明,前面提出的方法,可以在很多任务和现代大规模模型(超过1亿参数)上,基于大数据集训练。
介绍
深度学习让很多不同的应用都取得了很大的进步,图像识别、语言建模、机器翻译和语音识别等等。这也衍生出两个关键的问题,更大的数据集和更复杂的模型。
更大的模型通常需要更多的计算量和内存来训练。
实现
1、FP32:
在混合精度训练中,权值、激活值和梯度是以FP16存储的。
2、损失放大:
3、算术精度:
总的来说,神经网络算术运算分为3类:向量点乘
结果
Baseline(FP32):激活值、权值和梯度都用单精度存储。所有算术运算也都用FP32。
Mix Precision(MP):存储和算术运算都有用FP16。权值、激活值和梯度都用FP16来存储。权值存一份FP32主copy,用于更新。
总结和后续工作
混合精度训练,让我们减少内存消耗,以及花在算术运算上的时间。我们已经证明,很多深度学习模型可以用这种技术来训练,并且没有准确度损失,也不需要调参。对于小梯度很多的模型,可以采用梯度放大的办法来达到和FP32一样的准确度。
如果DNN运算是受限于内存和算术带宽,那么在Volta架构的GPU上,FP16和FP32的加速比是2~6。如果是受限于延迟,加速比则会小一些。网络训练和推理总的加速比,取决于框架和库对混合精度的优化,这也是后续工作的一个重点(本文实验用的库和框架都比较旧)。
我们会把这个技术应用于生成模型,如文字转语音系统和深度强化学习应用。进一步地,损失放大因子的选择会自动化,来简化混合精度的训练。损失放大因子会根据监控到的权值梯度,动态增大或者减小来防止溢出。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥