当前位置: 首页 > article >正文

人工智能算力FP32、FP16、TF32、BF16、混合精度解读

de94325234483a4035ca41ff58655cf0.jpeg 

彻底理解系列之:FP32、FP16、TF32、BF16、混合精度

   

随着大模型的涌现,训练和推理速度成为关键。为提升速度,需减小数据长度以降低存储和带宽消耗。为此,我专注学习并整理了各种精度细节,确保深入理解而非浅尝辄止。

1 从FP32说起

计算机处理数字类型包括整数类型和浮点类型,IEEE 754号标准定义了浮点类型数据的存储结构。一个浮点数由三部分组成:符号位、指数位和尾数位。其中,以最常见的FP32(Float Point 32)为例,其符号位占1位,指数位占8位,尾数位占23位 。

809215fe7bd4dc462be163a349bca6b9.jpeg

图1. FP32位数分配,来源[2]

  • Sign:最高位用1位表示符号位,1表示负数,0表示正数,记为S
  • Exponent:中间8位表示指数位,记为E
  • Mantissa:低位23位表示小数部分,记为M

我们以十进制数9.625为例,看看十进制和FP32二进制之间如何转换:

十进制--》二进制

先分为整数部分9和小数部分0.625。

将9转换为二进制1001,然后通过乘以2并取整数部分的方式得到0.625。接着,将剩余的小数部分0.625再乘以2并取整数部分,如此循环,最终得到0.101。将这两个结果相加,即1001.101,转换为二进制指数形式为1.001101 * 2^3。

根据IEEE 754标准,FP32的指数部分需要加上127以进行偏移,调整为3+127=130。对应的二进制表示为10000010,小数部分补齐至23位后,符号位为0。将这三部分组合起来,便得到了FP32的表示。

0 10000010 00110100000000000000000。

1a183ef532c880952d2b125992522465.jpeg

图2. FP32转换工具,来源[3]

二进制--》十进制

将二进制分为S、E、M三部分,将FP32转换为十进制的方法如下:

$S=B_2+B_1+...+B_0$

$E=G_2+G_1+...+G_0$

$M=P_2+P_1+...+P_0$

51d18df27372cf0a3749eb34374c8a6e.jpeg

文章内容经过优化后如下:
"其中,1.M表示小数部分的二进制表示。以S=0,E二进制10000010转为十进制为130为例,M为00110100000000000000000。去掉小数部分后面的无用零后,得到1.M实际上是二进制的1.001101,转换为十进制就是:×"

5a44f071dcb3fbbea50ad272c5f646d2.jpeg

顺利还原回了十进制数。

FP32搞清楚了,FP16、FP64类似,只是指数位和小数位的长度不一样:


2 模型训练中不同精度的问

降低存储负担:提高训练显存利用率至FP32,实现一半存储占用,从而在有限的GPU资源下训练更大模型或提高batch_size。

FP16和FP32都是深度学习中常用的数值表示方式。FP16是16位浮点数表示法,即半精度浮点数,用一个16位的数值来表示实数,包括1位符号位、5位指数位和10位尾数位。FP16的精度比FP32低,但计算速度快,内存占用小,因此在深度学习中常用于加速训练和推理。FP32是32位浮点数表示法,即单精度浮点数,用一个32位的数值来表示实数,包括1位符号位、8位指数位和23位尾数位。FP32是深度学习中最常用的数值表示方式之一,因为它提供了足够的精度和计算速度,同时也相对容易实现。

但是,是否意味着我们都使用FP16就行了呢?当然不是。主要原因是位数少同时有两个劣势:(1)精度较低;(2)存储空间较大。

  1. 位数少时精度比位数多时低,可能导致准确度不够;
  2. 位数少时表示的范围比位数多时要小,可能导致数据溢出,装不下了。

先看看精度问题,以下是用FP64、FP32、FP16表示1/3时不同的精度:

5b9e51110330d61a88183b8c5fbc71ad.jpeg

提高精度,确保数据表示和计算的准确性,使模型训练拟合出的参数更精确。这取决于我们对模型精度的具体要求。

186251574ad67f11825cbcf299d8c248.jpeg

我们用一个大数10^6看看二者能否表示:

77d15f0debcce87f6987dc66035d3a6c.jpeg

3混合精度

c325ac273d2f270636496b464420fe54.jpeg

图3. 混合精度使用流程,来源[1]

  1. 把神经网络权重参数由初始化的FP32转为FP16;
  2. 用FP16进行前向和后向计算,并进行梯度计算;
  3. 把FP16的梯度转为FP32;
  4. 使用FP32的梯度和学习率learning rate相乘;
  5. 使用FP32更新网络权重,得到FP32的更新后的权重。

使用FP32更新权重的时候,梯度乘上学习率后一般数值都比较小,因此使用FP32能防止精度不够。

在混合精度训练中,采用"损失缩放"技术以防止数值过小导致精度损失。首先,将损失扩大一倍,使其位于FP16可表示范围内;然后进行反向计算;最后,将梯度缩小相同的倍数,以确保最终数值的准确性。

DistilBERT模型在电影情感分类任务上进行了微调,通过比较FP32、FP16和混合使用性能及准确率,展示了其优越性。

0e3ec639240e06cf538857166c86ae2e.jpeg

图4. FP32、FP16和混合精度训练对比,来源[1]

如图4所示,混合精度训练时间与FP16相当,约为FP32的1/3,且使用的存储空间介于二者之间。尽管预测准确率与FP32相近,甚至更高,但作者认为这可能是因为正则化的影响。相较之下,FP16的预测准确率较低,可能是由于训练过程中数据溢出导致模型失准。

4BF16、TF32

FP16的指数和尾数限制了其可表示的数据范围,因此谷歌为深度学习引入了BF16格式。BF16与FP16共享相同的16位总长度,但将指数位从5位扩展至8位,小数位数则缩短至7位,从而扩大了整数表示范围。

英伟达为满足GPU需求,推出了TF32数据类型,具有8位指数、10位小数(与FP16相同),相较于BF16多出3位小数。

061f7c2d977f62be915e71b6a18411b6.jpeg

图5. BF16、TF32位数,来源:英伟达白皮书

d794807a5124cc2c7c5bfdbf0105bf81.jpeg

图6. 各种精度综合对比


BF16是一种高效的数据格式,具有较短的计算时间(与FP16相当)和较少的存储需求(小数位数较少)。同时,它在准确性方面表现出色,达到了92%,与其他同类格式相当。这些优势使得BF16成为一种值得关注的技术选择。


到此结束,我们搞清楚了各种浮点类型的定义、转换、模型训练时如何使用,以及性能对比。

-对此,您有什么看法见解?-

-欢迎在评论区留言探讨和分享。-


http://www.kler.cn/a/281988.html

相关文章:

  • Spark分布式计算中Shuffle Read 和 Shuffle Write的职责和区别
  • SpringSecurity+jwt+captcha登录认证授权总结
  • NVR录像机汇聚管理EasyNVR多品牌NVR管理工具视频汇聚技术在智慧安防监控中的应用与优势
  • MongoDB在现代Web开发中的应用
  • 【网络安全面经】OSI七层模型每层都有什么协议
  • 【操作系统实验课】Makefile与编译
  • 深度解析:防火墙技术在网络安全中的应用与发展
  • Java的GC(Garbage Collection,垃圾回收)
  • 软件测试——测试分类
  • K8S声明式的管理方式
  • RocketMQ第5集
  • Oracle使用手册
  • 【C#】静态成员(static)与实例成员(非静态成员)的理解
  • 为什么 PageHelper 不需要配置而 MP 需要?
  • 浅谈Kafka(二)
  • 一元四次方程求解-【附MATLAB代码】
  • blender修改材质时出现颜色丢失的问题
  • 基于单片机的一氧化碳报警系统的设计与实现
  • 算法笔记|Day37动态规划X
  • k8s探针详细学习笔记
  • day42 代码随想录 | 子序列问题 面试高频题
  • 【Material-UI】Slider 组件中的 Range Slider 详解
  • 【mysql】mysql之数据查询语言
  • 【C#】【EXCEL】BumblebeeComponentsAnalysisGH_Ex_Ana_CondScale.cs
  • 爬取数据时,如何避免违法问题
  • 文件包含之session.upload_progress的使用