背景:项目中有多卡训练的需求,多进程时每个进程都需要编译,占用内存过大,需要找出内存占用多的点并尝试优化。
目标程序是python的多进程程序,torch_xla
多卡训练,程序包含python及c++库,尝试过其他工具发现并不合适,最终采用此工具。
工具介绍
This is the heap profiler we use at Google, to explore how C++ programs manage memory. This facility can be useful for:
- Figuring out what is in the program heap at any given time
- Locating memory leaks
- Finding places that do a lot of allocation
有2种使用方式,这里采用非侵入式的方式,即通过设置环境变量,hook内存分配的接口,例如:
env LD_PRELOAD=“/usr/lib/libtcmalloc.so”
使用过程
dump:
mkdir profs_gen
# dump size选项参考Modifying Runtime Behavior一节
export HEAP_PROFILE_ALLOCATION_INTERVAL=10737418240
export HEAP_PROFILE_INUSE_INTERVAL=10737418240
LD_PRELOAD=/usr/local/lib/libtcmalloc.so HEAPPROFILE=profs_gen/profs python distributed_train.py
得到分析结果:
# 到terminal
pprof --text /bin/ls profs.0001.heap
# 或生成pdf
pprof --pdf /bin/ls profs_gen2/profs.0002.heap > profs.0002.pdf
分析
这里分析其中一路内存占用:
编译安装
wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.5/gperftools-2.5.tar.gz
./configure
make && make install
若要使用--pdf
选项生成pdf文档,需要另外安装依赖库:
sudo apt-get install ghostscript # ps2pdf
sudo apt-get install graphviz # dot
参考资料
Gperftools Heap Profiler
pprof on Github