d precision 混合精度訓練

2021-08-15 14:53:55 字數 613 閱讀 6499

意思是使用fp16進行訓練,同時有乙份fp32的引數主副本用於引數更新.那麼實現上其實就很簡單,只需要在每次迭代之前,將每個layer或者op的引數輸入都確保是從fp32拉取到的,然後轉換成fp16輸入;而最後將計算得到梯度,則是更新到fp32的主副本上面.這樣做的好處在於可以避免兩種情況下的溢位,第一次就是當梯度特別小,超出fp16表達範圍後,就變成了0,進而導致引數無法學習.另外一種情況就是梯度特別大,同樣超出fp16可表達的最大值,那麼更新後進一步導致引數不正確.而如果將更新到fp32的主副本,那麼更新採用fp32,即使再小的梯度,也能夠表示.

這個操作原理是借助求導的連式法則,通過放大loss,進而放大整個反向傳播過程的引數梯度,最後在更新時候再縮放回來.這個引數可以固定,也可以根據網路的學習的狀態自適應的進行調整.

其實在實現前面兩個之後我們會發現有些操作還是沒法正常訓練,因為一些中間結果超出了fp32所表達發範圍,那麼針對這樣的操作,我們則需要單獨進行處理,直接使用fp32的引數,將計算過程強制使用fp32.

以上是**所提到的兩個主要trick, 來避免由於梯度過大或者過小導致的資訊丟失而影響精度.另外還對單純使用fp16進行模型訓練,分析了個別網路無法學習或者出現模型精度下降的原因.

這次先整理到這,後續會持續更新....

Apex 一鍵混合雙精度計算

針對單一optimizer使能amp 對於單一optimizer,使能amp只需要以下修改兩部分即可 1.中optimizer之後新增 optimizer some optimizer from apex import amp amp handle amp.init 2.修改 中反向迭代部分 do ...

工作筆記 基於Apex的混合精度加速

from apex import amp model,optimizer amp.initialize model,optimizer,opt level o1 not 01 with amp.scale loss loss,optimizer as scaled loss scaled loss....

3模型大小 混合精度對模型訓練和推理的影響

計算機使用0 1來標識資訊,每個0或每個1代表乙個bit。資訊一般會以下面的三種形式表示 1 字串 字串的最小單元是char,每個char佔8個bit,也就是1個byte。比如字串 abc 這三個字元組成的串占用的儲存空間 儲存空間 1x3 3 bytes 24 bits 2 整數整數包括int4 ...