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

从FP32到BF16,再到混合精度的全景解析

笔者做过目标检测模型、超分模型以及扩散生成模型。其中最常使用的是单精度FP32、半精度FP16、BF16
双精度"FP64"就不说了,不太会用到。

#1. 单精度、半精度和混合精度

单精度(FP32)、半精度(FP16)和混合精度(FP32+FP16) 是常见的浮点数计算格式,在深度学习模型的训练与推理中都有涉及。
它们在计算效率、显存占用和数值稳定性上有显著差异。以下是它们的核心区别对比:

精度类型位数显存占用&生成效果生成速度用途
FP3232-bit🌟🌟🌟🌟最高🌟最慢预训练
FP1616-bit🌟🌟🌟🌟🌟微调训练、推理
BF1616-bit🌟🌟🌟🌟🌟微调训练、推理
混合精度FP16+FP32🌟🌟🌟🌟🌟微调训练、推理
FP8 (E4M3)8-bit🌟最低🌟🌟🌟🌟最快边缘设备推理
FP8 (E5M2)8-bit🌟最低🌟🌟🌟🌟最快边缘设备推理

注:推理即图像生成。


#2. BF16(Brain Float16)是什么?

简单的说,「BF16」的显存占用与「FP16」相近,但稳定性与训练效果更好。所以在训练时建议用「BF16」替代「FP16」。

「BF16」由 Google Brain 提出,保留与 FP32 相同的指数位数(8 位指数),仅降低小数位数(从FP32的23 位缩减到7位)。虽然BF16点小数部分精度低于 FP16的10位,但这部分对深度学习影响较小,可以暂时忽略。


#3. 混合精度(FP16 + FP32)是什么?

混合精度会同时使用 FP16 和 FP32,关键部分(如梯度更新)保留 FP32。

笔者一般会直接使用自动混合精度(AMP),即让程序自己选择精度,一般来讲模型权重会保存为FP32,前向与反向传播用FP16。


#4. FP8的简单了解

实际中很少使用FP8,因为它们的生成效果几乎是最差的(不管INT8),基本只会用于边缘设备(如RV1126等)。所以只需简单了解:

  • E5M2(5 位指数,2 位小数):动态范围大,适合梯度计算(训练)。
  • E4M3(4 位指数,3 位小数):精度稍高,适合前向传播(生成)。

http://www.mrgr.cn/news/100227.html

相关文章:

  • TortoiseGit使用图解
  • 《Learning Langchain》阅读笔记8-RAG(4)在vector store中存储embbdings
  • 如何使用URDF搭建双臂UR移动机器人,并在RViz中可视化
  • 【MySQL】MySQL索引与事务
  • 【计算机视觉】CV实战项目 - 基于YOLOv5的人脸检测与关键点定位系统深度解析
  • 张 LLM提示词拓展16中方式
  • 【中级软件设计师】函数调用 —— 传值调用和传地址调用 (附软考真题)
  • 【计算机视觉】CV实践项目- 基于PaddleSeg的遥感建筑变化检测全解析:从U-Net 3+原理到工程实践
  • Python-Agent调用多个Server-FastAPI版本
  • 小刚说C语言刷题——1565成绩(score)
  • Lesar: 面向 Lustre/Scade 语言的形式化模型检测工具
  • Nginx 反向代理,啥是“反向代理“啊,为啥叫“反向“代理?而不叫“正向”代理?
  • 语音合成之五语音合成中的“一对多”问题主流模型解决方案分析
  • 新!在 podman-machine-default 中安装 CUDA、cuDNN、Anaconda、PyTorch 等并验证安装
  • MiniMind模型的web交互功能初试
  • C# 综合示例 库存管理系统7 主界面(FormMain)
  • Shell脚本-for循环应用案例
  • 链表系列一>两两交换链表中的结点
  • Android Studio开发中Application和Activity生命周期详解
  • wordpress1