https://blog.csdn.net/qq_28660035/article/details/80688427
https://blog.csdn.net/kkk584520/article/details/9490233
https://blog.csdn.net/panda1234lee/article/details/83473471
https://blog.csdn.net/qq_25147897/article/details/65634409
使用NVIDIA Visual Profiler追蹤Python程序來分析GPU調用[nvprof-tools]
代碼編寫
[Python]torch.cuda.nvtx參考,實例如下:
import numpy as np import torch import time def cholesky_speed_test(device="cpu"): assert device in ("cpu","cuda") np.random.seed(123) n_rep = 10000 dim = 16 batches = 10 A = np.random.normal(0,1,(batches,dim,dim)) cov = np.matmul(A,A.swapaxes(1,2)) pt_cov = torch.tensor(cov.astype(np.float32),device=device) L = torch.cholesky(pt_cov) torch.cuda.nvtx.range_push("CholeskyDecomposition") start_time = time.time() for i in range(n_rep): torch.cuda.nvtx.range_push("Iter{}".format(i)) torch.cholesky(pt_cov, out=L) torch.cuda.nvtx.range_pop() duration = time.time() - start_time print("Duration: {:.3f}s on device {}".format(duration,device)) torch.cuda.nvtx.range_pop() cholesky_speed_test(device="cpu") cholesky_speed_test(device="cuda")
編譯運行
命令行下運行nvprof生成nvvp文件,而後使用nvvp調用NVIDIA Visual Profiler:
Usually nvprof, located at /usr/local/cuda/bin
Non-Visual Profiler
$ nvprof python train_mnist.py
I prefer to use --print-gpu-trace.
$ nvprof --print-gpu-trace python train_mnist.py
Visual Profiler
On GPU machine, run
$ nvprof -o prof.nvvp python train_mnist.py
Copy
prof.nvvp
into your local machine(如果命令行未改變目錄,則不需要)$ scp your_gpu_machine:/path/to/prof.nvvp .
Then, run nvvp (nvidia visual profiler) on your local machine:
$ nvvp prof.nvvp
It works more comfortably than X11 forwarding or something.
追蹤Python函數內部調用
[神器不解釋]Graphviz+pycallgraph
官網下載Graphviz.deb,並安裝sudo dkpg -i *.deb(依賴問題運行:sudo apt install -f);
然後pip install pycallgraph;
- 使用示例
|---main.py |---downloadmusic.py |---baidu.png |---trace_detail.png ##################################################################### # coding: -utf8- # filename: main.py from pycallgraph import PyCallGraph from pycallgraph import Config from pycallgraph import GlobbingFilter from pycallgraph.output import GraphvizOutput from downloadmuisc import * # Setting depth and filters for tracer config = Config(max_depth=10) # include exclude some dirs or packages config.trace_filter = GlobbingFilter(exclude=[ 'pycallgraph.*', '*.secret_function', ]) graphviz = GraphvizOutput(output_file=r'./trace_detail.png') with PyCallGraph(output=graphviz, config=config): download('http://www.baidu.com/img/bd_logo1.png', r'./baidu.png') ##################################################################### # coding: -utf8- # filename: downloadmusic.py import urllib.request import threading def download(url, path): data = urllib.request.urlopen(url).read() open(path, 'wb').write(data) print("success!")
Graphviz +Pyreverse 繪製Python的UML類圖
- 1.linux環境下graphviz安裝
graphviz是一個開源做圖軟件,她能畫結構化的抽象和網絡圖形,在網絡,生物信息學,軟件工程,數據庫和web設計,機器學習, 可視化接口等衆多其他技術領域都有應用。
使用yum自動安裝,任意路徑下執行如下命令:sudo apt-get install graphviz
- 2.pyreverse工具安裝
pyreverse能方便的生成uml類圖,pylint裏自帶了pyreverse這個工具。使用pip安裝pylint
pip install pylint
- 3.使用,可以參考的命令爲,scheduler爲存放代碼的目錄
pyreverse -ASmy -o png scheduler/
Pycharm專業版:右鍵Diagrams工具可以顯示UML類圖
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
PyTorch網絡可視化
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
Pycharm配置程序內存
打開pycharm64.vmoptions,進行配置
-Xms4094m -Xmx20480m -XX:ReservedCodeCacheSize=240m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true -Djdk.http.auth.tunneling.disabledSchemes="" -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Dawt.useSystemAAFontSettings=lcd -Dsun.java2d.renderer=sun.java2d.marlin.MarlinRenderingEngine -javaagent:/home/lijie/pycharm-2018.3.3/bin/JetbrainsCrack-release-enc.jar
- -Xmx用來設置你的應用程序(不是IDE)能夠使用的最大內存數,如果你的程序要花很大內存的話,那就需要修改缺省的設置。
- -Xms用來設置程序初始化的時候內存棧的大小,增加這個值的話你的程序的啓動性能會得到提高。
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
htop/top命令界面詳解
Top命令監控某個進程的資源佔有情況
下面是各種內存:
- VIRT:virtual memory usage
1、進程“需要的”虛擬內存大小,包括進程使用的庫、代碼、數據等
2、假如進程申請100m的內存,但實際只使用了10m,那麼它會增長100m,而不是實際的使用量
- RES:resident memory usage 常駐內存
1、進程當前使用的內存大小,但不包括swap out
2、包含其他進程的共享
3、如果申請100m的內存,實際使用10m,它只增長10m,與VIRT相反
4、關於庫佔用內存的情況,它只統計加載的庫文件所佔內存大小
- SHR:shared memory
1、除了自身進程的共享內存,也包括其他進程的共享內存
2、雖然進程只使用了幾個共享庫的函數,但它包含了整個共享庫的大小
3、計算某個進程所佔的物理內存大小公式:RES – SHR
4、swap out後,它將會降下來
- DATA
1、數據佔用的內存。如果top沒有顯示,按f鍵可以顯示出來。
2、真正的該程序要求的數據空間,是真正在運行中要使用的。