FP16 全称
FP16 = Float Point 16-bit 中文:16 位标准浮点(半精度浮点数) 代码里常写作 float16,CUDA 里别名就是 half,所以 --dtype half = float16。
完整拆分
- FP = Floating Point(浮点)
- 16 = 总数据位宽 16 bit 标准名称:IEEE 754 Half-precision floating-point format,业内简称 half /fp16。
两个命名来源对比
| 格式 | 全称 | 起名方 | 设计初衷 |
|---|---|---|---|
| FP16(float16/half) | Floating Point 16bit | IEEE 标准委员会 | 图形渲染、早期 GPU 计算 |
| BF16(bfloat16) | Brain Floating Point 16bit | Google Brain 团队 | 专门适配神经网络训练 & 推理 |
补充小知识点
- FP32:Floating Point 32-bit(单精度浮点)
- FP64:Floating Point 64-bit(双精度浮点) 所有带 FP 开头的,都是 IEEE 标准浮点格式;BF16 不属于标准 IEEE fp16,是工业改良变体。
- 二者字节大小一致(都是 2 字节),只是内部指数、尾数分配不一样。
一、基础定义(都是 2 字节 = 16 位浮点数,结构不一样)
1. FP16(float16,你写的 --dtype half)
- 全称:IEEE 754 Half-Precision Float
- 比特分配(总共 16bit)
- 符号位:1 bit
- 指数位:5 bit
- 尾数位:10 bit
- 取值范围:
±65504;精度更高,小数细节更精细 - 缺陷:指数区间小,数值稍微一大就容易溢出
2. BF16(bfloat16,Brain Float 16)
- 谷歌 Brain 推出,为 AI 训练 / 推理设计
- 比特分配(总共 16bit)
- 符号位:1 bit
- 指数位:8 bit(和 FP32 指数位一样宽)
- 尾数位:7 bit
- 取值范围:和 FP32 基本一致,超大数值不会溢出;尾数精度比 FP16 略低一点
直观对比表
表格
| 参数 | FP16(half) | BF16 | FP32(float32) |
|---|---|---|---|
| 总比特 | 16bit | 16bit | 32bit |
| 指数位 | 5bit | 8bit | 8bit |
| 尾数位 | 10bit | 7bit | 23bit |
| 数值范围 | 小,易溢出 | 大,匹配 FP32 | 标准全范围 |
| 计算精度 | 更高 | 略低 | 最高 |
| 显存占用 | 2Byte / 参数 | 2Byte / 参数 | 4Byte / 参数 |
二、显存层面关键结论
FP16、BF16 单个参数都是占用 2 字节,权重文件体积、模型空载显存占用完全一模一样 你在 A100 跑 Qwen3.6-35B: BF16 裸权重 ≈70GB,FP16 裸权重依旧≈70GB,刚性显存没有任何区别。 区别只在计算过程的数值稳定性、硬件加速效率。
三、硬件适配(结合你的 A100)
- A100(Ampere)原生硬件支持 BF16 运算单元 BF16 推理速度 ≥ FP16,NVIDIA 对 BF16 做了深度优化,vLLM 默认自动选用 bf16 就是这个原因。
- RTX30 系及更早显卡:没有硬件 BF16 计算单元,跑 BF16 会落到 CPU 模拟 / 软计算,速度暴跌,此时用
half(fp16)才是最优。 - RTX40 系、A10、H100:全都完美硬件 BF16。
四、放到你的两个使用场景讲解
场景 1:Embedding(Qwen3-Embedding-0.6B)
向量只需要相对相似度,BF16 损失的一点点尾数精度完全感知不到 。 A100 默认 bf16 即可,不用手动加--dtype half,性能更好。
场景 2:Qwen3.6-35B 大模型推理
- BF16:数值稳定,大数值计算不易溢出,A100 跑更快,vLLM 默认方案
- FP16:极少数极端场景会出现数值溢出、输出乱码;无收益,没必要强制 half
五、补充误区纠正
- 不是 BF16 = 省显存、FP16 = 费显存:二者显存开销完全相等
- 只有 FP32 才会显存直接翻倍
- 量化 INT8/INT4 是压缩权重,和这两个 16 位浮点不是一个维度
最简选择口诀
- A100 / A10 / H100 / RTX40+:不用指定 dtype,默认 bf16 最优
- RTX30 及以下老消费卡:手动加上
--dtype half