首页/AI/大模型部署与运维速查/FP16 与 BF16 的选择
推理参数与优化50 条

FP16 与 BF16 的选择

两种 16 位精度显存占用相同:BF16 指数位宽、数值范围大,溢出风险低;FP16 尾数位多,精度略高但在部分老卡之外存在溢出风险。

两种 16 位精度

FP16 与 BF16 的显存占用相同,区别在位段分配:BF16 指数位宽大、数值范围广,溢出风险低,适合现代大模型;FP16 尾数位更多,精度略高,但在部分模型与场景存在溢出风险。选哪一个主要取决于算力代际与模型自身的配置。

基本信息

显存占用两者相同(均为 16 位)
BF16范围大、溢出与 NaN 风险低
FP16尾数多、精度略高
硬件前提图灵及更早的卡多数不支持 BF16
服务端参数--dtype bfloat16 等

典型使用场景

  • 新卡上默认选 BF16,降低溢出与 NaN 风险
  • 老卡或不支持 BF16 的算子只能走 FP16
  • 对比两种精度对业务输出的实际影响
  • 排查推理出现 NaN 或异常值时,先核对精度选择
  • 混合部署时确认哪些环节仍走 FP32,避免以为整条链路都降了精度

指定精度

指定精度
vllm serve <模型路径> --dtype bfloat16
# auto 会按模型配置选择;可用取值见版本文档
# 老卡上先确认是否支持 BF16,再决定要不要显式指定

精度选择对照

精度数值范围适用场景
BF16大新代 GPU 上的默认选择
FP16较小老卡或不支持 BF16 的场景
FP32最大精度敏感任务或排障对照
算力代际影响支持情况:图灵及更早的卡多数不支持 BF16,选卡与选精度要放在一起确认,不要分开定。
验证方法:同一提示集用两种精度各跑一版,对比输出一致性与吞吐;多数模型上业务可感知的差异有限,但数值敏感任务要单独评估。
模型自带的 config 里通常已声明推荐精度:先用 auto 让它按配置走,只有需要覆盖时才显式指定。
同一次发布里不要既换精度又换引擎版本:两个变量叠在一起,性能与质量的变化都无法归因,回退时也不知道该退哪一个。

易错点

  • 老卡上强制 BF16:可能不支持或走慢速路径,先核对算力代际再定精度
  • 认为精度只影响质量不影响性能:部分算子在不同精度下走不同 kernel,吞吐差异不小
  • 只看显存不看数值:FP16 在个别模型上出现溢出或 NaN,长尾问题很难定位
  • 不做对照实验就切换:缺少固定提示集的 A/B 数据,改动效果无法评估
  • 以为显存占用随精度线性下降:16 位到 16 位之间没有差别,换到 8 位才是一个台阶
  • 把 dtype 当成显存杠杆:想在 16 位之间省显存是徒劳的,要省只能走量化或 KV 降精度

数据来源与参考

  • PyTorch 数值类型参考(pytorch.org/docs)
  • vLLM 官方文档:dtype 参数(docs.vllm.ai)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌