跳转到内容

输入关键词开始搜索

    资料摘要:personal chatgpt 05 — float16 与 bf16 表示和计算细节

    视频摘要更新 2026-08-02置信度 high待阅读原始来源 ↗#深度#大模型#课程#personal-chatgpt

    本讲由真实视频转录与作者 notebook/代码交叉整理。原始层:🔒 带时间戳视频转录;课程总览:personal chatgpt — LLMs 实践系列

    本讲从 IEEE 风格浮点数的符号位、指数位、尾数位出发,对比 FP16 与 BF16:两者都占 16 bit,但 FP16 把更多位给尾数,BF16 把更多位给指数。因此 FP16 精度更高但动态范围较窄;BF16 精度较低,却保留接近 FP32 的指数范围,更适合深度学习中容易出现大幅值/小幅值的计算。

    本讲还区分正规数、次正规数、无穷大和 NaN,并用 PyTorch CUDA API 检查 BF16 硬件支持。

    课程采用:

    x=(1)S×M×2Ex=(-1)^S\times M\times2^E

    其中:

    • S:符号位;
    • E:由存储指数减去 bias 得到的真实指数;
    • M:由隐藏的首位和 fraction/mantissa 位组成的有效数。

    指数全 0、指数全 1 是特殊编码,不能按普通正规数直接解释。

    FP16 共 16 位:

    1 bit sign + 5 bits exponent + 10 bits fraction
    • bias 为 15;
    • 正规数指数编码范围为 1–30;
    • 指数全 0 表示 0 或次正规数;
    • 指数全 1 表示 ±Inf 或 NaN。

    最大有限值:

    (2210)×215=65504(2-2^{-10})\times2^{15}=65504

    最小正规正数:

    2146.1035×1052^{-14}\approx6.1035\times10^{-5}

    最小次正规正数:

    2245.96×1082^{-24}\approx5.96\times10^{-8}

    课程用具体二进制位演示了符号位、指数偏置和尾数换算。

    • 正规数默认有效数首位为 1;当指数编码为全 0 时,不再使用这个隐藏的 1。
    • 次正规数填补 0 与最小正规数之间的间隔,使 underflow 更渐进。
    • 代价是有效精度会随着数值接近 0 而降低。

    BF16 共 16 位:

    1 bit sign + 8 bits exponent + 7 bits fraction
    • bias 为 127;
    • 指数位宽与 FP32 相同;
    • 尾数只有 7 位,因此相邻可表示数之间的间隔比 FP16/FP32 大。

    最大有限值:

    (227)×21273.3895×1038(2-2^{-7})\times2^{127} \approx3.3895\times10^{38}

    最小正规正数:

    21261.1755×10382^{-126}\approx1.1755\times10^{-38}

    最小次正规正数:

    21339.18×10412^{-133}\approx9.18\times10^{-41}

    • 范围:接近 FP32,可减少 FP16 中 overflow/underflow 的风险。
    • 精度:只有 7 个 fraction bits,明显低于 FP16 的 10 bit 和 FP32 的 23 bit。
    • 存储:仍是 16 bit,参数和激活的存储量通常约为 FP32 的一半。
    • 所以“BF16 和 FP32 范围相近”不等于“BF16 和 FP32 精度相同”。

    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 的支持状态。

    对一个正规二进制浮点数:

    x=(1)S×(1.f)2×2Estoredbiasx=(-1)^S\times(1.f)2\times2^{E{stored}-bias}

    位宽对比:

    格式 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 的最终对比。
    • 公式、图片和 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 校正。
    • 第 3/4 讲:解释为什么低精度加载时还会保留 LayerNorm、输出头或 adapter 的较高精度路径。
    • 第 6 讲:LLaMA 8-bit 加载后,部分参数仍为 FP16。
    • 第 7 讲:AMP 使用 FP16 加速,并通过 loss scaling 缓解 underflow。
    • 第 8 讲:从 16-bit 浮点进一步转向 8-bit 整数量化和 outlier 混合精度。
    1. FP16 与 BF16 都是 16 bit,为什么动态范围和精度却不同?
    2. FP16 的最大有限值为什么是 65504,而不是 2^16-1
    3. BF16 的 2^-1262^-133 分别代表什么?
    4. 次正规数解决了什么问题,又牺牲了什么?
    5. torch.cuda.is_bf16_supported() 的结果为什么不能直接代表 macOS/MPS?
    • 滴答清单抓取时学习状态:已完成
    • 视频正文采用自动语音识别;关键术语已用标题、notebook 与源码校正,无法确认的口语细节不扩写。
    • notebook 未执行的 CUDA、权重下载、训练或外部 API 单元,不表述为已复现实验。