FP16
3 秒看懂
FP16(半精度浮点)是深度学习中一种用 16 位二进制 表示实数的方法,把模型参数和中间结果的内存占用直接砍半。它借力现代 GPU 的 Tensor Core 可实现 2 倍以上的计算吞吐,但数值范围窄(最大约 65504),训练时容易“爆炸”或“消失”。因此业界通常不单用 FP16,而是配合 FP32 组成 混合精度训练——计算用 FP16 加速,关键累加用 FP32 保稳,再用 Loss Scaling 把梯度拉回 FP16 能表示的范围。它是大模型能塞进一张 GPU 并跑起来的关键技术路径之一,但正被 BF16 和 FP8 逐步承接与演进。
3 分钟产业解释
为什么是 FP16
深度学习对数值精度并不像传统科学计算那么敏感:权重和梯度的细微误差,经常被随机梯度下降的噪声和正则化“吞掉”。真正吃紧的是 内存墙——单张 GPU 显存有限,想把大模型装进去,要么减参数量、要么压缩每个参数的位宽。FP16 恰好把每个浮点数从 4 字节压到 2 字节,在同样显存下:
- 可容纳的参数量翻倍(对训练意味着更大的 batch size,对推理意味着更大的模型)
- 访存带宽压力同比例下降
- 硬件乘加吞吐翻倍(见下)
从 NVIDIA Volta 架构起,Tensor Core 能以单周期对 FP16 矩阵乘加执行 FMA(Fused Multiply-Add),理论峰值 FLOPs 是 FP32 的 4–8 倍。这是 FP16 产业化的硬件支点。
但它不能单独上阵
FP16 的指数位只有 5 位,能表达的正常正数范围上限仅为 65504。训练初期梯度动辄上万,一进去就溢出成 Inf/NaN;权重更新量若在 1e-8 量级,则直接下溢为 0,梯度信息消失。因此在工程中,几乎不存在“纯 FP16 训练”这个选项,取而代之的是 FP16 + FP32 混合精度:
- 前向/反向核心矩阵乘用 FP16 高速通路
- 权重主拷贝(master weights)保持在 FP32,梯度累加在 FP32
- Loss Scaling(损失放大)把原本过小的梯度“抬”进 FP16 动态范围
这套方案在 NVIDIA Apex AMP(Automatic Mixed Precision)与 PyTorch torch.cuda.amp 中被标准化,已成为训练 ResNet、BERT、GPT 等模型的标配。
产业现状
- 训练端:BF16 凭借与 FP32 相同的指数位(8 位)逐渐取代 FP16 成为大模型训练主流,因为不再需要 Loss Scaling,训练更稳定。FP16 仍在视觉模型、中小模型微调中有广泛存量。
- 推理端:FP16 仍然是 GPU 推理的“甜点”,TensorRT 等推理引擎以 FP16 为标配优化路径;INT8/INT4 量化进一步压缩,但需校准,FP16 是最“无痛”的高效推理格式。
- 下一代:Hopper 架构引入 FP8(E4M3 / E5M2),进一步倍增吞吐,但需在训练中做分块缩放(scaling block),对框架提出更高工程要求。FP16 正从“开创者”转变为“承上启下”的成熟基础设施。
15 分钟专家深入
位结构与数值特性
FP16 遵守 IEEE 754-2008 binary16 标准:
bit 15 bit 14-10 bit 9-0
┌──────┐ ┌──────────┐ ┌──────────┐
│ sign │ │ exponent │ │ mantissa │
│ 1 │ │ 5 │ │ 10 │
└──────┘ └──────────┘ └──────────┘
| 属性 | 值 | 备注 |
|---|---|---|
| 总位宽 | 16 bit | 2 字节 |
| 符号位 | 1 bit | 0 正 1 负 |
| 指数位 | 5 bit | 偏置 bias=15 |
| 尾数位 | 10 bit | 隐含前导 1,有效精度 ≈ 11 bit |
| 正常数范围 | ~±6.10×10⁻⁵ ~ ±6.55×10⁴ | 约 5.96×10⁻⁸ 为最小次正规数下限 |
| 十进制精度 | 3–4 位有效数字 | 实际二进制精度约 11 bit |
| 最大正数 (Max) | 65504 | 0 11110 1111111111 |
| 最小正正规数 (Min) | 2⁻¹⁴ ≈ 6.10×10⁻⁵ | 0 00001 0000000000 |
| 最小正次正规数 | 2⁻²⁴ ≈ 5.96×10⁻⁸ | 0 00000 0000000001 |
对比 FP32:
- 指数位少 3 → 动态范围缩减为 FP32 的
2^{-14}到2^{15}量级,远低于 FP32 的2^{-126}到2^{127}。 - 尾数位少 13 → 舍入误差明显增大,每次乘加约产生
2^{-11}量级相对误差。
混合精度训练的机制
标准的混合精度流程(以 PyTorch AMP 为例):
- 前向传播: 权重从 FP32 主拷贝自动 cast 为 FP16,激活值与中间结果以 FP16 计算、存储。矩阵乘(Tensor Core 路径)用 FP16。
- Loss 计算: 通常仍在 FP32 累加,或转为 FP32 后再计算,避免极端缩放造成的溢出。
- Loss Scaling: 将 Loss 乘以一个大的标量(如 2¹⁶ 或动态搜索的 scale),使反向传播初始梯度“变胖”,进入 FP16 可表示范围。
- 反向传播: 梯度以 FP16 计算(矩阵乘部分),但累加至 .grad 时可能在 FP32 完成,或先 descale(除以 scale)再累加。
- 优化器更新: 在 FP32 权重主拷贝上执行 Adam/SGD 等更新,避免小更新在 FP16 下溢。
- Scale 动态调整: 若检测到 Inf/NaN,降低 scale 并跳过本次更新;若连续若干步无问题,尝试提高 scale。
Tensor Core 的硬件加速机制
NVIDIA Tensor Core 在每个 SM 中以 warp 级别执行混合精度矩阵乘加:
- 输入矩阵 A、B 为 FP16(或 BF16、TF32 等),累加器 C/D 保持 FP32。
- 单 Tensor Core 每周期可完成
D = A × B + C(FMA),以 4×4×4 矩阵块为单位并行。 - A100 中,FP16 Tensor Core 稠密峰值可达 312 TFLOPS(稀疏 624 TFLOPS),而 FP32 通用核仅 19.5 TFLOPS。约 16 倍的理论乘加吞吐提升。
这是 FP16 能在产业中立足的根本物理基础:不是“快一点”,而是近乎数量级的吞吐差异。
数值稳定性风险
FP16 的三大数值问题:
| 问题 | 成因 | 混合精度对策 |
|---|---|---|
| 梯度上溢(Overflow → Inf/NaN) | 激活值或梯度超过 65504,FP16 无法表示 | 动态降低 loss scale 并跳过本次更新 |
| 梯度下溢(Underflow → 0) | 小更新量 < 6e-8,直接变零 | FP32 主权重 + 小梯度在 FP32 器内累加不丢失 |
| 舍入误差累积 | 10bit 尾数精度有限,多次乘加引入噪声 | 关键累加保留 FP32 |
实践中,还有两大暗坑:
- 激活值的分布偏移:深度网络(尤其 Transformer)中间激活值可能进入 FP16 的“次正规数区”(< 6.10e-5),此时精度进一步下降、计算效率也打折扣(部分 GPU 对次正规数处理有额外开销)。
- BatchNorm 与 Softmax 的不稳定:这两个操作涉及大规约和指数运算,在 FP16 下容易产生除零或 NaN。通常会在这些算子内强制使用 FP32 计算(框架已自动处理)。
技术原理
浮点表示与量化误差的根源
FP16 的科学计数形式:
V = (-1)^{s} \times 2^{(e-15)} \times (1 + m \times 2^{-10})
其中 s 为符号, e 为 5 位指数整数值(0–31), m 为 10 位尾数整数。指数全 0 为次正规数或零,指数全 1 为无穷大或 NaN。这种结构导致:
- 绝对精度随值的大小变化:大值(如 1000)时,相邻可表示数间距约
1000 \times 2^{-10} \approx 0.98;小值(如 0.001)时,间距仅约0.001 \times 2^{-10} \approx 9.76\times 10^{-7}。这是浮点本质。 - 舍入误差的相对界:相邻值间距与值本身之比约为
2^{-10}(约 0.1%),FP32 此值为2^{-23}(约 1.2e-5%),FP16 比 FP32 粗糙约 8000 倍。
混合精度下的梯度流
以线性层 y = Wx (忽略 bias)为例:
- 前向:
y_{fp16} = W_{fp16} x_{fp16},误差来自 input/output 的 FP16 舍入和乘积的尾数截断。 - 反向:
\nabla_x = W_{fp16}^T \nabla_y,同样经历 FP16 矩阵乘与 cast。 - 权重梯度:
\nabla_W = \nabla_y \cdot x^T,累积在 FP32。
Loss Scaling 本质是将整个计算的纵轴拉伸,使梯度的数值分布整体平移至 FP16 的正常有效区间内:
无 Scale: 梯度直方图分布在 1e-8 到 1e-3,大量点落入 FP16 的次正规区甚至零区
有 Scale: 乘上 2^K 后,直方图平移至 1e-5 到 1,正常 FP16 可有效表示
与 BF16 的本质区别
FP16 与 BF16 的哲学分野:
FP16: 尾数多(10bit) + 指数少(5bit) → "小数分得细,但管得窄"
BF16: 尾数少(7bit) + 指数多(8bit) → "小数粗一点,但范围和 FP32 一样大"
对大模型训练而言,动态范围的保障比尾数精度更重要。动态范围不足需要 Loss Scaling 这种“外挂”来弥补,而 BF16 直接不需要。这就是 BF16 在训练中胜出的核心原因。
技术演进史
| 时间 | 节点 |
|---|---|
| 2008 | IEEE 754-2008 首次定义 binary16 格式。此前 FP16 多用于图形学纹理存储,非计算核心 |
| 2016 | NVIDIA P100(GP100)支持FP16数据存储,但无专用FP16运算单元,计算通过FP32核心完成 |
| 2017 | NVIDIA V100(Volta)引入 Tensor Core,支持 FP16 矩阵乘加,训练加速进入实用阶段 |
| 2018 | NVIDIA 发布 Apex AMP,提供标准混合精度 API;此时 BF16 已在 TPU v2(2017)中采用 |
| 2019 | PyTorch 尚无原生 FP16 混合精度 API,训练仍须借助 NVIDIA Apex 等第三方库;TensorFlow 2.0 集成混合精度 API |
| 2020 | A100(Ampere)将 FP16 Tensor Core 峰值推至 312 TFLOPS;BF16 被 A100 硬件支持,开始蚕食 FP16 训练份额 |
| 2022 | H100(Hopper)引入 FP8,训练吞吐再翻倍;FP16 定位转向推理与存量模型 |
| 2023-2025 | 推理引擎(GPU)仍以 FP16 为主力精度;训练领域新模型大多默认 BF16;部分低功耗边缘芯片继续主打 FP16/INT8 |
技术路线对比
| 维度 | FP32 | FP16 | BF16 | FP8(E4M3) | INT8 |
|---|---|---|---|---|---|
| 位宽 | 32 | 16 | 16 | 8 | 8 |
| 符号/指数/尾数 | 1/8/23 | 1/5/10 | 1/8/7 | 1/4/3 | 无(定点) |
| 动态范围 | ≈±3.4×10³⁸ | ≈±6.55×10⁴ | ≈±3.4×10³⁸ | ≈±448(E4M3) | ±127(对称) |
| 十进制精度 | 6–9 位 | 3–4 位 | 2–3 位 | 1–2 位 | 取决于校准 |
| 内存(每参数) | 4 字节 | 2 字节 | 2 字节 | 1 字节 | 1 字节 |
| Tensor Core 加速 | 基线 | 高 | 高(Ampere+) | 极高(Hopper+) | 高(Turing+,Tensor Core) |
| 训练稳定性 | 最优 | 需 Loss Scaling | 好(无需 Scale) | 需 block scaling | 多用于推理 |
| 推理部署 | 按需 | 主流 | 部分支持 | 实验阶段 | 广泛(量化) |
| 典型应用 | 科学计算,基线对比 | 视觉训练推理,小模型 | LLM 训练(主流) | 下一代大模型训练 | 端侧推理,边缘部署 |
数据来源:IEEE 754 标准、NVIDIA 白皮书、PyTorch 文档及行业公开基准。
上下游
上游:硬件数制与架构定义
- IEEE 754 标准委员会: 定义 binary16 的位布局、舍入规则、特殊值(Inf/NaN)行为。FP16 在深度学习中有效,根源在此。
- GPU IP 核(英伟达 SM,AMD CU, 英特尔 Xe Core): Tensor Core / Matrix Engine 必须原生支持 FP16 稀疏/稠密乘加。A100 FP16 峰值 312 TFLOPS 即为该链路硬指标。
- AI 专用芯片: 谷歌 TPU v2/v3 的 BF16,寒武纪、昇腾等的混合精度指令集。
- 基础库: cuBLAS, cuDNN 底层 FP16 卷积/矩阵乘实现;NCCL 的 FP16 AllReduce 通信优化(某些版本对 2 字节数据 pack 传输)。
下游:框架、训练与部署栈
- 框架层: PyTorch
torch.cuda.ampautocast + GradScaler; TensorFlowmixed_precisionpolicy; JAX 的jmp配置。均封装了 FP16 cast、loss scaling 动态调整逻辑。 - 训练阶段: 图像分类(ResNet,ViT)、检测(YOLO,Detectron)、生成对抗(GAN,较脆弱,需精细调 scale)、语音(Conformer)、LLM 微调(部分依然 FP16)。
- 推理引擎: TensorRT、OpenVINO、ONNX Runtime 均提供 FP16 优化路径(TensorRT 的 FP16 模式常作为除 INT8 外的最高吞吐选项);vLLM、TGI 等大模型推理框架默认 FP16 加载权重。
- 模型动物园与部署: Hugging Face 上大多数模型提供 fp16 权重;NGC 容器中的预训练模型常包含 fp16 checkpoint。
关键指标
| 指标 | 典型值 | 说明 |
|---|---|---|
| 模型显存占用(FP32→FP16) | -50% | 参数 + 优化器状态 + 激活值均减半 |
| 单精度乘加吞吐提升(NVIDIA V100/A100/H100) | 约 2–16× | 相对 FP32 非 Tensor 核,实际端到端加速约 1.5–4× |
| 动态范围 | 6e-5 到 65504 | 远小于 FP32(1e-38 到 3e38),Loss Scaling 补偿 |
| 等效小数精度 | 约 3–4 十进制位 | 足以满足大多数深度网络的梯度信噪比要求 |
| Loss Scaling 初始值 | 2¹⁶(65536) | Apex 默认;动态 scale 通常从 2²⁴ 启动 |
| Tensor Core FP16 峰值(A100) | 312 TFLOPS(稠密) | 对比 FP32 核 19.5 TFLOPS |
| 训练吞吐(BERT-Large 微调) | 提升 2–3× | 相对 FP32 无 AMP(NVIDIA 基准) |
| 推理延迟降低(ResNet-50) | 约 1.5–2× | TensorRT FP16 对比 FP32 |
供需与市场数据
注:FP16 作为数据格式本身不独立构成市场,但它是 AI 加速器的核心性能指标之一,间接反映在训练/推理硬件市场份额中。
- AI 服务器 GPU 出货: 据 [行业估算] 2024 年数据中心 GPU 约 400–500 万张,NVIDIA Hopper(H100/H200)及 Ampere(A100)占绝大多数。这些 GPU 的 AI 加速能力与 FP16/BF16/FP8 吞吐直接挂钩。
- 训练工作负载精度选型趋势: 2024–2025 新发布的大模型(GPT-4 量级、Llama 3、Gemini 等)训练阶段 BF16 已成事实标准,FP16 主要用于:
- 较小模型及视觉模型(约 30–40% 训练场景,按社区公开配方估计)
- 微调(fine-tuning):约 50%+ 仍采用 FP16 混合精度(因原有代码栈成熟,迁移意愿不高)
- 推理工作负载: 基于 TensorRT 的生产推理中,FP16 占比约为 60–70%(英伟达官方推荐默认路径),INT8 约 20–30%(需校准),FP32 仅少数对精度有硬要求的场景。
- 云厂商 AI 实例: AWS p4d/p5、阿里云 V100/A100 实例、谷歌云 A3 均默认提供 FP16 优化的深度学习镜像,表明该技术已高度商品化。
无精确出货及收入数据源,以上为基于多份行业报告交叉的定性判断。
代表公司与资本映射
| 公司/机构 | 与 FP16 的关联 | 影响层级 |
|---|---|---|
| NVIDIA | Tensor Core 的 FP16 加速能力(A100/H100)为其 AI 训练/推理硬件核心竞争力;Apex AMP、cuDNN/cuBLAS 封装了完整 FP16 软件栈。每一次代际 FP16 峰值翻倍驱动数据中心 GPU 销售 | 核心驱动力 |
| AMD | MI250X/MI300X 的 Matrix Core 同样支持 FP16,但软件生态(RoCm)较 NVIDIA 晚,正在追赶。INSTINCT 系列 FP16 峰值对标,生态不足导致占有率差距 | 追赶者 |
| Intel | Habana Gaudi2 支持 FP16/BF16,软件栈 SynapseAI;GPU Max(PVC)支持 FP16。FP16 是其在 AI 加速器市场切入的必备能力 | 新兴竞争者 |
| TPU 以 BF16 为主,但 TensorFlow 对 FP16 支持完善;其 Cloud TPU 以 BF16/INT8 为主,FP16 用于兼容。对 FP16 的产业推力在于推动混合精度思路普及 | 生态影响者 | |
| Meta/Microsoft/Amazon | 大模型训练推理的大规模用户,其训练框架(PyTorch)的 AMP 模块决定了 FP16 软件栈走向;自研芯片(如 Meta MTIA、AWS Trainium)是否优化 FP16 影响需求 | 需求端巨头 |
| 华为(昇腾) | Ascend 910B 支持 FP16 混合精度,其 CANN 框架对标 Apex AMP。FP16 性能是国产替代路径的关键参数 | 国产替代 |
| 寒武纪/壁仞/摩尔线程 | 各自 AI 加速芯片架构中 FP16 单元为标配,软件栈的 AMP 完整度影响商业化进度 | 早期参与 |
投资逻辑
FP16 本身不构成直接投资标的,但可作为评估 AI 硬件/软件公司技术深度的指标项:
- 硬件 FP16 性能密度(TFLOPS/mm²): 反映了芯片架构的能效上限。FP16 峰值高但实际利用率(推理训练吞吐/峰值)更关键,需要看硬件-软件协同。
- AMP 生态完备度: 芯片厂商能否提供无缝的 FP16 混合精度训练框架(对标 NVIDIA AMP),是 AI 训练芯片能否大规模部署的“准入条件”。PyTorch 原生支持情况是核心信号。
- 向后兼容的衰退风险: FP16 在训练中的主导地位正被 BF16/FP8 侵蚀。纯 FP16 优化而无 BF16/FP8 能力的芯片,其 AI 训练市场窗口期正在关闭。但 FP16 推理生命周期仍然较长——因存量模型庞大、迁移成本存在。
- 推理市场的 FP16 路径依赖: 随着生成式 AI 推理规模爆发,FP16 推理加速(尤其是实时 API 场景)仍然是对数据中心 GPU 强劲需求的组成部分。而 LLM 推理的 KV-cache 内存问题,使得 FP16(2 字节)比 BF16(同样是 2 字节)在精度与压缩之间取得微妙平衡(某些场景 BF16 尾数损失更大)。
常见误读纠偏
误读 1:“FP16 训练和 FP32 精度几乎一样”
纠偏: 对于大部分视觉模型和 Transformer 微调,FP16 混合精度确实能实现无损或微损收敛。但对于某些敏感架构(GAN,某些 RL、科学计算嵌入)和低资源数据,FP16 的舍入噪声会导致不收敛或结果显著偏差。FP16 成功并不意味精度“一样”,而是网络的冗余度和随机下降惯性“容忍”了额外噪声。
误读 2:“FP16 就是 Tensor Core 的唯一格式”
纠偏: Tensor Core 支持多精度:Volta 只支持 FP16;但 Ampere 开始广泛支持 BF16、TF32、INT8、INT4;Hopper 支持 FP8。FP16 是 Tensor Core 的“第一个”大力推广的低精度格式,但如今只是多精度矩阵加速的其中一档。把“Tensor Core = FP16”等同已过时。
误读 3:“减小内存就能等比例加速训练”
纠偏: 端到端训练加速很少达到 2×(相对 FP32)。通信(多卡 AllReduce)、数据加载、优化器更新、CPU-GPU 传输等环节保持不变,且 Loss Scaling 和 cast 操作引入额外开销。实际加速通常在 1.4×–3× 之间,取决于模型的计算/访存比。
学习路径
- 基础: 读 IEEE 754 binary16 定义页(约 2 页) + CSAPP 浮点章节 → 理解位分布、溢出/下溢概念。
- 动手: PyTorch
autocast官方教程 + 简单 ResNet/CIFAR-10 训练;手动注入 Loss Scaling 观察梯度分布。 - 关键论文:
- Micikevicius et al., “Mixed Precision Training,” ICLR 2018 (开创 AMP 范式);
- NVIDIA FP8 白皮书 “FP8 Formats for Deep Learning” 对比叙述 FP16 局限。
- 深入: 阅读 PyTorch AMP 源码(重点
GradScaler与autocast算子白名单机制);运行 Nsight Systems 对比 FP16 vs FP32 的 kernel 执行时间分布。 - 横向理解: 对比 BF16 的论文(Kalamkar et al., 2019)与 Intel Habana 的混合精度方案,理解不同指数/尾数分配的设计哲学。
一句话总结
FP16 是深度学习低精度革命的“元老”——它靠半倍内存与 Tensor Core 级加速击穿了内存墙,但动态范围窄的本征缺陷催生了混合精度范式,并最终被范围更宽的后辈 BF16/FP8 在训练高位接过衣钵,而自己驻守在推理的主阵地上。
延伸阅读与来源
- IEEE 754-2008 Standard for Floating-Point Arithmetic (IEEE Computer Society, 2008)
- Paulius Micikevicius et al., “Mixed Precision Training,” ICLR 2018 [https://arxiv.org/abs/1710.03740]
- NVIDIA Developer Blog, “Floating-Point 8: An Introduction to Efficient, Lower-Precision AI Training” [https://developer.nvidia.com/blog/floating-point-8-an-introduction-to-efficient-lower-precision-ai-training/]
- NVIDIA A100 Tensor Core GPU Architecture Whitepaper (2020)
- NVIDIA H100 Tensor Core GPU Architecture Whitepaper (2022)
- PyTorch Automatic Mixed Precision 文档 [https://pytorch.org/docs/stable/amp.html]
- TensorRT FP16 优化指南 [https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#reduced-precision]
- 检索来源:CSDN、华为鲲鹏昇腾开发者社区等对 FP16/FP32/BF16 格式构成与混合精度机制的总结(用于交叉验证位宽、动态范围等硬规格)
注:文中 FP16 动态范围(5.96×10⁻⁸ ~ 6.55×10⁴)及位布局为 IEEE 754 binary16 标准定义;Tensor Core 峰值数据出自 NVIDIA 官方白皮书;产业采用率为定性估计,无精确调查数据支撑。