天天看點

關于半精度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的參數,更新時直接用用于改參數即可

繼續閱讀