天天看点

关于半精度fp16的混合训练fp16fp16&fp32混合精度训练

关于半精度fp16的混合训练

  • fp16
    • 概念
    • 优点
    • 缺点
  • fp16&fp32混合精度训练
    • 混合精度训练的好处
    • 混合精度训练的流程

**参考链接:**https://www.jianshu.com/p/a5b057688097

https://blog.csdn.net/baidu_32048673/article/details/103715333

https://blog.csdn.net/weixin_38740463/article/details/102301044

fp16

概念

fp16即半精度浮点数,一个fp16数据占两个字节,一位符号位,5位指数位,10位有效精度。

符号位:0为正,1为负

指数位:max_e = 11110 - 01111 = 15

min_e = 00001 - 01111 = -14

数值计算:-1符号位 × 2指数位 ×(1+精度位)

优点

  1. TensorRT的FP16与FP32相比能有接近一倍的速度提升168,前提是GPU支持FP16(如最新的2070,2080,2080ti等)
  2. 减少显存。

缺点

会造成溢出(因此,在日常使用过程中,常使用双混合精度训练)

fp16&fp32混合精度训练

混合精度训练的好处

深度神经网络(DNN)在许多领域都取得了突破,复杂性一直在增加,增加了训练这些网络所需的计算资源。 混合精度训练通过使用低精度算术降低了所需的资源,具有以下好处:

  1. 减少所需的内存量。 半精度浮点格式(FP16)使用16位,而单精度float(FP32)使用32位。 降低所需的内存可以训练更大的模型或训练时使用更大的batch size。
  2. 缩短训练或推理时间。计算的次数或者数据存储十分影响算法的执行时间。半精度使用单精度的一半内存访问,从而降低了在存储层方面所花费的时间。 与单精度相比,NVIDIA GPU的半精度算术吞吐量最多提高了8倍,从而加快了数学受限层的速度。

混合精度训练的流程

关于半精度fp16的混合训练fp16fp16&fp32混合精度训练
  1. 使用fp16的输入
  2. 前向计算:该场景中使用统一的fp32格式的初始化权重,训练时恢复checkpoint中的变量进行训练;将恢复的fp32参数转化为fp16供给给前向运算
  3. loss计算:该场景中loss计算复杂,涉及到许多指数、对数等,可能会发生fp16溢出,因此loss计算在fp32精度下进行
  4. loss scale:将计算出来的loss乘一个比例因子 scale_loss = loss * loss_scale,幅度较小时转换到fp16可能就变成了0,因此要先放大,使其在fp16的范围内
  5. 反向计算:grads = tf.gradient(scaled_loss,params,aggregation_method = aggmeth)
  6. 梯度计算完成后再将各梯度缩小相应倍数:unscaled_grads = [(grad * (1./loss_scale)) for grad in grads]
  7. 梯度规约:累加很多fp16数值容易造成数据溢出,选择在fp32下规约
  8. 参数更新:根据梯度是否溢出选择是否进行参数更新,并动态调整loss_scale,若更新,直接在fp32精度的参数上进行参数更新。由于该场景中就是使用fp32的参数,更新时直接用用于改参数即可

继续阅读