浮点数格式:FP16, BF16, FP32之间的区别与LLM显存占用
创作时间:
作者:
@小白创作中心
浮点数格式:FP16, BF16, FP32之间的区别与LLM显存占用
引用
CSDN
1.
https://m.blog.csdn.net/u012856866/article/details/145949939
浮点数格式在深度学习和大语言模型(LLM)中扮演着关键角色。不同的浮点数格式(如FP16、BF16和FP32)在精度和存储空间之间存在权衡。本文将详细探讨这些格式的差异,并通过实测数据展示它们在LLM显存占用方面的表现。
1. FP16
FP16(也称为float16)是一种半精度浮点数格式,使用16位二进制(16 bit,2 byte)来表示浮点数。其结构如下:
- 符号位(Sign): 1位,0表示正数,1表示负数。
- 指数位(Exponent): 5位,范围从00001(1)到11110(30)。引入偏置值15,使得指数范围变为-14到+15。
- 尾数位(Fraction): 10位,实际精度为11位(隐含首位1)。
FP16能表示的数值范围是[-65504,65504]。在PyTorch中,可以通过torch.finfo(torch.float16)
查看其详细信息:
torch.finfo(torch.float16)
# 结果
finfo(resolution=0.001, min=-65504, max=65504, eps=0.000976562, smallest_normal=6.10352e-05, tiny=6.10352e-05, dtype=float16)
2. BF16
BF16(也称为bfloat16)是Google为机器学习设计的一种浮点数格式,同样使用16位二进制。其结构与FP16不同:
- 符号位(Sign): 1位。
- 指数位(Exponent): 8位,偏置值为127。
- 尾数位(Fraction): 7位,实际精度为8位(隐含首位1)。
BF16的数值范围是[-3.40282e+38,3.40282e+38]。在PyTorch中,可以通过torch.finfo(torch.bfloat16)
查看其详细信息:
torch.finfo(torch.bfloat16)
# 结果
finfo(resolution=0.01, min=-3.38953e+38, max=3.38953e+38, eps=0.0078125, smallest_normal=1.17549e-38, tiny=1.17549e-38, dtype=bfloat16)
3. FP32
FP32(也称为float32)是单精度浮点数格式,使用32位二进制。其结构如下:
- 符号位(Sign): 1位。
- 指数位(Exponent): 8位,偏置值为127。
- 尾数位(Fraction): 23位,实际精度为24位(隐含首位1)。
FP32的数值范围是[-3.40282e+38,3.40282e+38]。在PyTorch中,可以通过torch.finfo(torch.float32)
查看其详细信息:
torch.finfo(torch.float32)
# 结果
finfo(resolution=1e-06, min=-3.40282e+38, max=3.40282e+38, eps=1.19209e-07, smallest_normal=1.17549e-38, tiny=1.17549e-38, dtype=float32)
4. 不同精度的显存占用
以NVIDIA A40 48G显卡为例,测试LLaMA-2-7B模型在不同精度下的显存占用情况。模型默认保存精度为float16。
浮点数格式对比图
FP16:
BF16:
FP32:
测试代码
import transformers
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
# 打印版本号
print("transformers version:", transformers.__version__)
print("torch version:", torch.__version__)
# 检查系统中是否有可用的 GPU
if torch.cuda.is_available():
# 获取可用的 GPU 设备数量
num_devices = torch.cuda.device_count()
print("可用 GPU 数量:", num_devices)
# 遍历所有可用的 GPU 设备并打印详细信息
for i in range(num_devices):
device = torch.cuda.get_device_properties(i)
print(f"\nGPU {i} 的详细信息:")
print("名称:", device.name)
print("计算能力:", f"{device.major}.{device.minor}")
print("内存总量 (GB):", round(device.total_memory / (1024**3), 1))
else:
print("没有可用的 GPU")
# 加载模型
model_name = "/path/to/llama-2-7b-hf" # 你模型存放的位置
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="cuda:0", torch_dtype=torch.float16)
# 计算模型的显存占用
memory_allocated = torch.cuda.memory_allocated(device='cuda:0')
# 将字节转换为更常见的单位(GB)
memory_allocated_gb = memory_allocated / (1024**3)
print("Memory allocated by the model in GB:", memory_allocated_gb)
# 结果
Memory allocated by the model in GB: 12.582542419433594
测试结果
- float16: 12.6GB
- bfloat16: 12.6GB
- float32: 25.2GB
5. 不同精度之间的转换
在加载模型时,可以通过PyTorch内置的转换函数实现不同精度之间的转换:
5.1 float16转化为float32
# 以float16加载
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="cuda:0", torch_dtype=torch.float16)
# 转为float32
model.float()
5.2 float32转化为float16
# 以float32加载
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="cuda:0", torch_dtype=torch.float32)
# 转为float16
model.half()
参考资料
- LLM大模型之精度问题(FP16,FP32,BF16)详解与实践
- LLM大模型之不同精度下显存占用与相互转换实践
- LLM的不同精度详解和显存占用,FP16,FP32,BF16
热门推荐
加拿大GST企业避坑指南:从注册到申报全解析
湖北麻城有哪些旅游景点呢
那你偏要去麻城什么意思?麻城到底有什么啊?
从臭豆腐到风干鱼:长沙岳阳美食打卡攻略
岳阳楼君山岛:一湖两景尽显湖湘文化魅力
长沙出发岳阳楼:157公里自驾游景点美食全攻略
2024北京GOJO超次元动漫游戏嘉年华购票全攻略
刘道强:“熊出没”系列IP何以“长红”十年
对话《熊出没》制片人尚琳琳:最长寿国漫IP是如何炼成的?
许逊天师和邱处机的成仙之路
道教修炼:现代人的健康密码
顺其自然,随遇而安:古人的智慧如何点亮现代生活
企业可持续发展攻略:四大关键路径助力转型升级
七大核桃功效,你最在意的是这个!
构建现代企业制度:股权管理与公司治理全攻略
优化股权结构,完善公司治理:企业稳健发展的关键路径
吃草莓会让大便变红吗?揭秘肠胃与食物的秘密
蓝莓与大便颜色的神秘之旅
吃核桃会导致大便发黑吗?原因及注意事项全解析
走进麻城,探索那些令人心驰神往的旅游胜地
来苏东坡代言的麻城,夏季精华两日游,安排起~
琼崖巾帼英雄的纪念地:红色娘子军纪念园全面升级开放
员工满意度计算公式:从调查到管理的完整指南
海南琼海:从红色娘子军纪念园到“亚马逊”万泉河
博鳌亚洲论坛周边游:玉带滩河海奇观与免税购物天堂
2025春节琼海:百万消费券+十大主题活动,玩转新春
微信这些小功能关键时刻帮大忙,不会用就浪费了
尿素水平偏低,警惕营养不良和肝功能异常
腊八节倒计时:腊八粥的暖心秘籍
腊八节来了,你家怎么过?