自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

計算 Python 代碼的內(nèi)存和模型顯存消耗的小技巧

開發(fā) 后端
了解Python代碼的內(nèi)存消耗是每一個開發(fā)人員都必須要解決的問題,這個問題不僅在我們使用pandas讀取和處理CSV文件的時候非常重要,在我們使用GPU訓(xùn)練的時候還需要規(guī)劃GPU的內(nèi)存使用。尤其是我們在白嫖使用kaggle和colab時顯得更為重要。

本篇文章我們將介紹兩個 Python 庫 memory_profiler和Pytorch-Memory-Utils這兩個庫可以幫助我們了解內(nèi)存和顯存的消耗。

[[441124]]

memory_profiler

 

  1. pip install memory_profiler#Load its magic function 
  2. %load_ext memory_profiler 
  3. from memory_profiler import profile 

 

memory_profiler可以完成以下的工作:

1、查找一行的內(nèi)存消耗

我們只需要在代碼的前面加上魔法函數(shù) %memit

 

  1. %memit x = 10+5 
  2. #Output 
  3. peak memory: 54.01 MiB, increment: 0.27 MiB 

 

這里,峰值內(nèi)存(peak memory)是運行此代碼的進(jìn)程消耗的內(nèi)存。增量只是由于添加這行代碼而需要/消耗的內(nèi)存。同樣的邏輯也適用于以下其他的顯示。

2、查找函數(shù)的內(nèi)存消耗

在調(diào)用函數(shù)的行的開頭添加魔法函數(shù)。

 

  1. def addition(): 
  2.     a = [1] * (10 ** 1) 
  3.     b = [2] * (3 * 10 ** 2) 
  4.     sum = a+b 
  5.     return sum 
  6.  
  7. %memit addition() 
  8. #Output 
  9. peak memory: 36.36 MiB, increment: 0.01 MiB 

 

3、逐行查找函數(shù)的內(nèi)存消耗

如果需要記錄函數(shù)中每一行的內(nèi)存使用,我們可以使用@profile 裝飾器。 但是@profile 僅適用于在單獨模塊中定義的函數(shù),因此我們將首先使用 %%file 創(chuàng)建一個名為 demo.py 的簡單模塊,其中包含我們的函數(shù)

 

  1. %%file demo.py 
  2. from memory_profiler import profile 
  3.  
  4. @profile 
  5. def addition(): 
  6.     a = [1] * (10 ** 1) 
  7.     b = [2] * (3 * 10 ** 2) 
  8.     sum = a+b 
  9.     return sum 

 

現(xiàn)在,我們可以調(diào)用該函數(shù)

 

  1. from demo import addition 
  2.  
  3. %memit addition() 
  4.  
  5. #Output 
  6. Line #    Mem usage    Increment   Line Contents 
  7. ================================================ 
  8.      2     36.4 MiB     36.4 MiB   @profile 
  9.      3                             def addition(): 
  10.      4     36.4 MiB      0.0 MiB       a = [1] * (10 ** 1) 
  11.      5   3851.1 MiB   3814.7 MiB       b = [2] * (3 * 10 ** 2) 
  12.      6   7665.9 MiB   3814.8 MiB       sum = a+b 
  13.      7   7665.9 MiB      0.0 MiB       return sum 
  14. peak memory: 7665.88 MiB, increment: 7629.52 MiB 

 

4、完整python腳本的內(nèi)存消耗

這個這個方法不能再 notebook 中使用。我們必須創(chuàng)建 python 腳本并通過命令行運行它。

 

  1. #create script.py 
  2. import time 
  3.  
  4. @profile 
  5. def function1(): 
  6.     n = 100000 
  7.     a = [1] * n 
  8.     time.sleep(1) 
  9.     return a 
  10.      
  11. @profile 
  12. def function2(): 
  13.     n = 200000 
  14.     b = [1] * n 
  15.     time.sleep(1) 
  16.     return b 
  17.  
  18. if __name__ == "__main__"
  19.     function1() 
  20.     function2() 

 

之后運行腳本并查看

 

  1. #On command line 
  2. mprof run script.py 
  3. #To generate plot  
  4. mprof plot 

 

我們可以看到內(nèi)存消耗與時間的關(guān)系圖

 

計算 Python 代碼的內(nèi)存和模型顯存消耗的小技巧

 

@profile裝飾器沒有必要放在函數(shù)前面,如果我們不保留它,我們不會看到函數(shù)級內(nèi)存消耗,但我們會看到整個腳本的內(nèi)存消耗

 

計算 Python 代碼的內(nèi)存和模型顯存消耗的小技巧

 

Pytorch-Memory-Utils

通過Pytorch-Memory-Utils工具,我們在使用顯存的代碼中間插入檢測函數(shù),這樣就可以輸出在當(dāng)前行代碼時所占用的顯存。這個對于我們計算模型的GPU顯存占用是非常方便的,通過計算顯存占用,我們才能夠最大化訓(xùn)練的batch size,保證訓(xùn)練的最優(yōu)速度。

 

  1. import torch 
  2. import inspect 
  3.  
  4. from torchvision import models 
  5. from gpu_mem_track import MemTracker  # 引用顯存跟蹤代碼 
  6.  
  7. device = torch.device('cuda:0'
  8.  
  9. frame = inspect.currentframe()      
  10. gpu_tracker = MemTracker(frame)      # 創(chuàng)建顯存檢測對象 
  11.  
  12. gpu_tracker.track()                  # 開始檢測 
  13. cnn = models.vgg19(pretrained=True).to(device)  # 導(dǎo)入VGG19模型并且將數(shù)據(jù)轉(zhuǎn)到顯存中 
  14. gpu_tracker.track() 

 

然后可以發(fā)現(xiàn)程序運行過程中的顯存變化(第一行是載入前的顯存,最后一行是載入后的顯存):

 

  1. At __main__ <module>: line 13                        Total Used Memory:472.2  Mb 
  2.  
  3. + | 1 * Size:(128, 64, 3, 3)      | Memory: 0.2949 M | <class 'torch.nn.parameter.Parameter'
  4. + | 1 * Size:(256, 128, 3, 3)     | Memory: 1.1796 M | <class 'torch.nn.parameter.Parameter'
  5. + | 1 * Size:(64, 64, 3, 3)       | Memory: 0.1474 M | <class 'torch.nn.parameter.Parameter'
  6. + | 2 * Size:(4096,)              | Memory: 0.0327 M | <class 'torch.nn.parameter.Parameter'
  7. + | 1 * Size:(512, 256, 3, 3)     | Memory: 4.7185 M | <class 'torch.nn.parameter.Parameter'
  8. + | 2 * Size:(128,)               | Memory: 0.0010 M | <class 'torch.nn.parameter.Parameter'
  9. + | 1 * Size:(1000, 4096)         | Memory: 16.384 M | <class 'torch.nn.parameter.Parameter'
  10. + | 6 * Size:(512,)               | Memory: 0.0122 M | <class 'torch.nn.parameter.Parameter'
  11. + | 1 * Size:(64, 3, 3, 3)        | Memory: 0.0069 M | <class 'torch.nn.parameter.Parameter'
  12. + | 1 * Size:(4096, 25088)        | Memory: 411.04 M | <class 'torch.nn.parameter.Parameter'
  13. + | 1 * Size:(4096, 4096)         | Memory: 67.108 M | <class 'torch.nn.parameter.Parameter'
  14. + | 5 * Size:(512, 512, 3, 3)     | Memory: 47.185 M | <class 'torch.nn.parameter.Parameter'
  15. + | 2 * Size:(64,)                | Memory: 0.0005 M | <class 'torch.nn.parameter.Parameter'
  16. + | 3 * Size:(256,)               | Memory: 0.0030 M | <class 'torch.nn.parameter.Parameter'
  17. + | 1 * Size:(128, 128, 3, 3)     | Memory: 0.5898 M | <class 'torch.nn.parameter.Parameter'
  18. + | 2 * Size:(256, 256, 3, 3)     | Memory: 4.7185 M | <class 'torch.nn.parameter.Parameter'
  19. + | 1 * Size:(1000,)              | Memory: 0.004 M | <class 'torch.nn.parameter.Parameter'
  20.  
  21. At __main__ <module>: line 15                        Total Used Memory:1387.5 Mb 

通過上面的報告,很容易發(fā)現(xiàn)一個問題。

首先我們知道VGG19所有層的權(quán)重大小加起來大約是548M(這個數(shù)值來源于Pytorch官方提供的VGG19權(quán)重文件大小),我們將上面報告打印的Tensor-Memory也都加起來算下來也差不多551.8Mb。但是,我們算了兩次打印的顯存實際占用中:1387.5 – 472.2 = 915.3 MB。

 

Pytorch在開始運行程序時需要額外的顯存開銷,這種額外的顯存開銷與我們實際使用的模型權(quán)重顯存大小無關(guān)。 這個額外的顯存Pytorch的開發(fā)者也對此進(jìn)行說明了,這部分釋放后的顯存可以用,只不過不在Nvidia-smi中顯示罷了,所以我們無需關(guān)注。

 

責(zé)任編輯:華軒 來源: 今日頭條
相關(guān)推薦

2021-03-25 15:19:33

深度學(xué)習(xí)Pytorch技巧

2021-02-23 10:48:30

Python代碼開發(fā)

2024-01-08 17:09:07

Python解釋器CPython

2013-06-03 09:40:53

內(nèi)存消耗性能優(yōu)化優(yōu)化技巧

2021-12-07 11:31:47

Python代碼if…elif…els

2018-11-28 12:30:58

Python命令行編程語言

2016-11-28 09:02:23

Python內(nèi)存技巧

2016-11-25 14:03:03

Python

2022-02-24 10:40:14

Python代碼

2022-01-06 22:31:21

Python技巧代碼

2023-12-06 13:43:00

python代碼

2024-05-16 12:03:54

Python代碼開發(fā)

2020-09-26 21:50:26

JavaScript代碼開發(fā)

2022-03-10 08:01:06

CSS技巧選擇器

2022-11-24 10:34:05

CSS前端

2024-01-16 15:19:29

Python內(nèi)存

2020-05-07 17:03:49

Python編碼開發(fā)

2010-08-31 11:01:56

JavaJava內(nèi)存管理

2016-08-05 15:33:26

Python編程異常

2020-02-07 15:42:52

服務(wù)器內(nèi)存顯存
點贊
收藏

51CTO技術(shù)棧公眾號