半精度
了解半精度 (FP16) 如何通过更快的计算、更少的内存使用和高效的模型部署来加速 AI。
半精度,也称为 FP16,是一种浮点数格式,它使用 16 位内存来表示一个数字,而更常见的 32 位单精度 (FP32) 或 64 位双精度 (FP64) 格式则不然。在深度学习的背景下,使用半精度可以显著减少模型的内存占用和计算需求。这种权衡以降低数值范围和精度为代价。然而,现代技术,特别是混合精度训练,已使 FP16 成为高效机器学习 (ML)的基石,从而能够以最小的准确率影响实现更快的训练和推理。
半精度如何工作
从FP32切换到FP16可以将存储模型权重和激活所需的内存减少一半。这允许更大的模型、更大的批量大小,或者在内存较少的GPU上进行训练。此外,现代GPU,例如那些带有NVIDIA Tensor Core的GPU,专门设计用于以比32位运算快得多的速度执行16位矩阵运算。
FP16 的主要挑战是其有限的数值范围,这可能导致训练期间出现梯度消失等问题。为了抵消这一点,半精度几乎总是使用混合精度方法来实现。该策略包括在 FP16 中执行大多数计算以提高速度,但有策略地使用 FP32 进行关键操作,例如权重更新和某些损失函数计算,以保持数值稳定性。诸如PyTorch和TensorFlow之类的深度学习框架为自动混合精度训练提供内置支持。
应用和示例
半精度,主要通过混合精度技术,被广泛使用:
- 加速模型训练: 使用混合精度可以显着加速大型深度学习模型的训练,例如用于图像分类或自然语言处理 (NLP)的模型,从而减少训练时间和成本。诸如 Ultralytics HUB 之类的平台通常在云训练会话期间利用这些优化。
- 优化目标检测推理: 像 Ultralytics YOLO11 这样的模型可以导出为 ONNX 或 TensorRT 等格式,并使用 FP16 精度来实现更快的实时推理。这对于需要高吞吐量的应用至关重要,例如分析多个视频源的安全系统或高速生产线上的质量控制。
- 在资源受限的设备上部署: FP16模型减少的内存占用和计算成本使其适合在边缘人工智能平台(如NVIDIA Jetson)或使用TensorFlow Lite或Apple的Core ML等框架的移动设备上部署。
- 训练大型语言模型 (LLM): 像 GPT-3 和其他基础模型这样的大型模型需要使用 16 位格式才能将模型放入内存并在合理的时间范围内完成训练。
半精度与其他格式的比较
- Bfloat16 (BF16): Bfloat16 是 Google 开发的一种替代 16 位格式,与 FP16 相比,Bfloat16 为指数分配了更多位,为尾数分配了更少的位。 这使其具有与 FP32 相同的动态范围,使其更能抵抗下溢和溢出,但代价是精度较低。 它在Google 的 TPU中被大量使用。 您可以在Google Cloud AI 博客上阅读更多相关信息。
- 模型量化: 虽然两者都是模型优化技术,但模型量化通常将浮点权重(FP32或FP16)转换为较低位数的整数格式,最常见的是8位整数(INT8)。 这可以提供更大的加速,尤其是在CPU和某些加速器上,但通常需要更仔细的校准过程,例如量化感知训练(QAT),以避免模型性能的显着下降。
- 单精度 (FP32): 这是大多数深度学习框架中的默认格式。它提供高精度和宽动态范围,使其对于训练来说非常强大。但是,它比半精度慢且占用更多内存,因此不太适合部署大型模型或需要最大速度的应用程序。这些格式之间的权衡是一个关键考虑因素,如各种模型比较所示。