混合精度训练是在训练期间在模型中使用低精度操作(float16
和 bfloat16
)以使其运行更快并使用更少的内存。使用混合精度可以在现代 GPU 上将性能提高 3 倍以上,在 TPU 上提高 60%。
如今,大多数模型使用 float32
数据类型,它占用 32 位内存。但是,还有两种低精度数据类型,float16
和 bfloat16
,它们分别占用 16 位内存。现代加速器(如 Google TPU 和 NVIDIA GPU)可以在 16 位数据类型中更快地运行操作,因为它们具有专门的硬件来运行 16 位计算,并且 16 位数据类型可以更快地从内存中读取。因此,在这些设备上应尽可能使用这些低精度数据类型。
但是,变量存储(以及某些敏感计算)仍应使用 float32
以保持数值稳定性。通过尽可能使用 16 位精度并将模型的某些关键部分保留在 float32
中,模型将运行得更快,同时训练以及使用 32 位精度时也是如此。
Keras 层或模型使用的精度策略由 keras.mixed_precision.DTypePolicy
实例控制。每个层都有自己的 DTypePolicy
。您可以通过 dtype
参数(例如 MyLayer(..., dtype="mixed_float16")
)在单个层上设置它,或者您可以通过实用程序 keras.mixed_precision.set_global_policy
设置一个全局值以默认情况下由所有层使用。
通常,要在 GPU 上开始使用混合精度,您只需在程序开始时调用 keras.mixed_precision.set_global_policy("mixed_float16")
。在 TPU 上,您将调用 keras.mixed_precision.set_global_policy("mixed_bfloat16")
。
虽然混合精度可以在大多数硬件上运行,但它只会加速最新的 NVIDIA GPU 和 Google TPU 上的模型。NVIDIA GPU 支持使用 float16 和 float32 的混合,而 TPU 支持使用 bfloat16 和 float32 的混合。
在 NVIDIA GPU 中,计算能力为 7.0 或更高的 GPU 将从混合精度中获得最大的性能提升,因为它们具有称为 Tensor Core 的特殊硬件单元,可以加速 float16 矩阵乘法和卷积。较旧的 GPU 在使用混合精度时不会获得任何数学性能提升,但是内存和带宽节省可以实现一些加速。您可以在 NVIDIA 的 CUDA GPU 网页 上查找您的 GPU 的计算能力。从混合精度中获益最大的 GPU 示例包括 RTX GPU、V100 和 A100。
即使在 CPU 和较旧的 GPU 上,在这些设备上不期望加速的情况下,混合精度 API 仍然可以用于单元测试、调试或只是尝试 API。但是,在 CPU 上,混合精度将运行得慢得多。
您可以使用以下命令检查您的 GPU 类型
nvidia-smi -L