AI 模型训练过程中参数用BF16转向FP16的原因

大模型训练从 FP16 转向 BF16 是一个关键的技术演进,其核心原因在于 BF16 在动态范围和精度之间取得了更优的平衡,从而极大地提升了训练(尤其是大模型训练)的稳定性和有效性。

1. 背景

  1. 为什么需要半精度浮点数 (FP16)?

在深度学习训练中,尤其是Transformer架构的大模型,参数量和计算量极其巨大。使用单精度浮点数 (FP32) 进行训练会消耗大量的显存和计算资源。因此,混合精度训练 成为标准做法:

• FP16 存储和计算:在前向传播和反向传播中,使用 FP16 来存储张量和进行计算。这可以显著减少显存占用(约一半),并提升计算速度(现代GPU如NVIDIA Tensor Core对FP16有专门优化)。

• FP32 主权重和梯度累加:在优化器中,保留一份 FP32 格式的“主权重”(Master Weights)。在计算梯度时,也使用 FP32 进行累加,以避免下溢和精度损失。

FP16 的数据格式是:1 个符号位 + 5 个指数位 + 10 个小数位。

  1. FP16 的核心痛点:狭窄的动态范围

FP16 的最大问题在于其动态范围(Dynamic Range)非常窄。

• 可表示的最大值:约 65,504

• 可表示的最小正值(接近0):约 5.96 × 10⁻⁸ (2⁻²⁴)

在训练大模型时,尤其是在训练的初期或者使用某些优化器(如 Adam)时,梯度值可能非常小。当这些微小的梯度值小于 FP16 能表示的最小值时,它们会被舍入为 0。这种现象称为梯度下溢(Gradient Underflow)

一旦梯度变为 0,对应的权重就无法更新,这部分神经元就“死亡”了。对于拥有数十亿甚至万亿参数的大模型来说,广泛的梯度下溢会导致训练不稳定、无法收敛,或者最终模型性能不佳。

简单比喻:FP16 就像一把刻度非常精细但量程很小的尺子(例如 0-10cm),能量得很细,但一旦物体长度超过10cm或小于1mm,你就无法准确测量了。

  1. BF16 的解决方案:牺牲精度,换取范围

BF16 (Brain Floating Point) 是由 Google Brain 团队设计的一种浮点格式,旨在更好地满足深度学习的需求。

它的数据格式是:1 个符号位 + 8 个指数位 + 7 个小数位。

让我们对比一下 FP16 和 BF16:

特性FP16BF16说明
总位数16 bits16 bits两者占用内存完全相同
符号位1 bit1 bit相同
指数位5 bits8 bits这是最关键的差异
小数位/尾数位10 bits7 bits这是做出的牺牲
动态范围~5.96e-8 ~ 65504~1.18e-38 ~ 3.39e38BF16 范围极大拓宽
精度(小数部分)相对较高 (2⁻¹⁰)相对较低 (2⁻⁷)BF16 精度更低

BF16 的巨大优势:

  1. 极其宽广的动态范围
    BF16 的指数位和 FP32(8位指数)完全一样。这意味着它的动态范围与 FP32 几乎一致。最大值和最小值都与 FP32 处于同一数量级。
    好处:几乎不可能出现梯度下溢或权重下溢的问题。那些在 FP16 中会变成 0 的微小梯度,在 BF16 中依然可以正常表示和参与计算。这直接解决了大模型训练不稳定的核心痛点。

  2. 与 FP32 的无缝转换
    由于指数位宽度相同,BF16 和 FP32 之间的转换非常直接和高效,几乎只是截断或填充尾数位。这在混合精度训练中(BF16计算,FP32主权重)开销更小。

BF16 的“劣势”与为何它无关紧要:

BF16 的尾数位更少(7位 vs 10位),这意味着它的精度更低。它无法像 FP16 那样精确地表示一个数的小数部分。

然而,深度学习模型对数值的精度(小数点后多精确)相对不敏感,但对数值的范围(不能是0或无穷大)极其敏感。

• 权重和梯度值本身具有噪声鲁棒性:模型参数的更新本身就是一个带有噪声的优化过程。梯度值本身就不需要非常高的精度,只要方向大致正确,优化器(如Adam)就能很好地工作。

• 范围比精度更重要:一个不精确但非零的梯度仍然可以有效地更新权重,而一个精确但值为 0 的梯度则对训练毫无贡献。“有”远胜于“无”。

回到比喻:BF16 就像一把量程巨大(0-100米)但刻度相对粗糙的尺子。测量1米左右的物体时,FP16可能更准,但BF16既能测细胞大小(小梯度)又能测大楼高度(大梯度),虽然都不是特别精确,但绝不会测不了。对于训练模型来说,确保所有值都能被测量到,比测量得极度精确更重要。

  1. 硬件支持:Ampere架构及以后的GPU

BF16 的成功推广离不开硬件支持。NVIDIA 从 Ampere 架构(如 A100, A6000, 30系)开始,在其 Tensor Cores 中原生支持了 BF16 计算。

• 新的计算指令:例如,HMMA (Half-precision Matrix Multiply Accumulate) 指令同时支持 FP16 和 BF16 操作。

• 同等性能:在 Ampere 及以后的 GPU 上,使用 BF16 进行矩阵乘法和卷积运算与使用 FP16 具有完全相同的速度性能。

这意味着开发者可以在不损失任何计算速度或内存占用的前提下,获得 FP32 级别的动态范围,从而稳定地训练大模型。这是一种“免费的午餐”,因此BF16迅速成为大模型训练的首选格式。

总结:BF16 的好处

  1. 稳定训练,避免下溢:核心优势。其宽广的动态范围(与FP32一致)彻底解决了FP16在训练大模型时容易出现的梯度下溢问题,使训练过程更加稳定可靠。
  2. 保持性能,无损速度:在现代GPU(Ampere及以后)上,BF16与FP16具有完全相同的计算速度和内存效率。
  3. 简化混合精度训练:与FP32的转换更加简单高效,因为指数位对齐。
  4. 对深度学习任务更友好:牺牲了无关紧要的小数精度,换来了至关重要的动态范围,完美匹配了深度学习的数值特性。

2. 精度对比

BF16、FP16 和 FP32 是深度学习中最常用的三种浮点数格式。

核心概念:浮点数的构成

所有浮点数都由三部分组成:

  1. 符号位 (Sign bit):决定正负。
  2. 指数位 (Exponent bits):决定数值的范围(能表示多大和多小的数)。
  3. 尾数位/小数位 (Mantissa bits):决定数值的精度(表示的细节有多精细)。
格式总位数符号位指数位尾数位主要特点
FP3232 bits1 bit8 bits23 bits高精度、高范围,传统标准
FP1616 bits1 bit5 bits10 bits省内存、速度快,但范围窄
BF1616 bits1 bit8 bits7 bits范围广(同FP32),精度低

详细对比

特性维度FP32 (Single Precision)FP16 (Half Precision)BF16 (Brain Float16)说明与影响
内存占用4 Bytes2 Bytes2 BytesFP16/BF16 内存减半,能训练更大模型或使用更大批次。
计算速度标准速度更快 (Tensor Cores)更快 (Tensor Cores)现代GPU(如NVIDIA V100/A100)对 FP16/BF16 有专用硬件加速。
动态范围~1.18e-38 to ~3.40e38~5.96e-8 to 65504~1.18e-38 to ~3.39e38核心差异。BF16 范围与 FP32 相同,远大于 FP16。FP16 极易出现下溢
表示精度非常高 (2⁻²³)较高 (2⁻¹⁰)较低 (2⁻⁷)BF16 精度最低,但对深度学习影响不大。FP32 精度最高。
训练稳定性非常稳定不稳定稳定FP16 的狭窄范围导致梯度容易变成0(下溢),使训练崩溃。BF16 因其宽广范围而非常稳定。
主要用途传统科研计算、CPU计算、部分网络层模型推理、对精度敏感的小模型训练大规模模型训练 (尤其是LLM)训练用 BF16,推理用 FP16,传统用 FP32 已成为一种趋势。
硬件支持所有CPU/GPUPascal架构及以后的NVIDIA GPUAmpere架构及以后的NVIDIA GPU (如A100, 3090, H100)BF16 需要较新的硬件支持。

通俗比喻

你可以把这三种格式想象成三种不同的尺子:

• FP32:高精度工程尺

◦   量程极大(从显微镜到天文望远镜),刻度极其精细(精确到微米)。◦   优点:什么都能量,量得很准。◦   缺点:做得太重太大(占内存),操作起来有点慢。

• FP16:便携小尺子

◦   量程很小(只有0-15厘米),但刻度很精细(精确到毫米)。◦   优点:轻便小巧(省内存),操作快。◦   缺点:量不了太小的东西(如细胞,会下溢)和太大的东西(如桌子,会上溢),很容易就量不准了。

• BF16:大量程估算尺

◦   量程和工程尺一样大(从显微镜到天文望远镜),但刻度很粗糙(精确到厘米)。◦   优点:轻便小巧(省内存),操作快,最重要的是什么都能量到(绝不会量不了)。◦   缺点:量得没那么精细,但对于“估算房间面积”这种任务来说,厘米级的精度足够了。

在深度学习中,我们更关心梯度、权重这些值是否存在(范围),而不是它到底有多精确(精度)。一个不精确但非零的梯度远胜于一个精确但为零的梯度。这就是BF16成功的关键。

3. 总结与选择建议

  1. 训练大型模型(尤其是LLM):
    首选 BF16,它在保持FP16的速度和内存优势的同时,提供了FP32级的动态范围,保证了训练的稳定性。这是当前工业界训练大模型的事实标准。

  2. 模型推理与部署:
    首选 FP16,推理时没有梯度计算,数值范围相对稳定,不会出现下溢问题。更高的精度有时能带来更好的输出质量,且兼容性更广(支持FP16的硬件更多)。

  3. 通用计算、小型模型或兼容性考虑:
    使用 FP32,当硬件不支持BF16/FP16,或模型非常小、对数值精度极其敏感时,FP32仍然是最安全可靠的选择。

  4. 混合精度训练:
    无论是 FP16 还是 BF16,通常都会与 FP32 结合使用,即混合精度训练。计算用 BF16/FP16,但主权重副本和梯度累加等关键操作保留在 FP32 中,以进一步提升数值稳定性。

对于现代大规模深度学习模型(尤其是LLM),BF16 已经全面取代 FP16,成为混合精度训练中首选的半精度浮点数格式。FP16 通常只在推理部署或一些对精度有特殊要求的旧模型中继续使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/921951.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python网络爬取个人学习指南-(五)

**************************************************************************************************************author:keyinfodate:2025-09-09 23:50title:网络信息爬取之多联级标题内容点击****************************************…

RAG - 检索增强生成

第一部分:RAG 详解一、RAG 是什么?RAG(Retrieval-Augmented Generation,检索增强生成)是一种将信息检索(或知识检索)与大语言模型(LLM)的生成能力相结合的技术框架。它的…

大数据毕业设计选题推荐-基于大数据的分化型甲状腺癌复发数据可视化分析系统-Spark-Hadoop-Bigdata

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

Spring Bean扫描

好的,没有问题。基于我们之前讨论的内容,这是一篇关于 Spring Bean 扫描问题的深度解析博客。Spring Bean扫描作者:Gz | 发布时间:2025年9月9日🎯 Spring如何找到你的Bean? 首先要理解原理。Spring的组件扫…

【 运维相关】-- HTTP 压测/负载发生器之新秀 oha

目录 oha 项目分析(hatoo/oha) 一、概述 二、安装 三、快速上手 三、常用参数(摘选) 四、输出解读(终端 TUI) 五、与其它工具对比 六、最佳实践 七、注意事项 八、参考 oha 项目分析(h…

淘宝闪购基于FlinkPaimon的Lakehouse生产实践:从实时数仓到湖仓一体化的演进之路

摘要:本文整理自淘宝闪购(饿了么)大数据架构师王沛斌老师在 Flink Forward Asia 2025 城市巡回上海站的分享。引言在数字化转型的浪潮中,企业对实时数据处理的需求日益增长。传统的实时数仓架构在面对业务快速变化和数据规模爆炸性增长时,逐渐…

Android应用添加日历提醒功能

功能 在安卓应用里调用系统日历&#xff0c;直接创建一个带提醒的日历事件&#xff0c;甚至不需要跳转到日历界面&#xff0c;只需要获取系统日历的读取权限即可。 需要的权限 在AndroidManifest.xml里添加 <uses-permission android:name"android.permission.READ_CAL…

‌Git Bisect 二分查找定位错误总结

# Git Bisect 二分查找指南## 1. 基本原理&#xff08;ASCII示意图&#xff09; 假设提交历史是一条时间线&#xff0c;Ggood&#xff08;正常&#xff09;&#xff0c;Bbad&#xff08;异常&#xff09;&#xff1a;提交顺序: G --- G --- G --- B --- B --- B | | | 初始正常…

ThingsKit物联网平台 v2.0.0 发布|前端UI重构、底层架构升级

v2.0.0 Release发布日期&#xff1a;2025/08/25 代码标签&#xff1a;v2.0.0_Release&#x1f947; 新增功能国标级联&#xff08;支持上级、下级国标级联&#xff09;视频回放、录像计划&#xff08;用户可以通过录像计划生成对应的视频回放并查看&#xff09;Modbus_TCP协…

Lua > Mac Mini M4安装openresty

Mac Mini M4安装openresty 主要参考 https://www.cnblogs.com/helios-fz/p/15703260.html brew uninstall nginxbrew update brew install pcre openssl #brew install geoip# brew tap openresty/brew # brew install openresty # brew install openresty/brew/openresty# VER…

【多线程案例】:单例模式

多线程案例8.1 单例模式饿汉模式懒汉模式懒汉模式-单线程版懒汉模式-多线程版懒汉模式-多线程版(改进)8.1 单例模式 单个实例. 在一个 java 进程中, 要求指定的类,只能有唯–个实例。&#xff08;尝试 new 多个实例的时候, 就会直接编译报错&#xff09; 单例模式是校招中最常…

【Python/Pytorch】-- 贝叶斯定理

文章目录 文章目录01 贝叶斯定理的理解02 在MRI重建领域应用01 贝叶斯定理的理解 贝叶斯定理的基本公式&#xff1a;P(A|B)P(B|A)*P(A) / P(B) 首先是如何理解这个公式&#xff1f; 在B事件发生的条件下&#xff0c;A发生的概率 P(A|B) 在B事件发生的条件下&#xff0c;A和B同…

子网掩码的隐形陷阱:为何能ping通却无法HTTPS访问

问题现象深度解析在近期企业网络维护中&#xff0c;运维团队发现一个具有教学意义的典型案例&#xff1a;某台部署在10.165.111.0/24网段的业务服务器&#xff08;10.165.111.71&#xff09;可以成功ping通目标中间件主机(10.165.110.11)&#xff0c;但通过HTTPS协议访问https:…

【ArcGIS】如何编辑图层的属性表

GIS按属性选择后删除所选项呈现灰色_arcgis删除字段灰色-CSDN博客

大数据各组件flume,datax,presto,DolphinScheduler,findBI在大数据数仓架构中的作用和功能。

一、数据仓库核心价值铺垫在讲具体技术前&#xff0c;先明确数据仓库&#xff08;Data Warehouse&#xff0c;简称数仓&#xff09; 的核心作用&#xff1a; 数据仓库是 “整合企业多源数据、按业务主题组织、支持决策分析” 的结构化数据存储体系&#xff0c;核心价值是打破数…

React From表单使用Formik和yup进行校验

一、Formik的使用 官方文档地址&#xff1a;https://formik.org/docs/tutorial#validation 首先安装依赖 yarn add formik2.导入并初始化 import { useFormik } from formik; initialValues&#xff1a;初始化 输入框的密码和账号 onSubmit&#xff1a;当点击提交按钮时&am…

netty-scoket.io路径配置

1、服务端代码 package com.yh.service.socket;import com.corundumstudio.socketio.SocketIOServer; import com.corundumstudio.socketio.store.RedissonStoreFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory…

20250910荣品RD-RK3588-MID开发板在Android13系统下解决点卡迪的屏闪屏的问题

20250910荣品RD-RK3588-MID开发板在Android13系统下解决点卡迪的屏闪屏的问题 2025/9/5 15:44缘起&#xff1a;荣品RD-RK3588-MID开发板在Android13系统下解决点卡迪的屏。 按 POWER按键 关机之后&#xff0c;2s之内再次短按 POWER按键&#xff0c;开机之后屏会抖动。 2s后短按…

正态分布 - 计算 Z-Score 的 无偏估计

正态分布 - 计算 Z-Score 的 无偏估计 flyfish Z-Score公式与计算步骤 1 公式&#xff08;样本Z-Score&#xff09; 实际应用中&#xff0c;我们几乎不知道“总体均值/标准差”&#xff0c;所以常用样本数据计算&#xff1a; zixi−xˉsz_i \frac{x_i - \bar{x}}{s}zi​sxi​−…

ai生成文章,流式传输(uniapp,微信小程序)

1.环境nutui-uniappvue3tsunocss2.功能源码包含ai生成逻辑&#xff0c;内容生成实时打字机功能&#xff0c;ai数据处理等<script setup lang"ts"> import {queryAIParams, } from /api/pagesA import { submitFn } from /api/aiimport Navbar from /component…