混合精度是如何加速大模型训练的?

news2025/1/21 20:32:19

混合精度是如何加速大模型训练的?

  • 基础知识回顾
    • float-32
    • 从float-32 到float-16
  • 混合精度计算
  • bfloat16

基础知识回顾

float-32

在深度学习中,通常使用float-32 精度的数值训练模型,其中pytorch默认的也是float-32。
float32,也就是32位单精度浮点数,表示一个浮点数需要使用32位二进制数来表示。其中,这32位按照特定的规则分为了不同的部分,用于表示符号、指数和尾数,具体如下:

  1. 符号位(sign bit):占用1个二进制位(bit),用于表示该浮点数的正负性,0表示正数,1表示负数。
  2. 指数位(exponent bit):占用8个二进制位(bit),用于表示指数部分,包括指数的符号和大小。
  3. 尾数位(mantissa bit):占用23个二进制位(bit),用于表示尾数部分,即小数部分。

根据IEEE 754标准,32位单精度浮点数的格式为S EEEEEEEE MMMMMMMMMMMMMMMMMMMMM,其中S表示符号位,EEEEEEEE表示指数位,MMMMMMMMMMMMMMMMMMMMMM表示尾数位。这种格式的表示范围是从约-3.4×1038到约3.4×1038之间的浮点数,并且精度达到6-7位有效数字。
计算方式如下:
在这里插入图片描述

在通常的科学计算中,都是以float-64精度(也就是double)计算的,它用来表示数值的位数更多,精度更大,损失更小,在深度学习中为什么我们很少用float-64而是去采用?

  1. 因为使用float32,可以节省更多的内存,可以设置更大的batchsize。
  2. 模型训练速度更快,更快的得到实验结果。

从float-32 到float-16

在这里插入图片描述

下面是各个精度的对比:
在这里插入图片描述

在训练中,我们从float-64到float32往往不会造成很大的损失,但是当我们从32转到16位,就会造成训练不稳定,无法收敛。主要是由于数值精度不够,造成了数值的上溢或者下溢。
具体如下所示:
在这里插入图片描述

32为的最大数值是:340,282,000,000,000,000,000,000,000,000,000,000,000
16位则是:
65504

混合精度计算

在这里插入图片描述

  1. 首先把32位参数转化为16位,进行forward pass然后计算各个参数对loss的gradients。
  2. 通过16位 weight得到16位的gradients。
  3. 然后把16位的gradients转换成32位。
  4. 把32位gradients与lr相乘得到移动的步伐
  5. 32位原始参数-步伐得到新的32位参数。

实验
在这里插入图片描述
这里我们发现,混合精度的在测试集上面的表现要比32还高,原因可能与batch小一点是一个道理,引入了一些误差,起到了正则化的效果。

bfloat16

在这里插入图片描述
与传统float16格式相比,Bfloat16扩展了动态范围,但代价是降低了精度。
扩展的动态范围帮助bfloat16表示非常大和非常小的数字,使其更适合可能遇到大范围值的深度学习应用程序。但是,较低的精度可能会影响某些计算的准确性,或者在某些情况下导致舍入误差。但在大多数深度学习应用中,这种降低的精度对建模性能的影响微乎其微。
虽然bfloat16最初是为tpu开发的,但这种格式现在也被一些NVIDIA gpu所支持,从NV的一部分A100 Tensor Core gpu开始.

实验:
在这里插入图片描述

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

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

相关文章

每日一练 | 华为认证真题练习Day43

1、关于访间控制列表编号与类型的对应关系,下面描述正确的是()。 A. 基本的访问控制列表编号范围是1000-2999 B. 二层的访问控制列表编号范围是4000-4999 C. 高级的访间控制列表编号范围是3000-4000 D. 基于接口的访问控制列表编号范围是…

IO + File 详细基础知识

文章目录 IO File一、 File二、IO流2.0 IO流介绍2.1 字节流2.1.1 字节输出流 - FileOutputStream2.1.1.1 write方法2.1.1.2 字节输出流细节2.1.1.3代码实现2.1.1.4 换行与续写 2.1.2 字节输入流 - FileInputStream2.1.2.1 read()方法2.1.2.2 字节输入流细节2.1.2.3 代码实现 2…

PostgreSQL-分布式事务之两阶段提交

什么是ACID 在日常操作中,对于一组相关操作,通常需要其全部成功或全部失败。 在关系型数据库中,将这组相关操作称为“事务”。 在一个事务中,多个插入、修改、删除操作要么全部成功,要么全部失败,这称为…

SpringCloud Nacos 注册配置中心

前言 在微服务架构中,注册中心是核心的基础服务之一。相信不少同学都用过 Dubbo 这个流行分布式框架,很久之前微服务还没这么盛行,Dubbo就提供了比较完善的服务治理功能,而服务治理的实现主要依靠的就是注册中心。 许多同学接触…

Apache Kafka - 生产者内存优化注意事项

文章目录 1. 调优内存池参数2. 限制客户端生产速率3. 减小单条消息大小4. 监控生产者内存和性能5. 评估topic的partition分布6. 增加更多生产者实例7. Kafka升级和更强劲的硬件小结 1. 调优内存池参数 增大batchSize和linger ms,适当延长消息在内存池的最大延迟,减少发送次数。…

【C++初阶】第十二篇:priority_queue的使用与模拟实现

文章目录 priority_queue的使用priority_queue的介绍priority_queue的定义方式priority_queue各个接口的使用 仿函数代码样例使用场景(示例) priority_queue的模拟实现堆的向上调整算法堆的向下调整算法priority_queue的模拟实现 总结 priority_queue的使…

redis:基于 Streams 的消息队列

前言 Redis 5.0 及 5.0 以后的版本提供的Streams 是专门为消息队列设计的数据类型,它提供了丰富的消息队列操作命令。 消息队列 Streams 操作 XADD:插入消息,保证有序,可以自动生成全局唯一 ID; 名称为 mqstream 的…

【第七章:输入输出系统】

目录 知识框架No.0 引言No.1 输入输出系统一、基本概念二、I/O控制方式1、主机如何与I/O设备进行交互?2、CPU是如何通过I/O接口与外设交互的3、如何判断读入的数据有没有被输入完成呢?4、对于快速I/o设备,如“磁盘”,每准备好一个字就给CPu发…

【C语言】操作符详解(下)

操作符详解 1.条件操作符2. 逗号表达式3.下标引用,函数调用和结构体成员4.表达式求值4.1隐式类型转换4.2算术转换 5.操作符的属性 所属专栏:C语言 博主首页:初阳785 代码托管:chuyang785 感谢大家的支持,您的点赞和关注…

原生js手动实现一个多级树状菜单效果(高度可过渡变化) + 模拟el-menu组件实现(简单版)

文章目录 学习链接效果图代码要点 简单模拟el-menu实现TestTree.vueMenu.vueSubMenu.vue 学习链接 vue实现折叠展开收缩动画 - 自己的链接 elment-ui/plus不定高度容器收缩折叠动画组件 - 自己的链接 Vue transition 折叠类动画自动获取隐藏层高度以及手风琴效果实现 vue t…

Sqoop: Hadoop数据传输的利器【Sqoop实战】【上进小菜猪大数据系列】

我是上进小菜猪,沈工大软件工程专业,爱好敲代码,持续输出干货,欢迎关注。 Sqoop: Hadoop数据传输的利器, 在大数据领域,数据的传输和集成是至关重要的任务之一。Sqoop(SQL to Hadoop)作为Apache…

ChatGPT的前世今生,到如今AI领域的竞争格局,本文带你一路回看!

73年前,“机器思维”的概念第一次被计算机科学之父艾伦图灵(Alan Turing)提出,从此,通过图灵测试成为了人类在AI领域为之奋斗的里程碑目标。 73年后的今天,在AI历经了数十年的不断进化、迭代后&#xff0c…

【第二章:数据的表示和运算】

目录 知识框架No.0 引言No.1 数制与编码一、进位计数制及其相互转换二、BCD码三、无符号的整数在计算机内部表示和运算1、表示2、加法、减法实现 四、带符号的整数在计算机内部表示和运算1、表示1.1、原码表示1.2、原码形式实现加减法运算不行1.3 补码表示1.4 补码实现加法运算…

分享一个图片展示特效

先上效果图&#xff1a; 备注&#xff1a;这个效果图太大了&#xff0c;压缩了一下效果有点不咋好看。感兴趣同学们可以自己运行代码看一下&#xff0c;保证不会失望~ 再上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta cha…

mysql数据库的表操作 --3

表操作 3.1&#xff1a;创建表 语法&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; 说明&#xff1a; field 表示列名 datatype 表示列的…

Java 数组与List转换

int[] 与 List<Integer> 转换 刷题常见 int[] 转 List<Integer> // int[] 转 List<Integer> int[] arr {1, 2, 3, 4, 5}; List<Integer> list Arrays.stream(arr).boxed().collect(Collectors.toList());解释&#xff1a; Arrays.stream(arr) /…

基于Ant DesignPro Vue + SpringBoot 前后端分离 - 部署后解决跨域的问题

基于Ant DesignPro Vue SpringBoot 前后端分离 - 部署后解决跨域的问题 通过Ant DesignPro Vue SpringBoot 搭建的后台管理系统后&#xff0c;实现了前后端分离&#xff0c;并实现了登录认证&#xff0c;认证成功后返回该用户相应权限范围内可见的菜单&#xff1b;但时将服务…

剑指 Offer II 105. 岛屿的最大面积代码注释

题目&#xff1a; 给定一个由 0 和 1 组成的非空二维数组 grid &#xff0c;用来表示海洋岛屿地图。 一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0&#xff08;代表…

第一章 集合框架

文章目录 什么是集合框架集合接口Set和List的区别 集合实现类&#xff08;集合类&#xff09;集合算法 什么是集合框架 官方教程 Java 集合框架 Java Collection Framework &#xff0c;又被称为容器container&#xff0c;是定义在java.util包下的一组接口 interfaces和其实现…

【华为HCIP | 高级网络工程师】刷题日记(8)

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大二在校生 &#x1f43b;‍❄️个人主页&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;落798. &#x1f54a;️系列专栏&#xff1a;零基础学java ----- 重识c语言 ---- 计算机网络 &#x1f413;每日一…