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