chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

3天內(nèi)不再提示

GPU顯存不足時的各種Trick

深度學習自然語言處理 ? 來源:AINLP ? 作者:老宋的茶書會 ? 2020-08-27 18:08 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

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

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

監(jiān)控 GPU

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

nvidia-smi watch --color -n1 gpustat -cpu # 動態(tài)事實監(jiān)控GPU

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

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

如何估計模型顯存 [1]

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

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

模型自身參數(shù)

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

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

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

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

優(yōu)化器參數(shù)

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

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

模型每層的輸入輸出

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

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

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

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

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

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

所有的顯存占用計算

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

其中,n是根據(jù)優(yōu)化算法來定的,如果選用SGD, 則 n = 2, 如果選擇Adam, 則 n = 4.

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

# 模型顯存占用監(jiān)測函數(shù) # 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, 分布式計算等情況,只討論一些常規(guī)的 Trick, 會不定時進行更新。

降低batch size

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

選擇更小的數(shù)據(jù)類型

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

精簡模型

在設計模型時,適當?shù)木喣P停缭瓉韮蓪拥腖STM轉(zhuǎn)為一層;原來使用LSTM, 現(xiàn)在使用GRU;減少卷積核數(shù)量;盡量少的使用 Linear 等。

數(shù)據(jù)角度

對于文本數(shù)據(jù)來說,長序列所帶來的參數(shù)量是呈線性增加的, 適當?shù)目s小序列長度可以極大的降低參數(shù)量。

total_loss

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

total_loss += loss.item()

釋放不需要的張量和變量

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

Relu 的 inplace 參數(shù)

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

梯度累積

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

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

在 Pytorch 中, 只有調(diào)用optimizer.step()時才會進行梯度下降更新網(wǎng)絡參數(shù)。

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

我們先來看看傳統(tǒng)訓練:

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

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

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() # 反向傳播,更新網(wǎng)絡參數(shù) optimizer.zero_grad() # 清空梯度

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

比較來看, 我們發(fā)現(xiàn),梯度累加本質(zhì)上就是累加accumulation_steps個batchsize/accumulationsteps的梯度, 再根據(jù)累加的梯度來更新網(wǎng)絡參數(shù),以達到真實梯度類似batch_size的效果。在使用時,需要注意適當?shù)臄U大學習率。

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

真正的 batch_size = batch_size * accumulation_steps

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

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

梯度檢查點

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

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

最后

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)

    關注

    8

    文章

    7315

    瀏覽量

    94002
  • gpu
    gpu
    +關注

    關注

    28

    文章

    5102

    瀏覽量

    134485
  • 模型
    +關注

    關注

    1

    文章

    3650

    瀏覽量

    51721

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    借助NVIDIA Megatron-Core大模型訓練框架提高顯存使用效率

    隨著模型規(guī)模邁入百億、千億甚至萬億參數(shù)級別,如何在有限顯存中“塞下”訓練任務,對研發(fā)和運維團隊都是巨大挑戰(zhàn)。NVIDIA Megatron-Core 作為流行的大模型訓練框架,提供了靈活高效的并行化
    的頭像 發(fā)表于 10-21 10:55 ?816次閱讀
    借助NVIDIA Megatron-Core大模型訓練框架提高<b class='flag-5'>顯存</b>使用效率

    如何看懂GPU架構(gòu)?一分鐘帶你了解GPU參數(shù)指標

    GPU架構(gòu)參數(shù)如CUDA核心數(shù)、顯存帶寬、TensorTFLOPS、互聯(lián)方式等,并非“冰冷的數(shù)字”,而是直接關系設備能否滿足需求、如何發(fā)揮最大價值、是否避免資源浪費等問題的核心要素。本篇文章將全面
    的頭像 發(fā)表于 10-09 09:28 ?610次閱讀
    如何看懂<b class='flag-5'>GPU</b>架構(gòu)?一分鐘帶你了解<b class='flag-5'>GPU</b>參數(shù)指標

    國產(chǎn)全功能GPU新標桿:芯動科技“風華3號”重塑技術(shù)邊界

    革命者”三大標簽,在AI計算、圖形渲染、行業(yè)應用等領域?qū)崿F(xiàn)全面突破,標志著我國在高性能GPU領域邁入國際先進行列。 ? ? 大模型算力天花板:112GB顯存重構(gòu)AI訓練范式 ? “風華3號”最引人注目的突破在于其112GB超大容量高帶寬
    的頭像 發(fā)表于 09-26 15:43 ?6962次閱讀
    國產(chǎn)全功能<b class='flag-5'>GPU</b>新標桿:芯動科技“風華3號”重塑技術(shù)邊界

    aicube的n卡gpu索引該如何添加?

    請問有人知道aicube怎樣才能讀取n卡的gpu索引呢,我已經(jīng)安裝了cuda和cudnn,在全局的py里添加了torch,能夠調(diào)用gpu,當還是只能看到默認的gpu0,顯示不了gpu1
    發(fā)表于 07-25 08:18

    大模型推理顯存和計算量估計方法研究

    方法。 一、引言 大模型推理是指在已知輸入數(shù)據(jù)的情況下,通過深度學習模型進行預測或分類的過程。然而,大模型的推理過程對顯存和計算資源的需求較高,這給實際應用帶來了以下挑戰(zhàn): 顯存不足:大模型在推理
    發(fā)表于 07-03 19:43

    算力時代,你的GPU選對了嗎?三張表看清專業(yè)卡與消費卡的本質(zhì)差異

    顯存大小只是冰山一角,單/雙精度算力才是決定GPU真實性能的關鍵。一、顯存越大越好?警惕選購陷阱許多用戶在挑選GPU時,第一眼總盯著顯存容量
    的頭像 發(fā)表于 06-20 18:32 ?2207次閱讀
    算力時代,你的<b class='flag-5'>GPU</b>選對了嗎?三張表看清專業(yè)卡與消費卡的本質(zhì)差異

    可以手動構(gòu)建imx-gpu-viv嗎?

    使用 imx-gpu-viv-6.4.3.p4.2.aarch64.bin。 https://www.nxp.com/lgfiles/NMG/MAD/YOCTO//imx-gpu-viv-6.4.3.p4.2-aarch64.bin 我需要
    發(fā)表于 03-28 06:35

    無法在GPU上運行ONNX模型的Benchmark_app怎么解決?

    在 CPU 和 GPU 上運行OpenVINO? 2023.0 Benchmark_app推斷的 ONNX 模型。 在 CPU 上推理成功,但在 GPU 上失敗。
    發(fā)表于 03-06 08:02

    OpenVINO?檢測到GPU,但網(wǎng)絡無法加載到GPU插件,為什么?

    OpenVINO?安裝在舊的 Windows 10 版本 Windows? 10 (RS1) 上。 已安裝 GPU 驅(qū)動程序版本 25.20.100.6373,檢測到 GPU,但網(wǎng)絡無法加載
    發(fā)表于 03-05 06:01

    GPU 性能原理拆解

    「迷思」是指經(jīng)由人們口口相傳,但又難以證明證偽的現(xiàn)象。由于GPU硬件實現(xiàn)、驅(qū)動實現(xiàn)是一個黑盒,我們只能通過廠商提供的API、經(jīng)過抽象的架構(gòu)來了解并猜測其原理。因此坊間流傳著各種關于與GPU打交道
    的頭像 發(fā)表于 02-08 14:29 ?1011次閱讀
    <b class='flag-5'>GPU</b> 性能原理拆解

    GPU-Z迎來2.62 版本的更新發(fā)布

    -Z 實現(xiàn)了對基于 Blackwell 架構(gòu)的 RTX 5090 和 RTX 5080 顯卡的全面支持。這意味著,用戶通過 GPU-Z 能夠詳細了解這兩款顯卡的各項參數(shù),包括核心頻率、顯存頻率、功耗等關鍵信息
    的頭像 發(fā)表于 02-05 15:33 ?1094次閱讀

    GPU按需計費的優(yōu)勢

    GPU按需計費,是指用戶根據(jù)實際使用的GPU資源和時間進行費用結(jié)算,而非傳統(tǒng)的一次性購買或固定租賃模式。以下,是對GPU按需計費優(yōu)勢的總結(jié),由AI部落小編整理。
    的頭像 發(fā)表于 01-14 10:43 ?643次閱讀

    英特爾2025上半年或推24GB顯存銳炫B580顯卡

    近日,據(jù)最新報道,英特爾正緊鑼密鼓地籌備其顯卡產(chǎn)品的又一力作,計劃在2025年上半年正式推出配備24GB超大顯存的“Battlemage”架構(gòu)獨立顯卡,市場型號預計為銳炫B580 24GB。 這款
    的頭像 發(fā)表于 01-02 11:07 ?1741次閱讀

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

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