当前位置: 首页 > 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.dtcms.com/a/155960.html

相关文章:

  • 深度解析 Java 泛型通配符 `<? super T>` 和 `<? extends T>`
  • Cancer Cell|scRNA-seq + scTCR + 空间多组学整合分析,揭示CD8⁺ T细胞在免疫治疗中的“双路径” | 临床问题的组学解答
  • Tailwind CSS实战:快速构建定制化UI的新思路
  • 【CUDA 编译 bug】ld: cannot find -lcudart
  • 手工收集统计信息
  • 管家婆财贸ERP BB103.收款单按明细核算部门项目
  • Q2桥门式起重机司机考试复习重点
  • 16.ArkUI Toggle的介绍和使用
  • 软件测试流程
  • Mac中 “XX”文件已损坏,无法打开 解决方案
  • 系统架构师2025年论文《论软件架构评估2》
  • DeepSeek+Cline:开启自动化编程新纪元
  • guvcview-源码记录
  • 蓝牙GATT协议
  • 认识 Linux 内存构成:Linux 内存调优之页表、TLB、缺页异常、大页认知
  • 蛋白质大语言模型ESM介绍
  • 前端基础之《Vue(12)—插件封装》
  • 什么是 JSON?学习JSON有什么用?在springboot项目里如何实现JSON的序列化和反序列化?
  • docker-compose安装RustDesk远程工具
  • tkinter的窗口构建、原生组件放置和监测事件
  • windows安装jax和jaxlib的教程(cuda)成功安装
  • 文件IO(Java)
  • 5.3 Dify:低代码平台,适用于企业快速部署合规AI应用
  • 自定义电池电量显示控件 BatteryView 实现
  • express的模板handlebars用app.engine()创建配置和用exphbs.create()的区别
  • Vue3后代组件多祖先通讯设计方案
  • MATLAB基础应用精讲-【基础知识篇】发布和共享 MATLAB 代码
  • ThinkPHP6模型中多组条件逻辑或Or查询的使用
  • BiliNote:开源的AI视频笔记生成工具,让知识提取与分享更高效——跨平台自动生成结构化笔记,实现从视频到Markdown的智能转化
  • Shell脚本-for循环应用案例