混合精度训练(MAP)

一、介绍

使用精度低于32位浮点数的数字格式有很多好处。首先,它们需要更少的内存,可以训练和部署更大的神经网络。其次,它们需要更少的内存带宽,这加快了数据传输操作。第三,数学运算在降低精度的情况下运行得更快,特别是在支持Tensor Core的gpu上。混合精确训练实现了所有这些好处,同时确保与完全精确训练相比,没有任务特定的准确性损失。它通过识别需要完全精度的步骤,并仅对这些步骤使用32位浮点数,而在其他地方使用16位浮点数来实现这一点。

在大模型训练场景中,最占用显存的是中间激活值,而混合精度训练方法是采用半精度保存,显存空间直接减半而且还能加速计算; 中间激活值占用显存的直观感觉如下:
在这里插入图片描述

二、混合精度训练

混合精度训练以半精度格式执行操作,同时以单精度存储最小的信息,以尽可能多地保留网络关键部分的信息,从而显著提高了计算速度。自从在Volta和Turing架构中引入Tensor Cores以来,通过切换到混合精度,可以体验到显著的训练速度提升——在大多数算术密集的模型架构上,总体速度提升了3倍。使用混合精度训练需要两个步骤:

1. 移植模型以在适当的地方使用FP16数据类型。
2. 添加损失缩放以保持小的梯度值。

在Pascal架构中引入了以较低精度训练深度学习网络的能力,并在CUDA 8的NVIDIA深度学习SDK中首次得到支持。

混合精度是指在计算方法中组合使用不同的数值精度。

与更高精度的 FP32 相比,半精度(也称为 FP16)数据与 FP64 相比减少了神经网络的内存使用,允许训练和部署更大的网络,并且 FP16 数据传输比 FP32 或 FP64 传输花费的时间更少。

单精度(也称为 32 位)是一种常见的浮点格式( float 在 C 派生的编程语言中),而 64 位则称为双精度 ( double )。深度神经网络 (DNN) 在许多领域取得了突破,包括:

  • 图像处理和理解
  • 语言建模
  • 语言翻译
  • 语音处理
  • 玩游戏等等

为了实现这些结果,DNN 的复杂性一直在增加,这反过来又增加了训练这些网络所需的计算资源。降低所需资源的一种方法是使用精度较低的算术,它具有以下优点:

减少所需的内存量
精度浮点格式 (FP16) 使用 16 位,而单精度 (FP32) 使用 32 位。降低所需的内存可以训练更大的模型或使用更大的小批量进行训练。

缩短训练或推理时间
执行时间可能对内存或算术带宽敏感。半精度将访问的字节数减半,从而减少了在内存受限层中花费的时间。与单精度相比,NVIDIA GPU 的半精度算术吞吐量提高了 8 倍,从而加快了数学受限层的速度。

图 1.bigLSTM 英语语言模型的训练曲线显示了混合精度训练技术的好处。Y 轴是训练损失。不带损耗缩放的混合精度(灰色)在一段时间后会发散,而带损耗缩放的混合精度(绿色)与单精度模型(黑色)匹配
在这里插入图片描述
由于 DNN 训练传统上依赖于 IEEE 单精度格式,因此本指南将重点介绍如何以半精度进行训练,同时保持以单精度实现的网络精度(如图 1 所示)。这种技术称为混合精度训练,因为它同时使用单精度和半精度表示。

2.1 半精度格式

IEEE 754 标准定义了以下 16 位半精度浮点格式:1 个符号位、5 个指数位和 10 个小数位。

2.2 混合训练的流程

2.2.1 拷贝一份FP32的权重
2.2.2 用较大的值初始化缩放因子S.
2.2.3 进入迭代中:

  • a 生成一份FP16的权重
  • b. 前向传递(FP16权重与中间值)
  • c.计算的loss乘以缩放因子S.
  • d. 反向传递 (FP16权重, 中间激活值, 梯度)
  • e. 如果权重梯度中存在无穷大(Inf)或不是一个数字(NaN):
    1. 减小S的值
    2. 跳过权重更新,并进行下一次迭代。
  • f.将权重梯度乘以1/S
  • g.完成权重更新(包括梯度裁剪等操作)
  • h. 如果在最近的N次迭代中没有出现无穷大或不是一个数字的情况,则增加S的值。

在这里插入图片描述

三、混合精度相关问题

  1. 抓住主要矛盾,目的是减少中间激活的显存占用
  2. 在网络训练的后期,梯度值会变得非常小,缩放loss计算得到梯度后,可以用fp32存储,然后进行unscale,避免学习率*unscale *fp16梯度下溢,流程如下(最好是配上scale因子就更完美了,如果不加scale,会存在fp16的gradients存在下溢的可能):

四、PyTorch实现

from apex import amp
model, optimizer = amp.initialize(model, optimizer, opt_level="O1") # 这里是“欧一”,不是“零一”
with amp.scale_loss(loss, optimizer) as scaled_loss:scaled_loss.backward()

https://docs.nvidia.com/deeplearning/performance/mixed-precision-training/index.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/240266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv5算法改进(23)— 更换主干网络GhostNet + 添加CA注意力机制 + 引入GhostConv

前言:Hello大家好,我是小哥谈。本节课就让我们结合论文来对YOLOv5进行组合改进(更换主干网络GhostNet + 添加CA注意力机制 + 引入GhostConv),希望同学们学完本节课可以有所启迪,并且后期可以自行进行YOLOv5算法的改进!🌈 前期回顾: YOLOv5算法改进(1)— 如何去…

C++类与对象(中)第一篇

目录 前言: 类的六个默认成员函数 构造函数 析构函数 拷贝构造函数 拷贝场景一:函数参数类型为类类型对象 拷贝场景二:利用已存在的对象创建新对象 拷贝场景三:函数返回值类型为类类型对象 前言: 编译器编译类…

推箱子地图库1-49关

推箱子地图库1-49关 49关 local WALL1--{"墙","墙 "}4 10287 local DEST2--{"目的地",""}1 4001100 10157 local BOX3--{"箱子","¥"} 2 2000801 local PLAYER4--{"玩家","&&a…

python依赖包管理

在Python项目中,通常会有一个名为 requirements.txt 的文件,其中列出了项目所需的所有依赖包及其版本。 1. 使用freeze 如果你的项目中没有 requirements.txt 文件,你可以通过下面的命令创建一个当前项目所在环境下已安装的包及其版本的 re…

vue中的生命周期和VueComponent实例对象

生命周期 关于VueComponent 生命周期又叫生命周期钩子&#xff0c;生命周期函数 生命周期是&#xff0c;Vue在关键的时刻帮我们调用的一些特殊名字的函数 生命周期的this指向vm或者组件实例对象 mounted会将初始化的Dom挂载到页面上 <template><div class"he…

vue前端开发中,通过配置,实现多个入口文件的方法

由于vue为单页面项目&#xff0c;通过控制组件局部渲染&#xff0c;main.js是整个项目唯一的入口&#xff0c;整个项目都在一个index.html外壳中。 若项目过大&#xff0c;会造成单页面负载过重&#xff1b;同时&#xff0c;多页面利于模块独立部署。 要单独将页面当成一个项…

react 18 Hooks扩展函数式组件的状态管理

React函数式组件 特点 React函数式组件具有以下特点&#xff1a; 简洁&#xff1a;使用函数的方式定义组件&#xff0c;语法简单直观。无状态&#xff1a;函数式组件没有内部状态&#xff08;state&#xff09;&#xff0c;只依赖于传入的props。可复用&#xff1a;函数式组…

influxdb-cluster集群部署

一.部署环境 * InfluxDB集群节点数&#xff1a;mate服务至少3个节点&#xff0c;节点数越多&#xff0c;集群性能越高。 * 操作系统&#xff1a;支持的操作系统包括Linux、Windows和MacOS。 * CPU&#xff1a;至少2核4线程&#xff0c;主频越高越好。 * 内存&#xff1a;至少8…

基于SSM的大学生兼职平台的设计与实现

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SSM的大学生兼职平台的设计与实现,j…

新疆某职业技术学院,实现对上千台IT设备的集中监控和管理

随着信息化时代的快速发展&#xff0c;IT技术已经成为教育领域不可或缺的一部分。新疆某职业技术学院为了更好地支持教学和科研工作&#xff0c;决定引入监控易管理平台7.0&#xff0c;实现对上千台IT设备的监控管理。通过引入该平台&#xff0c;职业技术学院的IT运维效率和质量…

【已解决】Redis序列化反序列化不一致 - String类型值多了双引号问题

在项目中使用spring 的RedisTemplate从redis中获取数据的时候&#xff0c;发现字符串的value多了双引号。如下图所示&#xff1a; 产生的原因可以分一下几个方面&#xff1a; 一、采用的序列化对象不同 多服务之间调用时候&#xff0c;序列化服务A(向redis中写数据的)和反序…

【翼韵】数据上传沟通、决策、试错

韵达德邦来说说&#xff0c;翼达、翼韵、翼德、翼邦的小记录 翼达同学&#xff1a;沟通成本好大&#xff01; 翼韵同学&#xff1a;决策成本很大&#xff01; 翼德同学&#xff1a;试错成本更大&#xff01; 翼邦同学&#xff1a;你们加起最大&#xff01; QY成本沟通成本33%决…

Win7如何修改MAC地址

MAC地址&#xff0c;又叫做物理地址、硬件地址&#xff0c;是用来定义网络设备的位置&#xff0c;一般情况下&#xff0c;MAC地址在网卡中是固定的&#xff0c;但不排除有人手动去修改自己的MAC地址。win7如何修改MAC地址?其实修改MAC地址的方法很简单&#xff0c;可以通过硬件…

K8s出现问题时,如何排查解决!

K8s问题的排查 1. POD启动异常、部分节点无法启动pod2. 审视集群状态3. 追踪事件日志4. 聚焦Pod状态5. 检查网络连通性6. 审视存储配置7. 研究容器日志8. K8S集群网络通信9. 问题&#xff1a;Service 是否通过 DNS 工作&#xff1f;10. 总结1、POD启动异常、部分节点无法启动p…

普通Java项目打包可执行Jar

普通Java项目打包 IDEA配置 在项目配置中选择 Artifacts -> JAR -> From modules with dependencies 选择项目模块&#xff0c;程序主类、依赖引入方式、清单文件位置 确认Jar名称和Jar输出目录 通过 Build -> Build Artifact -> Build 打包Jar文件 Java打包可执…

JavaWeb笔记之SVN

一、版本控制 软件开发过程中 变更的管理&#xff1b; 每天的新内容;需要记录一下&#xff1b; 版本分支;整合到一起&#xff1b; 主要的功能对于文件变更的追踪&#xff1b; 多人协同开发的情况下,更好的管理我们的软件。 大型的项目;一个团队来进行开发; 1: 代码的整合 2: 代…

Kubernetes 100个常用命令!

这篇文章是关于使用 Kubectl 进行 Kubernetes 诊断的指南。 列出了 100 个 Kubectl 命令&#xff0c;这些命令对于诊断 Kubernetes 集群中的问题非常有用。这些问题包括但不限于&#xff1a; • 集群信息 • Pod 诊断 • 服务诊断 • 部署诊断 • 网络诊断 • 持久卷和持久…

2023-强网杯-【强网先锋-ez_fmt】

文章目录 ez_fmt libc-2.31.so检查main思路exp 参考链接 ez_fmt libc-2.31.so 检查 没有地址随机化 main 简单粗暴的printf格式化字符串漏洞 思路 泄露地址&#xff0c;覆盖返回地址形成ROP链 printf执行时栈上存在__libc_start_main243的指令的地址&#xff0c;可以泄露…

JAVA面试题17

Java中的日 12-21 15:09 继续 志&#xff08;Logging&#xff09;是什么&#xff1f; 它有什么作用&#xff1f; 答案&#xff1a;日志是程序运行过程中产生的记录和反映&#xff0c;用于帮助程序员理解程序的运行情况和问题。Java中的日志机制可以通过Java标准库自带的java.u…

C++哈希表的实现

C哈希表的实现 一.unordered系列容器的介绍二.哈希介绍1.哈希概念2.哈希函数的常见设计3.哈希冲突4.哈希函数的设计原则 三.解决哈希冲突1.闭散列(开放定址法)1.线性探测1.动图演示2.注意事项3.代码的注意事项4.代码实现 2.开散列(哈希桶,拉链法)1.概念2.动图演示3.增容问题1.拉…