FP16, FP32 - 这到底是怎么回事?还是只是浮点值的位大小(Python)

数据挖掘 表现 显卡 有限精度
2022-03-01 05:20:55

Python 中的 FP16、FP32 到底是什么?我和我的潜在业务合作伙伴正在构建一个用于处理时间序列的深度学习设置。他在寻找 GPU 时想出了“FP16 和 FP32”。看起来他在谈论 16 与 32 位的浮点值。(我们的数据点看起来像这样:“5989.12345”,所以我很确定 16 位是不够的。)

FP16 是 GPU 用来提高性能的一种特殊技术,还是只是一个使用 16 位浮点值而不是 32 个标准浮点数的花哨术语?

1个回答

FP32 和 FP16 分别表示 32 位浮点和 16 位浮点。GPU 最初专注于 FP32,因为这些是 3D 游戏所需的计算。现在很多 GPU 都原生支持 FP16 来加速神经网络的计算。如果您查看一些基准测试(https://blog.slavv.com/titan-rtx-quality-time-with-the-top-turing-gpu-fe110232a28e),您会发现支持 FP16 的 GPU 几乎快两倍计算 FP16 比 FP32。考虑到支持 FP16 的新卡(如 NVidia 2080 系列)与之前的卡(1080)相比,FP32 的速度也提高了 20% 左右,与以前的卡上的 FP32 相比,训练 FP16 神经网络的速度提高了 140%。

但有一个警告。您的神经网络需要使用 FP16 编写,并且它也应该具有相同的精度。FP16 在设计上具有较低的精度,因为它们代表相同数字的位数要少得多。有些人选择使用混合精度模型以便快速准确(https://hackernoon.com/rtx-2080ti-vs-gtx-1080ti-fastai-mixed-precision-training-comparisons-on-cifar-100-761d8f615d7f)。但是您在最后一个链接中看到混合精度的速度更快,但没有使用纯 FP16 时快 2 倍。理论上您也可以使用 FP32 权重并将其中一些权重转换为 FP16 权重,但准确度可能会下降。

所以最后你需要了解你是否可以重写你的神经网络以完全或部分使用 FP16。如果你不能,那么你不会从 FP16 兼容卡中获得任何额外的好处。

FP16 的最大值为 65504,最小值为 5.96 × 10−8。5989.12345 的最佳精度很可能是 5988.0(在https://www.h-schmidt.net/FloatConverter/IEEE754.html上播放)如果这个精度和幅度对您来说还不够,那么您可以在之前缩放您的数据训练以适应 FP16,然后以双倍的速度训练。或者使用以 FP32 作为输入的混合精度模型,然后在后面的层中降低精度。