混合精度训练是在模型训练过程中使用低精度操作(float16
和 bfloat16
)以提高运行速度并减少内存使用。使用混合精度可以使现代 GPU 的性能提高三倍以上,而在 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 将从混合精度中获得最大的性能提升,因为它们具有专门的硬件单元,称为张量核心,可以加速 float16 的矩阵乘法和卷积。然而,较旧的 GPU 在使用混合精度时没有数学性能提升,但内存和带宽的节省可以促成某些速度提升。您可以在 NVIDIA 的 CUDA GPU 网页 查找您的 GPU 的计算能力。最能受益于混合精度的 GPU 示例包括 RTX GPU、V100 和 A100。
即使在没有预期加速的 CPU 和旧 GPU 上,混合精度 API 仍然可以用于单元测试、调试或只是试用 API。尽管在 CPU 上,混合精度的运行速度会显著变慢。
您可以使用以下命令检查您的 GPU 类型:
nvidia-smi -L