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

2024-08-29 13:12

本文主要是介绍人工智能算力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成为一种值得关注的技术选择。


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

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

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

这篇关于人工智能算力FP32、FP16、TF32、BF16、混合精度解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1117957

相关文章

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

MySQL中的锁和MVCC机制解读

《MySQL中的锁和MVCC机制解读》MySQL事务、锁和MVCC机制是确保数据库操作原子性、一致性和隔离性的关键,事务必须遵循ACID原则,锁的类型包括表级锁、行级锁和意向锁,MVCC通过非锁定读和... 目录mysql的锁和MVCC机制事务的概念与ACID特性锁的类型及其工作机制锁的粒度与性能影响多版本

Redis过期键删除策略解读

《Redis过期键删除策略解读》Redis通过惰性删除策略和定期删除策略来管理过期键,惰性删除策略在键被访问时检查是否过期并删除,节省CPU开销但可能导致过期键滞留,定期删除策略定期扫描并删除过期键,... 目录1.Redis使用两种不同的策略来删除过期键,分别是惰性删除策略和定期删除策略1.1惰性删除策略

Redis与缓存解读

《Redis与缓存解读》文章介绍了Redis作为缓存层的优势和缺点,并分析了六种缓存更新策略,包括超时剔除、先删缓存再更新数据库、旁路缓存、先更新数据库再删缓存、先更新数据库再更新缓存、读写穿透和异步... 目录缓存缓存优缺点缓存更新策略超时剔除先删缓存再更新数据库旁路缓存(先更新数据库,再删缓存)先更新数

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

MCU7.keil中build产生的hex文件解读

1.hex文件大致解读 闲来无事,查看了MCU6.用keil新建项目的hex文件 用FlexHex打开 给我的第一印象是:经过软件的解释之后,发现这些数据排列地十分整齐 :02000F0080FE71:03000000020003F8:0C000300787FE4F6D8FD75810702000F3D:00000001FF 把解释后的数据当作十六进制来观察 1.每一行数据

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何用GPU算力卡P100玩黑神话悟空?

精力有限,只记录关键信息,希望未来能够有助于其他人。 文章目录 综述背景评估游戏性能需求显卡需求CPU和内存系统需求主机需求显式需求 实操硬件安装安装操作系统Win11安装驱动修改注册表选择程序使用什么GPU 安装黑神话悟空其他 综述 用P100 + PCIe Gen3.0 + Dell720服务器(32C64G),运行黑神话悟空画质中等流畅运行。 背景 假设有一张P100-

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。