专栏名称: 深度学习自然语言处理
一个从大三就接触NLP的小小NLPer,本公众号每天记录自己的一点一滴,每篇文章最后也有托福单词等新知识,学技术同时,也一点一滴积累额外的知识。期待与你在知识的殿堂与你相遇!
目录
相关文章推荐
湖北经视  ·  《哪吒2》进入全球动画电影票房榜TOP15! ·  19 小时前  
湖北经视  ·  已确认!当场击毙 ·  19 小时前  
湖北经视  ·  160斤男子落水被冲向水闸!危急时刻…… ·  昨天  
湖北市场监管  ·  【平平姐说市】㉕2月8日起正式实施!食品添加 ... ·  2 天前  
51好读  ›  专栏  ›  深度学习自然语言处理

一文讲清楚大模型涉及到的精度:FP32、TF32、FP16、BF16、FP8、FP4、NF4、INT8

深度学习自然语言处理  · 公众号  ·  · 2025-01-20 16:27

正文

来自:苍牙的AI世界

大模型的训练和推理,经常涉及到精度的概念,种类很多,而且同等精度级别下,还分不同格式,网上没看到一篇能够介绍全面的,这里梳理总结一份全面的介绍。

整体介绍

浮点数精度:双精度(FP64)、单精度(FP32、TF32)、半精度(FP16、BF16)、8位精度(FP8)、4位精度(FP4、NF4)

量化精度:INT8、INT4 (也有INT3/INT5/INT6的)

另外,实际使用场景中,还有多精度和混合精度的概念


什么是精度

假设你每秒钟赚到的钱是1块钱,那一个月的收入是1*60*60*24*30=216000,如果每秒钟赚到1块1呢,那一个月的收入是237600,就一个1毛钱的小数点,让你月收入少了1万多,这就是精度不同导致的差异。

另外一个典型的例子是π,常用3.14表示,但是如果要更高精度,小数点后面可以有无数位。

当然,这些都是数学里面的精度概念,在计算机里面,浮点数的精度,跟存储方式有关,占用的bit越多,精度越高。


为什么要有这么多精度

因为成本和准确度。

都知道精度高肯定更准确,但是也会带来更高的计算和存储成本。较低的精度会降低计算精度,但可以提高计算效率和性能。所以多种不同精度,可以让你在不同情况下选择最适合的一种。

双精度比单精度表达的更精确,但是存储占用多一倍,计算耗时也更高,如果单精度足够,就没必要双精度。


不同的浮点数精度

在计算机中,浮点数存储方式,由由符号位(sign)、指数位(exponent)和小数位(fraction)三部分组成。符号位都是1位,指数位影响浮点数范围,小数位影响精度。

[FP精度]

Floating Point,是最原始的,IEEE定义的标准浮点数类型。由符号位(sign)、指数位(exponent)和小数位(fraction)三部分组成。

FP64,是64位浮点数,由1位符号位,11位指数位和52位小数位组成。

FP32、FP16、FP8、FP4都是类似组成,只是指数位和小数位不一样。

但是FP8和FP4不是IEEE的标准格式。

FP8是2022年9月由多家芯片厂商定义的,论文地址:https://arxiv.org/abs/2209.05433

FP4是2023年10月由某学术机构定义,论文地址:https://arxiv.org/abs/2310.16836

FP8格式有两种变体,E4M3(4位指数和3位尾数)和E5M2(5位指数和2位尾数)

符号位、指数位、小数位的位数如下表所示:

格式 符号位 指数位 小数位 总位数
FP64 1 11 52 64
FP32 1 8 23 32
FP16 1 5 10 16
FP8 E4M3 1 4 3 8
FP8 E5M2 1 5 2 8
FP4 1 2 1 4


[ 特殊精度]

TF32,Tensor Float 32,英伟达针对机器学习设计的一种特殊的数值类型,用于替代FP32。 首次在A100 GPU中支持。

由1个符号位,8位指数位(对齐FP32)和10位小数位(对齐FP16)组成,实际只有19位。在性能、范围和精度上实现了平衡。

python中查看是否支持:

import torch
//是否支持tf32
torch.backends.cuda.matmul.allow_tf32
//是否允许tf32,在PyTorch1.12及更高版本中默认为False

torch.backends.cudnn.allow_tf32



BF16,Brain Float 16,由Google Brain提出,也是为了机器学习而设计。 由1个符号位,8位指数位(和FP32一致)和7位小数位(低于FP16)组成。 所以精度低于FP16,但是表示范围和FP32一致,和FP32之间很容易转换。

在 NVIDIA GPU 上,只有 Ampere 架构以及之后的GPU 才支持。

python中查看是否支持:

import transformers

transformers.utils.import_utils.is_torch_bf16_gpu_available()


NF4,4-bit NormalFloat,一种用于量化的特殊格式,于23年5月由华盛顿大学在QLoRA量化论文中提出,论文地址: https://arxiv.org/abs/2305.14314

NF4是建立在 分位数量化技术 的基础之上的一种信息理论上最优的数据类型。把4位的数字归一化到均值为 0,标准差为 [-1,1] 的正态分布的固定期望值上,知道量化原理的应该就会理解。

FP精度和特殊精度加上,位数总结如下表

格式 符号位 指数位 小数位 总位数
FP64 1 11 52 64
FP32 1 8 23 32
TF32 1 8 10 19
BF16 1 8 7 16
FP16 1 5 10 16
FP8 E4M3 1 4 3 8
FP8 E5M2 1 5 2 8
FP4 1 2 1 4







请到「今天看啥」查看全文