混合精度训练是深度学习(DL)中使用的一种技术,用于加速模型训练和减少内存消耗,而不会对模型的准确性产生重大影响。它通过在神经网络(NN)中策略性地组合使用不同的数值精度格式来存储和计算数值来实现这一目标。通常,这包括在存储模型权重等关键部分使用标准的 32 位浮点格式(FP32 或单精度),而在前向和后向传递(反向传播)过程中使用速度更快、内存消耗更少的 16 位浮点格式(FP16或半精度,有时也称为 BF16 或 BFloat16)进行计算。
混合精度如何工作
混合精度的核心理念是利用低精度格式的速度和内存优势,同时缓解潜在的数值稳定性问题。常见的方法包括以下步骤:
- 以 FP32 格式保存主权重:以标准 FP32 格式保存模型权重的主副本,以确保权重更新的高精度。
- 使用 FP16/BF16 进行计算:在训练循环中,将 FP32 权重转换为 FP16 或 BF16,用于前向和后向传递。在配备了Tensor 核 的NVIDIA )图形处理器等现代硬件上,使用这些低精度格式的计算速度要快得多。
- 损耗缩放:使用 FP16 时,可表示数字的范围比 FP32 小得多。这会导致在反向传播过程中计算出的小梯度值变为零(下溢),从而阻碍学习。为了避免这种情况,在反向传播之前,损失值会被放大,从而有效地将梯度放大到 FP16 可表示的范围内。在权重更新之前,这些梯度会被缩减。BF16 具有类似 FP32 的更宽动态范围,但精度较低,因此通常可以避免损失缩放。
- 更新主权重:计算出的梯度(如果使用了损耗缩放,则缩减后的梯度)用于更新权重主副本,权重主副本仍保留在 FP32 中。
这种谨慎的平衡使模型的训练速度更快,使用的 GPU 更少。 GPU内存。
混合精度的优势
- 更快的训练:低精度计算(FP16/BF16)在兼容硬件上的执行速度更快,大大减少了每次训练所需的时间。这样就能更快地进行迭代和实验。
- 减少内存消耗:FP16/BF16 值所需内存是 FP32 值的一半。这一减少适用于前向传递过程中存储的激活和后向传递过程中计算的梯度。内存使用量降低后,可以训练更大的模型或使用更大的批量,从而提高模型性能和训练稳定性。
- 提高效率:更快的计算速度和更低的内存带宽要求相结合,可以更有效地利用硬件资源,从而降低云计算或内部集群的培训成本。
混合精度与相关概念
- 全精度 (FP32):传统训练使用 FP32 进行所有存储和计算。一般来说,它在数值上更稳定,但比混合精度更慢,更耗费内存。
- 半精度(FP16/BF16):在整个训练过程中只使用 FP16 或 BF16 会导致严重的数值不稳定性(尤其是没有损失缩放等技术的 FP16)和潜在的精度损失。混合精度是一种结合了 FP32 和 FP16/BF16 的更稳健的方法。
- 模型量化:这通常是指将模型权重和/或激活转换为更低精度的格式,如 8 位整数 (INT8),主要用于优化推理速度和效率,尤其是在边缘设备上。虽然有时会在训练过程中使用(量化感知训练),但它有别于标准训练阶段使用的典型 FP32/FP16 混合精度。