float32精度_混合精度对模型训练和推理的影响
單精度/雙精度/半精度/混合精度
計算機使用0/1來標識信息,每個0或每個1代表一個bit。信息一般會以下面的三種形式表示:
1 字符串
字符串的最小單元是char,每個char占8個bit,也就是1個byte。比如字符串“abc”這三個字符組成的串占用的存儲空間:
存儲空間=1x3=3(bytes)=24(bits)2 整數
整數包括INT4、INT8、INT16、INT32、INT64,INT后面的數值表示該整數類型占用的byte個數。
3 浮點數
浮點數包括Float16、Float32、Float64,同樣,Float后面的數字表示該浮點型占用byte的個數。而這三種浮點數又有個不同的名字:
- 半精度浮點數:Float16
- 單精度浮點數:Float32
- 雙精度浮點數:Float64
有了上面單精度、雙精度、混合精度三種形式的解釋,混合精度就很好理解了。就是計算中存在不同精度的浮點數,比如:
Float16+Float32混合精度的優點
先說結論:
壓縮模型大小
我們一般模型訓練使用的是Float32,那換成混合精度有什么好處呢?為了更好理解,我們將Float32的模型參數都換成Float16. 在參數數目不變的情況下,將Float32的參數都更換成Float16后,模型占用的內存就變成了之前的一半。所以,混合精度最直觀的優點就是能夠壓縮模型的大小。
前面為了好理解,將Float32全都轉成了Float16,但在實際的模型訓練中,Float16因為能表示的精度有限,會導致數據溢出(超出能表示的范圍),所以,只能部分操作用Float16,部分操作用Float32.最終導致混合精度的提出。
混合精度比較經典的論文是這篇:
Mixed Precision Training
論文介紹了混合精度在模型訓練中的方法,并在多個訓練場景中證實,混合精度相對于完全Float32的模型的參數訓練,最終的算法效果影響不大。
混合精度對模型訓練和推理速度的影響
先說結論:
理論上沒有提升,反而會下降。但在結合計算平臺特性,訓練和推理速度會有提升
理論上混合精度只能壓縮模型的大小,在訓練階段和推理階段,都能能大大緩解CPU內存或GPU顯存限制對模型訓練壓力。
因為模型結構和參數數量沒有發生顯著的變化(忽略混合精度對模型訓練,參數更新的影響),理論上訓練和推理速度應該不會有大的改變。而且,因為不同的精度需要進行對齊再運算(計算時,先將不同的精度轉變成統一的精度后,再進行計算),返回導致計算效率降低,從而會導致訓練和推理的速度降低。
但實際上計算平臺對這種特殊的計算場景一般都有專門的硬件計算加速,比如:
1 具備專用的半精度計算單元
GPU針對Float16、Float32運算,都有專門的計算單元。
2 單精度支持兩個半精度計算同時進行
比如,英偉達的GPU Tesla P100支持在一個Float32里同時進行2次Float16的半精度浮點計算,所以對于半精度的理論峰值可以達到單精度浮點數計算能力的兩倍。
3 TensorCore
英偉達的瓦特(如Tesla V100)和圖靈架構(如Tesla T4)都具備TensorCore單元,能完成單指令的混合精度矩陣乘加運算。
混合精度的實際表現
我們以英偉達開源的BERT評測對比下:
模型訓練:
模型推理:
總結
混合精度可以明顯的對模型的大小進行壓縮(內存占用),同時,針對優化的計算平臺,在模型訓練和推理的速度方面也都有提升。
參考文檔:
《Nvidia GPU的浮點計算能力》
《Nvidia BERT評測》
總結
以上是生活随笔為你收集整理的float32精度_混合精度对模型训练和推理的影响的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cloud自动发卡平台cloudfaka
- 下一篇: python开发小型数据库_python