资料摘要:personal chatgpt 05 — float16 与 bf16 表示和计算细节
本讲由真实视频转录与作者 notebook/代码交叉整理。原始层:🔒 带时间戳视频转录;课程总览:personal chatgpt — LLMs 实践系列。
本讲从 IEEE 风格浮点数的符号位、指数位、尾数位出发,对比 FP16 与 BF16:两者都占 16 bit,但 FP16 把更多位给尾数,BF16 把更多位给指数。因此 FP16 精度更高但动态范围较窄;BF16 精度较低,却保留接近 FP32 的指数范围,更适合深度学习中容易出现大幅值/小幅值的计算。
本讲还区分正规数、次正规数、无穷大和 NaN,并用 PyTorch CUDA API 检查 BF16 硬件支持。
1. 通用浮点表示
Section titled “1. 通用浮点表示”课程采用:
其中:
S:符号位;E:由存储指数减去 bias 得到的真实指数;M:由隐藏的首位和 fraction/mantissa 位组成的有效数。
指数全 0、指数全 1 是特殊编码,不能按普通正规数直接解释。
2. FP16:1/5/10 布局
Section titled “2. FP16:1/5/10 布局”FP16 共 16 位:
1 bit sign + 5 bits exponent + 10 bits fraction- bias 为 15;
- 正规数指数编码范围为 1–30;
- 指数全 0 表示 0 或次正规数;
- 指数全 1 表示 ±Inf 或 NaN。
最大有限值:
最小正规正数:
最小次正规正数:
课程用具体二进制位演示了符号位、指数偏置和尾数换算。
3. 为什么需要次正规数
Section titled “3. 为什么需要次正规数”- 正规数默认有效数首位为 1;当指数编码为全 0 时,不再使用这个隐藏的 1。
- 次正规数填补 0 与最小正规数之间的间隔,使 underflow 更渐进。
- 代价是有效精度会随着数值接近 0 而降低。
4. BF16:1/8/7 布局
Section titled “4. BF16:1/8/7 布局”BF16 共 16 位:
1 bit sign + 8 bits exponent + 7 bits fraction- bias 为 127;
- 指数位宽与 FP32 相同;
- 尾数只有 7 位,因此相邻可表示数之间的间隔比 FP16/FP32 大。
最大有限值:
最小正规正数:
最小次正规正数:
5. BF16 的核心取舍
Section titled “5. BF16 的核心取舍”- 范围:接近 FP32,可减少 FP16 中 overflow/underflow 的风险。
- 精度:只有 7 个 fraction bits,明显低于 FP16 的 10 bit 和 FP32 的 23 bit。
- 存储:仍是 16 bit,参数和激活的存储量通常约为 FP32 的一半。
- 所以“BF16 和 FP32 范围相近”不等于“BF16 和 FP32 精度相同”。
6. 硬件支持检查
Section titled “6. 硬件支持检查”notebook 使用:
import torch
torch.cuda.is_bf16_supported()torch.cuda.get_device_properties(torch.cuda.current_device())torch.version.hip保存输出显示讲者设备为 NVIDIA GeForce RTX 4090,is_bf16_supported() 为 True。该结论只描述当时 CUDA 设备,不能推断所有 GPU 或 Apple MPS 的支持状态。
公式 / 代码
Section titled “公式 / 代码”对一个正规二进制浮点数:
位宽对比:
| 格式 | sign | exponent | fraction | bias | 主要特点 |
|---|---|---|---|---|---|
| FP16 | 1 | 5 | 10 | 15 | 尾数较多,范围较窄 |
| BF16 | 1 | 8 | 7 | 127 | 范围接近 FP32,尾数较少 |
| FP32(对照) | 1 | 8 | 23 | 127 | 范围和精度均更高,存储更大 |
00:36:先给出结论:FP16 精度较高但范围小,BF16 范围大但精度低。01:38:FP16 的 1/5/10 位布局。02:39:指数 bias=15 与实际指数换算。03:35:指数全 0/全 1、正规数、次正规数、Inf、NaN。05:02:FP16 最大值 65504。06:01:最小正规数与次正规数。07:01:二进制示例和 GPU 对 FP16 的支持背景。09:00:BF16 名称、PyTorch dtype 与硬件支持。10:00:BF16 最大值和动态范围。11:00:讲者对外部图中“minimum normal”标注表示疑问;notebook 公式应作为本讲可核对依据。12:00:FP16、FP32、BF16 的最终对比。
运行边界与可复现性
Section titled “运行边界与可复现性”- 公式、图片和
torch.bfloat16可跨平台阅读/构造。 torch.cuda.current_device()与get_device_properties()在无 CUDA 的 Mac 上不能按原样运行。- notebook 的保存输出来自 RTX 4090;这不是当前 macOS 的实测结果。
- 视频约
11:00对“最小正规数”外部资料有不确定表述。本稿依 notebook 的位公式区分:2^-126是 BF16 最小正规正数,2^-133是最小次正规正数。 - ASR 对 float、exponent、fraction、normal/subnormal、BF16 等术语有混淆,本稿按 notebook 校正。
与前后讲关系
Section titled “与前后讲关系”- 第 3/4 讲:解释为什么低精度加载时还会保留 LayerNorm、输出头或 adapter 的较高精度路径。
- 第 6 讲:LLaMA 8-bit 加载后,部分参数仍为 FP16。
- 第 7 讲:AMP 使用 FP16 加速,并通过 loss scaling 缓解 underflow。
- 第 8 讲:从 16-bit 浮点进一步转向 8-bit 整数量化和 outlier 混合精度。
- FP16 与 BF16 都是 16 bit,为什么动态范围和精度却不同?
- FP16 的最大有限值为什么是 65504,而不是
2^16-1? - BF16 的
2^-126和2^-133分别代表什么? - 次正规数解决了什么问题,又牺牲了什么?
torch.cuda.is_bf16_supported()的结果为什么不能直接代表 macOS/MPS?
- 视频:float16 与 bf16 表示和计算细节
- 转录:🔒 personal chatgpt 05 视频转录
- 课件 / 代码:🔒 05_float16_bf16.ipynb
- 滴答清单抓取时学习状态:已完成。
- 视频正文采用自动语音识别;关键术语已用标题、notebook 与源码校正,无法确认的口语细节不扩写。
- notebook 未执行的 CUDA、权重下载、训练或外部 API 单元,不表述为已复现实验。