關于半精度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+精度位)
優點
- TensorRT的FP16與FP32相比能有接近一倍的速度提升168,前提是GPU支援FP16(如最新的2070,2080,2080ti等)
- 減少顯存。
缺點
會造成溢出(是以,在日常使用過程中,常使用雙混合精度訓練)
fp16&fp32混合精度訓練
混合精度訓練的好處
深度神經網絡(DNN)在許多領域都取得了突破,複雜性一直在增加,增加了訓練這些網絡所需的計算資源。 混合精度訓練通過使用低精度算術降低了所需的資源,具有以下好處:
- 減少所需的記憶體量。 半精度浮點格式(FP16)使用16位,而單精度float(FP32)使用32位。 降低所需的記憶體可以訓練更大的模型或訓練時使用更大的batch size。
- 縮短訓練或推理時間。計算的次數或者資料存儲十分影響算法的執行時間。半精度使用單精度的一半記憶體通路,進而降低了在存儲層方面所花費的時間。 與單精度相比,NVIDIA GPU的半精度算術吞吐量最多提高了8倍,進而加快了數學受限層的速度。
混合精度訓練的流程
- 使用fp16的輸入
- 前向計算:該場景中使用統一的fp32格式的初始化權重,訓練時恢複checkpoint中的變量進行訓練;将恢複的fp32參數轉化為fp16供給給前向運算
- loss計算:該場景中loss計算複雜,涉及到許多指數、對數等,可能會發生fp16溢出,是以loss計算在fp32精度下進行
- loss scale:将計算出來的loss乘一個比例因子 scale_loss = loss * loss_scale,幅度較小時轉換到fp16可能就變成了0,是以要先放大,使其在fp16的範圍内
- 反向計算:grads = tf.gradient(scaled_loss,params,aggregation_method = aggmeth)
- 梯度計算完成後再将各梯度縮小相應倍數:unscaled_grads = [(grad * (1./loss_scale)) for grad in grads]
- 梯度規約:累加很多fp16數值容易造成資料溢出,選擇在fp32下規約
- 參數更新:根據梯度是否溢出選擇是否進行參數更新,并動态調整loss_scale,若更新,直接在fp32精度的參數上進行參數更新。由于該場景中就是使用fp32的參數,更新時直接用用于改參數即可