色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

GPU顯存不足時的各種Trick

深度學習自然語言處理 ? 來源:AINLP ? 作者:老宋的茶書會 ? 2020-08-27 18:08 ? 次閱讀

前言

最近跑的模型都比較大,尤其是Bert, 這真的是難為我 1080ti 了, 在Bert的Example中,官方提供了一些 Trick 來幫助我們加速訓練,很良心, 但感覺還不夠,于是花費一些時間整理出一個 Trick 集合,來幫助我們在顯存不足的時候來嘿嘿嘿。

本文分為兩大部分,第一部分引入一個主題:如何估計模型所需顯存, 第二個主題:GPU顯存不足時的各種 Trick 。

監控 GPU

監控GPU最常用的當然是nvidia-smi,但有一個工具能夠更好的展示信息:gpustat。

nvidia-smi watch --color -n1 gpustat -cpu # 動態事實監控GPU

推薦在配置文件中配置別名,反正我每次gpu一下,信息就全出來了,很方便。

下面有同學推薦nvtop, 我簡單試了試,的確挺好的,展現出現的信息很豐富 , 推薦試一試。

如何估計模型顯存 [1]

首先,思考一個問題:模型中的哪些東西占據了我的顯存,咋就動不動就out of memory?

其實一個模型所占用的顯存主要包含兩部分:模型自身的參數, 優化器參數, 模型每層的輸入輸出。

模型自身參數

模型自身的參數指的就是各個網絡層的 Weight 和Bias,這部分顯存在模型加載完成之后就會被占用, 注意到的是,有些層是有參數的,如CNN, RNN;而有些層是無參數的, 如激活層, 池化層等。

從Pytorch 的角度來說,當你執行model.to(device)是, 你的模型就加載完畢,此時你的模型就已經加載完成了。

對于Pytorch來說,模型參數存儲在model.parameters()中,因此,我們不需要自己計算,完全可以通過Pytorh來直接打印:

print('Model {} : params: {:4f}M'.format(model._get_name(), para * type_size / 1000 / 1000))

優化器參數

優化器參數指的是模型在優化過程即反向傳播中所產生的參數, 這部分參數主要指的就是 dw, 即梯度,在SGD中, 其大小與參數一樣, 因此在優化期間, 模型的參數所占用的顯存會翻倍。

值得注意的是,不同的優化器其所需保存的優化參數不同, 對于 Adam, 由于其還需要保存其余參數, 模型的參數量會在優化區間翻 4 倍。

模型每層的輸入輸出

首先,第一點是輸入數據所占用的顯存, 這部分所占用的顯存其實并不大,這是因為我們往往采用迭代器的方式讀取數據,這意味著我們其實并不是一次性的將所有數據讀入顯存,而這保證每次輸入所占用的顯存與整個網絡參數來比是微不足道的。

然后,在模型進行前向傳播與反向傳播時, 一個很重要的事情就是計算并保存每一層的輸出以及其對應的梯度, 這意味著,這也占據了很大一部分顯存。

最后,模型輸出的顯存占用可以總結為:

每一層的輸出(多維數組), 其對應的梯度, 值得注意的是,模型輸出不需要存儲相應的動量信息(即此處如果使用Adam, 模型輸出的參數量依舊是2倍而不是4倍, 我也不知道為啥??求大佬指教)

輸出的顯存占用與 batch size 成正比

那么有沒有辦法通過Pytorch來計算這部分參數量呢?答案是有的,我們可以假設一個batch的樣本,然后通過model.modules()來對每一層進行遍歷,獲得每一層的輸出shape, 然后就能夠獲得一個batch的數據的輸出參數量。[2]

所有的顯存占用計算

顯存占用 = 模型自身參數 × n + batch size × 輸出參數量 × 2 + 一個batch的輸入數據(往往忽略)

其中,n是根據優化算法來定的,如果選用SGD, 則 n = 2, 如果選擇Adam, 則 n = 4.

一個很棒的實現如下, 我懶得再重新寫了,你可以根據這個改一改,問題不大。

# 模型顯存占用監測函數 # model:輸入的模型 # input:實際中需要輸入的Tensor變量 # type_size 默認為 4 默認類型為 float32 def modelsize(model, input, type_size=4): para = sum([np.prod(list(p.size())) for p in model.parameters()]) print('Model {} : params: {:4f}M'.format(model._get_name(), para * type_size / 1000 / 1000)) input_ = input.clone() input_.requires_grad_(requires_grad=False) mods = list(model.modules()) out_sizes = [] for i in range(1, len(mods)): m = mods[i] if isinstance(m, nn.ReLU): if m.inplace: continue out = m(input_) out_sizes.append(np.array(out.size())) input_ = out total_nums = 0 for i in range(len(out_sizes)): s = out_sizes[i] nums = np.prod(np.array(s)) total_nums += nums print('Model {} : intermedite variables: {:3f} M (without backward)' .format(model._get_name(), total_nums * type_size / 1000 / 1000)) print('Model {} : intermedite variables: {:3f} M (with backward)' .format(model._get_name(), total_nums * type_size*2 / 1000 / 1000))

GPU 顯存不足時的Trick [2]

此處不討論多GPU, 分布式計算等情況,只討論一些常規的 Trick, 會不定時進行更新。

降低batch size

這應該很好理解,適當降低batch size, 則模型每層的輸入輸出就會成線性減少, 效果相當明顯。這里需要注意的一點是, dev batch size的調整也有助于降低顯存, 同時,不要將 dev 或 test 的batch size 設置為樣本集長度, 我最近就干了這個傻事,害的我調試了一天才調出來是這個問題。

選擇更小的數據類型

一般默認情況下, 整個網絡中采用的是32位的浮點數,如果切換到 16位的浮點數,其顯存占用量將接近呈倍數遞減。

精簡模型

在設計模型時,適當的精簡模型,如原來兩層的LSTM轉為一層;原來使用LSTM, 現在使用GRU;減少卷積核數量;盡量少的使用 Linear 等。

數據角度

對于文本數據來說,長序列所帶來的參數量是呈線性增加的, 適當的縮小序列長度可以極大的降低參數量。

total_loss

考慮到 loss 本身是一個包含梯度信息的 tensor, 因此,正確的求損失和的方式為:

total_loss += loss.item()

釋放不需要的張量和變量

采用del釋放你不再需要的張量和變量,這也要求我們在寫模型的時候注意變量的使用,不要隨心所欲,漫天飛舞。

Relu 的 inplace 參數

激活函數Relu()有一個默認參數inplace,默認為Flase, 當設置為True的時候,我們在通過relu()計算得到的新值不會占用新的空間而是直接覆蓋原來的值,這表示設為True, 可以節省一部分顯存。

梯度累積

首先, 要了解一些Pytorch的基本知識:

在Pytorch 中,當我們執行loss.backward()時, 會為每個參數計算梯度,并將其存儲在 paramter.grad 中, 注意到,paramter.grad是一個張量, 其會累加每次計算得到的梯度。

在 Pytorch 中, 只有調用optimizer.step()時才會進行梯度下降更新網絡參數。

我們知道, batch size 與占用顯存息息相關,但有時候我們的batch size 又不能設置的太小,這咋辦呢?答案就是梯度累加。

我們先來看看傳統訓練:

for i,(feature,target) in enumerate(train_loader): outputs = model(feature) # 前向傳播 loss = criterion(outputs,target) # 計算損失 optimizer.zero_grad() # 清空梯度 loss.backward() # 計算梯度 optimizer.step() # 反向傳播, 更新網絡參數

而加入梯度累加之后,代碼是這樣的:

for i,(features,target) in enumerate(train_loader): outputs = model(images) # 前向傳播 loss = criterion(outputs,target) # 計算損失 loss = loss/accumulation_steps # 可選,如果損失要在訓練樣本上取平均 loss.backward() # 計算梯度 if((i+1)%accumulation_steps)==0: optimizer.step() # 反向傳播,更新網絡參數 optimizer.zero_grad() # 清空梯度

其實,這塊有兩種理解方式(受到評論區同學啟發), 我談談在 bert 里面最常見的那種。

比較來看, 我們發現,梯度累加本質上就是累加accumulation_steps個batchsize/accumulationsteps的梯度, 再根據累加的梯度來更新網絡參數,以達到真實梯度類似batch_size的效果。在使用時,需要注意適當的擴大學習率。

更詳細來說, 我們假設batch size = 4,accumulation steps = 8, 梯度積累首先在前向傳播的時候以batch_size=4來計算梯度,但是不更新參數,將梯度積累下來,直到我們計算了accumulation steps個 batch, 我們再更新參數。其實本質上就等價于:

真正的 batch_size = batch_size * accumulation_steps

梯度積累能很大程度上緩解GPU顯存不足的問題,推薦使用。

在Bert的倉庫中,就使用了這個Trick,十分實用,簡直是我們這種乞丐實驗室的良心Trick。

梯度檢查點

這個Trick我沒用過,畢竟模型還沒有那么那么大。

等我用過再更新吧,先把坑挖下。

最后

哎, 如果你看完了這篇文章,就說明了一件事情:小伙子,你卡也不夠啊。哎, 乞丐實驗室不配深度學習,哭了。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7002

    瀏覽量

    88943
  • gpu
    gpu
    +關注

    關注

    28

    文章

    4729

    瀏覽量

    128890
  • 模型
    +關注

    關注

    1

    文章

    3226

    瀏覽量

    48809

原文標題:【經驗分享】GPU 顯存不足怎么辦?

文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    《CST Studio Suite 2024 GPU加速計算指南》

    GPU Computing Guide》是由Dassault Systèmes Deutschland GmbH發布的有關CST Studio Suite 2024的GPU計算指南。涵蓋GPU計算
    發表于 12-16 14:25

    訓練AI大模型需要什么樣的gpu

    訓練AI大模型需要選擇具有強大計算能力、足夠顯存、高效帶寬、良好散熱和能效比以及良好兼容性和擴展性的GPU。在選擇時,需要根據具體需求進行權衡和選擇。
    的頭像 發表于 12-03 10:10 ?104次閱讀

    常見GPU問題及解決方法

    各種問題。以下是一些常見的GPU問題及其解決方法: GPU驅動程序過時或不兼容 問題描述:GPU驅動程序是GPU與操作系統之間的橋梁,負責將
    的頭像 發表于 10-27 14:12 ?1231次閱讀

    顯存技術不斷升級,AI計算中如何選擇合適的顯存

    和推理過程至關重要。足夠的顯存容量能夠確保顯卡在執行AI任務時能夠同時存儲和操作所需的數據,避免因為顯存不足而導致的性能瓶頸。 ? 在AI 計算中如何選擇合適的顯存 ?
    的頭像 發表于 09-11 00:11 ?3026次閱讀

    SK海力士GDDR7顯存性能飆升60%

    全球領先的半導體制造商SK 海力士近日宣布了一項重大突破,正式推出了全球性能巔峰的新一代顯存產品——GDDR7。這款專為圖形處理優化設計的顯存,憑借其前所未有的高速與卓越性能,再次彰顯了SK 海力士在技術創新領域的領先地位。
    的頭像 發表于 08-07 11:20 ?687次閱讀

    暴漲預警!NVIDIA GPU供應大跳水

    gpu
    jf_02331860
    發布于 :2024年07月26日 09:41:42

    伺服電機慣量不足會出現什么現象

    伺服電機是現代工業自動化領域中非常重要的一種驅動設備,它具有高精度、高響應速度、高穩定性等特點。然而,伺服電機在實際應用過程中,由于各種原因,可能會出現慣量不足的問題。本文將詳細分析伺服電機慣量不足
    的頭像 發表于 06-14 10:47 ?1282次閱讀

    美光科技發布新一代GDDR7顯存

    在近日舉行的臺北國際電腦展上,美國存儲芯片巨頭美光科技正式發布了其新一代GDDR7顯存。這款新型GPU顯卡內存基于美光的1βDRAM架構,將內存性能提升至新的高度。
    的頭像 發表于 06-06 09:24 ?436次閱讀

    RTX 5880 Ada Generation GPU與RTX? A6000 GPU對比

    NVIDIA RTX? 5880 Ada Generation GPU 是目前國內重量級 GPU,基于全新 NVIDIA Ada Lovelace 架構構建,采用 4nm 制成工藝,擁有 48GB 的 GDDR6 大顯存
    的頭像 發表于 04-19 10:20 ?1801次閱讀
    RTX 5880 Ada Generation <b class='flag-5'>GPU</b>與RTX? A6000 <b class='flag-5'>GPU</b>對比

    英偉達B100 GPU架構披露,B200或配備288GB顯存

    XpeaGPU透露,B100 GPU將配備兩枚基于此技術的芯片,與此同時,還將連通多達8個HBM3e顯存堆棧,總容量高達192GB。AMD同樣已有提供同量級的產品,并且在Instinct MI300 GPU上配置了8個HBM3芯
    的頭像 發表于 03-18 14:16 ?1310次閱讀

    NVIDIA RTX 5090痛失512位顯存

    NVIDIA有望在今年底或明年初發布下一代RTX 50系列顯卡,大概率首發配備新一代GDDR7顯存,但是顯存位寬和之前的說法不太一樣。
    的頭像 發表于 03-11 16:02 ?850次閱讀
    NVIDIA RTX 5090痛失512位<b class='flag-5'>顯存</b>!

    英偉達、AMD新款顯卡或仍配備2GB GDDR7顯存

    據悉,現行GDDR6顯存每模塊采用8GB顯存容量,對此,@kopite7kimi援引內部消息稱,英偉達即將發布的GeForce RTX 5090顯卡并無內存翻倍的可能性。
    的頭像 發表于 03-08 14:54 ?705次閱讀

    Stm32mp135打開cache之后,用作ltdc的顯存地址數據就會異常怎么解決?

    各位大佬好,本人在Stm32mp135的裸機開發過程中發現,有幾個問題需要請教大家。 1-打開cache之后,用作ltdc的顯存地址數據就會異常(屏幕刷新異常),請問有沒有類型M7系列的mpu保護
    發表于 03-07 07:55

    為什么低端獨立顯卡通常都標配2GB的顯存

    為什么低端獨立顯卡通常都標配2GB的顯存? 低端獨立顯卡通常都標配2GB的顯存,這是因為在低端市場中,2GB的顯存已經能夠滿足絕大多數用戶的需求。下面詳細解釋一下為什么低端獨立顯卡通常都標配2GB
    的頭像 發表于 01-09 14:14 ?786次閱讀

    中國GPU供應不足與銷量同時出現下滑

    根據Board Channels的一份報告,從10月到11月,中國顯卡市場下降了8%,在八大顯卡制造商中,由于實體店銷量不足,使得整體出貨狀態呈下降趨勢。
    發表于 12-25 15:10 ?457次閱讀
    中國<b class='flag-5'>GPU</b>供應<b class='flag-5'>不足</b>與銷量同時出現下滑
    主站蜘蛛池模板: 在线 | 果冻国产传媒61国产免费| 国产成人无码一区AV在线观看| 久久久无码精品亚洲欧美| 婷婷四房播客五月天| 变态露出野外调教| 免费视频国产在线观看网站| 越南女子杂交内射BBWXZ| 果冻传媒视频在线播放 免费观看| 特黄特色大片免费播放器9| 成人午夜剧场| 桥本有菜黑丝| 99热国产这里只有精品6| 美女议员被泄裸照| 1a级毛片免费观看| 另类专区hy777| 中文字幕在线观看亚洲| 久久亚洲国产中文字幕| 伊人情涩网| 久久久久久久久亚洲| 在线视频网站www色| 久久免费视频| 中文中幕无码亚洲在线| 看免费人成va视频全| 51无码人妻精品1国产| 一区二区三区四区国产| 久久99精品国产麻豆婷婷| 夜色福利院在线观看免费| 久久yy99re66| 18日本人XXXXXX18| 免费毛片播放| 啊…嗯啊好深男男高h文总受| 秋霞三级理伦免费观看| 大香网伊人久久综合网2020| 日日射夜夜干夜夜插在线播放| 芳草地社区在线视频| 无码国产成人午夜在线观看不卡| 国产成人在线播放视频| 亚洲AV无码一区二区色情蜜芽 | 久亚洲AV无码专区A片| 最新国自产拍天天更新| 男人插曲女人的叫声|