先这样答
大模型训练默认选 bf16。推理中对精度敏感的场景选 fp16。这是美团北斗二轮的一道原题。两种格式的选择核心在于数值的动态范围与精度取舍。fp16 拥有十位尾数。它的数值精度比较高。它的动态范围相对较小。大模型训练过程中参数和梯度变化非常剧烈。使用 fp16 进行大模型训练很容易发生数值溢出。
bf16 相比 fp16 减少了八位尾数。它用这部分空间换取了更大的指数范围。这种设计让 bf16 拥有更大的动态范围。大模型训练过程因此变得更加稳定。当前主流大模型的训练任务都默认采用 bf16 格式。
推理场景的格式选择需要另算。部分量化前的累积计算对精度十分敏感。这些场景需要优先考虑尾数精度更高的 fp16。选择格式的硬性前提是硬件支持。英伟达 A 系之后的显卡才全面支持 bf16。老旧硬件不支持 bf16。开发者只能去处理 fp16 的溢出问题。
面试官会怎么追问
-
「为什么主流大模型训练都切到了 bf16?」 bf16 用尾数精度换取了指数范围。它的动态范围足以覆盖大模型训练中的梯度波动。开发者使用 bf16 可以避免训练过程中的数值溢出。整个大模型训练过程更加稳定。
-
「推理场景下什么时候必须考虑 fp16?」 遇到对精度敏感的计算环节需要考虑 fp16。量化前的累积计算就是一个典型场景。bf16 的尾数较少,多次累积计算容易产生较大的舍入误差。fp16 的十位尾数能为这些场景提供更好的计算精度。
-
「如果机房里只有老旧架构显卡,还能用 bf16 吗?」 不能直接使用硬件加速的 bf16 计算。全面支持 bf16 是 A 系之后显卡的特性。在老架构显卡上使用会退化为软件模拟。这会拖慢大模型的整体计算速度。
回答的坑
- 忽视硬件支持这个前提,脱离 A 系显卡架构去空谈 bf16 的计算优势。
- 把大模型的训练和推理混为一谈,没有指出推理端量化累积对尾数精度的特殊要求。
同系列的题