混合精度训练,FP16加速训练,降低内存消耗

news2024/11/28 6:27:27
  • 计算机中的浮点数表示,按照IEEE754可以分为三种,分别是半精度浮点数、单精度浮点数和双精度浮点数。三种格式的浮点数因占用的存储位数不同,能够表示的数据精度也不同。

    • 在这里插入图片描述

    • Signed bit用于控制浮点数的正负,0表示正数,1表示负数;

    • Exponent部分用于控制浮点数的大小,以2为底进行指数运算;

    • Significand部分用于控制浮点数的精度,存储浮点数的有效数字。

  • 默认深度学习模型训练过程中都是使用fp32

  • 使用fp16能带来什么好处:

    • 减少显存占用:现在模型越来越大,当你使用Bert这一类的预训练模型时,往往显存就被模型及模型计算占去大半,当想要使用更大的Batch Size的时候会显得捉襟见肘。由于FP16的内存占用只有FP32的一半,自然地就可以帮助训练过程节省一半的显存空间。

    • 加快训练和推断的计算:与普通的空间时间Trade-off的加速方法不同,FP16除了能节约内存,还能同时节省模型的训练时间。在大部分的测试中,基于FP16的加速方法能够给模型训练带来多一倍的加速体验。

    • 张量核心的普及:硬件的发展同样也推动着模型计算的加速,随着Nvidia张量核心(Tensor Core)的普及,16bit计算也一步步走向成熟,低精度计算也是未来深度学习的一个重要趋势。

    • x = F P 16 ( ( − 1 ) S i g n e d ∗ 2 E x p o n e n t − 15 ∗ ( 1 + S i g n i F i c a n d 2 10 ) ) x=FP16((-1)^{Signed}*2^{Exponent-15}*(1+\frac{SigniFicand}{2^{10}})) x=FP16((1)Signed2Exponent15(1+210SigniFicand))

    • x = F P 32 ( ( − 1 ) S ∗ 2 E − 127 ∗ 1. S F ) x=FP32((-1)^S*2^{E-127}*1.SF) x=FP32((1)S2E1271.SF)

    • x = F P 64 ( ( − 1 ) S ∗ 2 E − 1023 ∗ 1. S F ) x=FP64((-1)^S*2^{E-1023}*1.SF) x=FP64((1)S2E10231.SF)

    • FP16最大值为0 11110 1111111111,其计算方式为

      • ( − 1 ) 0 ∗ 2 30 − 15 ∗ 1.1111111111 = 1 ∗ 2 15 ∗ ( 1 + 2 − 1 + 2 − 2 + . . . + 2 − 10 ) = 65504 (-1)^0*2^{30-15}*1.1111111111\\ =1*2^{15}*(1+2^{-1}+2^{-2}+...+2^{-10})\\ =65504 (1)0230151.1111111111=1215(1+21+22+...+210)=65504
    • 如果 Exponent 位全部为0:

      • 如果 Significand位 全部为0,则表示数字 0
    • 如果 Exponent 位全部位1:

      • 如果 fraction 位 全部为0,则表示 ±inf

      • 如果 fraction 位 不为0,则表示 NAN

  • 使用fp16能带来什么问题:

    • 溢出错误

      • 半精度浮点数有两个字节存储。由于FP16的动态范围比FP32的动态范围要狭窄很多,因此在计算过程中很容易出现上溢出(Overflow )和下溢出(Underflow)的错误,溢出之后就会出现“Nan”的问题。在深度学习中,由于激活函数的的梯度往往要比权重梯度小,更易出现下溢出的情况。

      • 表示范围

        • 运算结果大于最大正数时称为正上溢,小于绝对值最大负数时称为负上溢,正上溢和负上溢统称上溢。数据一旦产生上溢,计算机必须中断运算操作,进行溢出处理

        • 当运算结果在0至最小正数之间时称为正下溢,在0至绝对值最小负数之间时称为负下溢,正下溢和负下溢统称下溢。 数据下溢时,浮点数值趋于零,计算机仅将其当作机器零处理

        • 在这里插入图片描述

    • 舍入误差

      • Rounding Error指示是当网络模型的反向梯度很小,一般FP32能够表示,但是转换到FP16会小于当前区间内的最小间隔,会导致数据溢出。如0.00006666666在FP32中能正常表示,转换到FP16后会表示成为0.000067,不满足FP16最小间隔的数会强制舍入。

      • 解决方案

        • 输入FP16的数据,部分运算继续使用FP16计算,得到FP16结果

        • 将部分运算转成 FP32类型进行计算,得到 FP32中间结果

        • 输出时将所有的FP32数据转换为FP16

  • 混合精度训练,指代的是单精度 float和半精度 float16 混合训练。为了想让深度学习训练可以使用FP16的好处,又要避免精度溢出和舍入误差。于是可以通过FP16和FP32的混合精度训练(Mixed-Precision),混合精度训练过程中可以引入权重备份(Weight Backup)、损失放大(Loss Scaling)、精度累加(Precision Accumulated)三种相关的技术。

  • 权重备份(Weight Backup)

    • 权重备份主要用于解决舍入误差的问题。其主要思路是把神经网络训练过程中产生的激活activations、梯度 gradients、中间变量等数据,在训练中都利用FP16来存储,同时复制一份FP32的权重参数weights,用于训练时候的更新。

    • 在计算过程中所产生的权重weights,激活activations,梯度gradients等均使用 FP16 来进行存储和计算,其中权重使用FP32额外进行备份。

    • 深度模型中,lr * gradent的参数值可能会非常小,利用FP16来进行相加的话,则很可能会出现舍入误差问题,导致更新无效。因此通过将权重weights拷贝成FP32格式,并且确保整个更新过程是在 fp32 格式下进行的。即:

      • w e i g h t 32 = w e i g h t 32 + l r ∗ g r a i d e n t 16 weight_{32}=weight_{32}+lr * graident_{16} weight32=weight32+lrgraident16
    • 权重用FP32格式备份一次,那岂不是使得内存占用反而更高了呢?是的,额外拷贝一份weight的确增加了训练时候内存的占用。 但是实际上,在训练过程中内存中分为动态内存和静态内容,其中动态内存是静态内存的3-4倍,主要是中间变量值和激活activations的值。而这里备份的权重增加的主要是静态内存。只要动态内存的值基本都是使用FP16来进行存储,则最终模型与整网使用FP32进行训练相比起来, 内存占用也基本能够减半

  • 损失缩放(Loss Scaling)

    • 如果仅仅使用FP32训练,模型收敛得比较好,但是如果用了混合精度训练,会存在网络模型无法收敛的情况。原因是梯度的值太小,使用FP16表示会造成了数据下溢出(Underflow)的问题,导致模型不收敛。于是需要引入损失缩放(Loss Scaling)技术。

    • 为了解决梯度过小数据下溢的问题,对前向计算出来的Loss值进行放大操作,也就是把FP32的参数乘以某一个因子系数后,把可能溢出的小数位数据往前移,平移到FP16能表示的数据范围内。根据链式求导法则,放大Loss后会作用在反向传播的每一层梯度,这样比在每一层梯度上进行放大更加高效

  • 精度累加(Precision Accumulated)

    • 在混合精度的模型训练过程中,使用FP16进行矩阵乘法运算,利用FP32来进行矩阵乘法中间的累加(accumulated),然后再将FP32的值转化为FP16进行存储。简单而言,就是利用FP16进行矩阵相乘,利用FP32来进行加法计算弥补丢失的精度。这样可以有效减少计算过程中的舍入误差,尽量减缓精度损失的问题

再将FP32的值转化为FP16进行存储**。简单而言,就是利用FP16进行矩阵相乘,利用FP32来进行加法计算弥补丢失的精度。这样可以有效减少计算过程中的舍入误差,尽量减缓精度损失的问题

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

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

相关文章

MAC地址IP地址 端口

网络结构: 服务器-客户机(C/S)Client-Server结构,如QQ,LOL都拥有客户端 优点:响应速度快,形式多样,安全新较高缺点:安装软件和维护,不能跨平台LINUX/windows/MAC浏览器-…

C语言——柔性数组

目录0. 前言1. 思维导图2. 柔性数组的特点3. 柔性数组的使用4. 柔性数组的优势5. 结语0. 前言 柔性数组是在C99标准时引入: 结构中的最后一个元素允许是未知大小的数组,这就叫柔性数组成员。 代码示例: typedef struct flexible_arr {int a…

leetcode 1011. Capacity To Ship Packages Within D Days(D天内运送包裹的容量)

数组的每个元素代表每个货物的重量,注意这个货物是有先后顺序的,先来的要先运输,所以不能改变这些元素的顺序。 要days天内把这些货物全部运输出去,问所需船的最小载重量。 思路: 数组内数字顺序不能变,就…

【Storm】【一】简介

介绍 1.1 简介 Storm 是 Apache 旗下免费开源的分布式实时计算框架。Storm可以轻松、可靠地处理无限数据流,对实时分析、在线机器学习、连续计算、分布式RPC,ETL等提供高效、可靠的支持。 1.2 什么是分布式计算 分布式计算,将一个任务分解…

云解析专家解密《狂飙》剧中京海市人民政府域名访问真相

这段时间,最火的国产剧当属《狂飙》无疑。尽管不久前迎来了大结局,但这部剧的热度依然不减,成为大家茶余饭后热议的话题。 出于对这部剧的喜爱,小编开启了二刷模式,在重温剧情的同时,对于其中的一些细节也…

Windows 10注册表损坏怎么办?

注册表是一个复杂的数据库,如果不进行维护,它就会填充损坏的和孤立的注册表项。尤其是对Windows进行升级时,损坏或丢失的注册表项也会不断累积,从而影响您的系统性能。如果您的Windows 10系统正在经历注册表损坏的问题&#xff0c…

SpringBoot(powernode)

SpringBoot(powernode) 目录SpringBoot(powernode)一、第一个SpringBoot项目二、打jar包启动测试三、个性化banner四、常用注解4.1回顾spring和java的注解4.1.1 spring标注类的注解:4.1.2 spring标注方法的注解&#x…

linux的文件权限介绍

文件权限 在linux终端输入 ls -lh 出现下面界面 介绍 基本信息 其中的开头代表着文件类型和权限 而 root 和kali 则分别代表用户名和用户组名用户名顾名思义就是这个文件属于哪一个用户用户组是说自己在写好一个文件后,这个文件是属于该用户所有,…

剑指 Offer 63. 股票的最大利润

剑指 Offer 63. 股票的最大利润 难度:middle\color{orange}{middle}middle 题目描述 假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少? 示例 1: 输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 …

尚硅谷《Redis7》(小白篇)

尚硅谷《Redis7 》(小白篇) 02 redis 是什么 官方网站: https://redis.io/ 作者 Git Hub https://github.com/antirez 03 04 05 能做什么 06 去哪下 Download https://redis.io/download/ redis中文文档 https://www.redis.com.cn/docu…

详解量子计算:相位反冲与相位反转

前言 本文需要对量子计算有一定的了解。需要的请翻阅我的量子专栏,这里不再涉及基础知识的科普。 量子相位反冲是什么? 相位反转(phase kickback)是量子计算中的一种现象,通常在量子算法中使用,例如量子…

亲测实现PopupWindow显示FlowLayout流式布局带固定文本/按钮(位置可改)

实现:动态绘制并带固定文本/按钮,固定文本/按钮固定在最后一行的右边且垂直居中,若最后一行放不下,则新开一行放到新行的右边且垂直居中(新行的行高跟前面的一样),可单选、多选、重置。 注&…

SQL零基础入门学习(六)

SQL零基础入门学习(六) SQL零基础入门学习(五) SQL 通配符 通配符可用于替代字符串中的任何其他字符。 SQL 通配符用于搜索表中的数据。 在 SQL 中,可使用以下通配符: 演示数据库 在本教程中&#xff…

robotframework自动化测试环境搭建

环境说明 win10 python版本&#xff1a;3.8.3rc1 安装清单 安装配置 selenium安装 首先检查pip命令是否安装&#xff1a; C:\Users\name>pipUsage:pip <command> [options]Commands:install Install packages.download Do…

掌握这10个测试方法,软件测试已登堂入室

当然还有很多测试方法&#xff0c;这些要根据实际不同应用场景而变化&#xff0c;这里就以键盘为例子进行测试方法的讲解。 1.需求测试 需求这种大家都知道这种主要是就是甲方或者项目经理写的&#xff0c;或者某些人需要什么我们就给什么&#xff0c;一般来讲一个东西给到…

API 接口应该如何设计?如何保证安全?如何签名?如何防重?

说明&#xff1a;在实际的业务中&#xff0c;难免会跟第三方系统进行数据的交互与传递&#xff0c;那么如何保证数据在传输过程中的安全呢&#xff08;防窃取&#xff09;&#xff1f;除了https的协议之外&#xff0c;能不能加上通用的一套算法以及规范来保证传输的安全性呢&am…

训练一个ChatGPT需要多少数据?

“风很大”的ChatGPT正在席卷全球。作为OpenAI在去年底才刚刚推出的机器人对话模型&#xff0c;ChatGPT在内容创作、客服机器人、游戏、社交等领域的落地应用正在被广泛看好。这也为与之相关的算力、数据标注、自然语言处理等技术开发带来了新的动力。自OpenAI发布ChatGPT以来&…

好用的SQL工具盘点:从学习到工作总有一款适合你

标题一.入坑阶段&#xff08;学习入门&#xff09;&#xff1a; 这个阶段一般就是小白&#xff0c;想学习SQL语言&#xff0c;然后到处找软件&#xff0c;找免费破解版找半天&#xff0c;找到了半天安装不下来&#xff0c;还可能把自己电脑搞中毒。 其实对于小白来说&#xf…

Shiro常用的Filter过滤器

Shiro常用的Filter过滤器 核心过滤器&#xff1a;DefaultFilter&#xff0c;配置了的相应路径的相应的拦截器进行处理 常用过滤器 authc&#xff1a;org.apache.shiro.web.filter.authc.FormAuthenticationFilter 需要认证登录才能访问 user&#xff1a;org.apache.shiro.w…

动作识别、检测、分割、解析相关数据集介绍

文章目录动作识别UCF101(UCF101 Human Actions dataset)Kinetics (Kinetics Human Action Video Dataset)动作检测 / 时序动作定位CharadesActivityNetMulti-THUMOSUCF101-24IKEA ASM动作分割Breakfast (The Breakfast Actions Dataset)GTEA (Georgia Tech Egocentric Activity…