PyTorch-混合精度訓(xùn)練(Mixed-Precisioin Training)

混合精度訓(xùn)練介紹

Mixed-Precision Training是指在深度學(xué)習(xí)AI模型訓(xùn)練過程中不同的層Layer采用不同的數(shù)據(jù)精度進(jìn)行訓(xùn)練仿村, 最終使得訓(xùn)練過程中的資源消耗(GPU顯存绕娘,GPU 算力)降低缴啡, 同時(shí)保證訓(xùn)練可收斂纠修,模型精度與高精度FP32的結(jié)果接近撵溃。


CNN ResNet 混合精度訓(xùn)練

  1. 導(dǎo)入torch.cuda.amp package
    由于CNN訓(xùn)練要求大量算力绣否, 因此一般混合精度需要使用 NVIDIA Automatic Mixed Precision (AMP)包泞当, NVIDIA的AMP以及集成到了Pyorch, 因此直接調(diào)用 torch.cuda.amp APIs.

混合精度主要用到 Loss-Scaling (損失縮放) + Auto-cast (自動(dòng)精度選擇/轉(zhuǎn)換)

# Mixed-Precision Training
from torch.cuda.amp.grad_scaler import GradScaler
from torch.cuda.amp.autocast_mode import autocast

# 實(shí)例化一個(gè)GradeScaler對(duì)象
scaler = GradScaler()
  1. 對(duì)Training Loop進(jìn)行修改, 修改2個(gè)地方
  • 添加autocast(): autocast是一個(gè)Python context Manager, autocast 作用區(qū)域的代碼在運(yùn)行的時(shí)候會(huì)跟據(jù)OP的類型奇颠,自動(dòng)轉(zhuǎn)換為預(yù)定義好的低精度類型 (比如FP16)
    *注意: autocast一般作用的代碼區(qū)域?yàn)?Forward, Backward 階段需要指定autocast, 因此在Forward階段不同的layer (op)以及被設(shè)置了各自的精度模式败去, 在Backward階段,采用和Forward相同的精度進(jìn)行計(jì)算烈拒。

  • 添加GradeScalar: GradeScalar的目的是對(duì)權(quán)重的梯度矩陣值G_W進(jìn)行縮放(擴(kuò)大化), 因?yàn)橐话闱闆r下G_W的值非常小为迈,如果采用低精度類型 (FP16),則導(dǎo)致G_W下溢underflow. 解決方法之一就是希望將 G_W進(jìn)行縮放變大; 由于Loss函數(shù)導(dǎo)數(shù)具有線性性質(zhì)缺菌, 因此也可以對(duì) Loss進(jìn)行縮放葫辐,實(shí)際等價(jià)于對(duì)梯度值進(jìn)行了放大。

 for i, (images, target) in enumerate(train_loader):
        # measure data loading time
        data_time.update(time.time() - end)

        # move data to the same device as model
        images = images.to(device, non_blocking=True)
        target = target.to(device, non_blocking=True)

        # compute output
        with autocast(enabled=args.mixed_precision, dtype=torch.float16):
                output = model(images)
                loss = criterion(output, target)

        # measure accuracy and record loss
        acc1, acc5 = accuracy(output, target, topk=(1, 5))
        # losses.update(loss.item(), images.size(0))
        top1.update(acc1[0], images.size(0))
        top5.update(acc5[0], images.size(0))

        # compute gradient and do SGD step
        optimizer.zero_grad()
        # loss.backward()
        # optimizer.step()
        scaler.scale(loss).backward()
        scaler.step(optimizer)
        scaler.update()
         ...

為了便于觀察訓(xùn)練過程伴郁, 在代碼中添加了Pytorch Profiler進(jìn)行可視化:
為了說明情況耿战, 可以只跑少數(shù)的幾個(gè)batch即可

image.png
image.png
image.png

對(duì)應(yīng)的CUDA kernel函數(shù), FP16類型的


image.png

采用BFLOAT16進(jìn)行混合精度

方法很簡單焊傅,在autocast的dtype設(shè)置為torch.bfloat16剂陡。 除此之外,需要采用支持BFLOAT16類型的計(jì)算設(shè)備(TPU狐胎, >=NVIDIA Ampere/Volta 架構(gòu)的GPU, 比如NVIDIA V100, A100, RTX 30/40系列)

with autocast(enabled=args.mixed_precision, dtype=torch.bfloat16):
                output = model(images)
                loss = criterion(output, target)
image.png

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸭栖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子握巢,更是在濱河造成了極大的恐慌晕鹊,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暴浦,死亡現(xiàn)場(chǎng)離奇詭異溅话,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)歌焦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門飞几,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人独撇,你說我怎么就攤上這事屑墨。” “怎么了纷铣?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵卵史,是天一觀的道長。 經(jīng)常有香客問我关炼,道長程腹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任儒拂,我火速辦了婚禮寸潦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘社痛。我一直安慰自己见转,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布蒜哀。 她就那樣靜靜地躺著斩箫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪撵儿。 梳的紋絲不亂的頭發(fā)上乘客,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音淀歇,去河邊找鬼易核。 笑死,一個(gè)胖子當(dāng)著我的面吹牛浪默,可吹牛的內(nèi)容都是我干的牡直。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼纳决,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼碰逸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起阔加,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤饵史,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后胜榔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體约急,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年苗分,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了厌蔽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摔癣,死狀恐怖奴饮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情择浊,我是刑警寧澤戴卜,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站琢岩,受9級(jí)特大地震影響投剥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜担孔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一江锨、第九天 我趴在偏房一處隱蔽的房頂上張望吃警。 院中可真熱鬧,春花似錦啄育、人聲如沸酌心。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽安券。三九已至,卻和暖如春氓英,著一層夾襖步出監(jiān)牢的瞬間侯勉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工铝阐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留址貌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓饰迹,卻偏偏與公主長得像芳誓,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子啊鸭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容