<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在pytorch訓練過程中突然out of memory。
1. 測試的時候爆視訊記憶體有可能是忘記設定no_grad
加入 with torch.no_grad()
model.eval() with torch.no_grad(): for idx, (data, target) in enumerate(data_loader): if args.gpu != -1: data, target = data.to(args.device), target.to(args.device) log_probs = net_g(data) probs.append(log_probs) # sum up batch loss test_loss += F.cross_entropy(log_probs, target, reduction='sum').item() # get the index of the max log-probability y_pred = log_probs.data.max(1, keepdim=True)[1] correct += y_pred.eq(target.data.view_as(y_pred)).long().cpu().sum()
2. loss.item()
寫成loss_train = loss_train + loss.item(),不能直接寫loss_train = loss_train + loss
3. 在程式碼中新增以下兩行:
torch.backends.cudnn.enabled = True torch.backends.cudnn.benchmark = True
4. del操作後再加上torch.cuda.empty_cache()
單獨使用del、torch.cuda.empty_cache()效果都不明顯,因為empty_cache()不會釋放還被佔用的記憶體。
所以這裡使用了del讓對應資料成為“沒標籤”的垃圾,之後這些垃圾所佔的空間就會被empty_cache()回收。
"""新增了最後兩行,img和segm是影象和標籤輸入,很明顯通過.cuda()已經是被存在在視訊記憶體裡了; outputs是模型的輸出,模型在視訊記憶體裡當然其輸出也在視訊記憶體裡;loss是通過在視訊記憶體裡的segm和 outputs算出來的,其也在視訊記憶體裡。這4個物件都是一次性的,使用後應及時把其從視訊記憶體中清除 (當然如果你視訊記憶體夠大也可以忽略)。""" def train(model, data_loader, batch_size, optimizer): model.train() total_loss = 0 accumulated_steps = 32 // batch_size optimizer.zero_grad() for idx, (img, segm) in enumerate(tqdm(data_loader)): img = img.cuda() segm = segm.cuda() outputs = model(img) loss = criterion(outputs, segm) (loss/accumulated_steps).backward() if (idx + 1 ) % accumulated_steps == 0: optimizer.step() optimizer.zero_grad() total_loss += loss.item() # delete caches del img, segm, outputs, loss torch.cuda.empty_cache()
思路很簡單,就是在程式碼的執行階段輸出視訊記憶體佔用量,觀察在哪一塊存在視訊記憶體劇烈增加或者視訊記憶體異常變化的情況。
但是在這個過程中要分級確認問題點,也即如果存在三個檔案main.py、train.py、model.py。
在此種思路下,應該先在main.py中確定問題點,然後,從main.py中進入到train.py中,再次輸出視訊記憶體佔用量,確定問題點在哪。
隨後,再從train.py中的問題點,進入到model.py中,再次確認。
如果還有更深層次的呼叫,可以繼續追溯下去。
例如:
main.py
def train(model,epochs,data): for e in range(epochs): print("1:{}".format(torch.cuda.memory_allocated(0))) train_epoch(model,data) print("2:{}".format(torch.cuda.memory_allocated(0))) eval(model,data) print("3:{}".format(torch.cuda.memory_allocated(0)))
若1與2之間視訊記憶體增加極為劇烈,說明問題出在train_epoch中,進一步進入到train.py中。
train.py
def train_epoch(model,data): model.train() optim=torch.optimizer() for batch_data in data: print("1:{}".format(torch.cuda.memory_allocated(0))) output=model(batch_data) print("2:{}".format(torch.cuda.memory_allocated(0))) loss=loss(output,data.target) print("3:{}".format(torch.cuda.memory_allocated(0))) optim.zero_grad() print("4:{}".format(torch.cuda.memory_allocated(0))) loss.backward() print("5:{}".format(torch.cuda.memory_allocated(0))) utils.func(model) print("6:{}".format(torch.cuda.memory_allocated(0)))
如果在1,2之間,5,6之間同時出現視訊記憶體增加異常的情況。此時需要使用控制變數法,例如我們先讓5,6之間的程式碼失效,然後執行,觀察是否仍然存在視訊記憶體爆炸。如果沒有,說明問題就出在5,6之間下一級的程式碼中。進入到下一級程式碼,進行偵錯:
utils.py
def func(model): print("1:{}".format(torch.cuda.memory_allocated(0))) a=f1(model) print("2:{}".format(torch.cuda.memory_allocated(0))) b=f2(a) print("3:{}".format(torch.cuda.memory_allocated(0))) c=f3(b) print("4:{}".format(torch.cuda.memory_allocated(0))) d=f4(c) print("5:{}".format(torch.cuda.memory_allocated(0)))
此時我們再展示另一種偵錯思路,先註釋第5行之後的程式碼,觀察視訊記憶體是否存在先訓爆炸,如果沒有,則註釋掉第7行之後的,直至確定哪一行的程式碼出現導致了視訊記憶體爆炸。假設第9行起作用後,程式碼出現視訊記憶體爆炸,說明問題出在第九行,視訊記憶體爆炸的問題鎖定。
參考連結:
http://www.zzvips.com/article/196059.html
https://blog.csdn.net/fish_like_apple/article/details/101448551
到此這篇關於pytorch訓練時的視訊記憶體佔用遞增的問題解決的文章就介紹到這了,更多相關pytorch 視訊記憶體佔用遞增內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45