本系列爲高階乾貨,面向深度學習從業者,欄目會按期分享PaddlePaddle研發工程師和產品經理的行業經驗。本篇和內存泄漏分析相關,適合中高階深度學習工程師仔細閱讀,預計閱讀時間5分鐘python
喬龍飛:PaddlePaddle開源社區成員,百度資深研發工程師,目前負責PaddlePaddle相關技術工做git
下載安裝命令 ## CPU版本安裝命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安裝命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
什麼是內存泄漏github
計算機程序均可能有內存泄漏的風險。內存泄漏通常是因爲程序在堆(heap)上分配了內存而沒有釋放,隨着程序的運行佔用的內存愈來愈大,一方面會影響程序的穩定性,可能讓運行速度愈來愈慢,或者形成oom,甚至會影響程序所運行的機器的穩定性,形成宕機。框架
內存泄漏的分析工具工具
目前有不少內存泄漏分析工具,比較經典的有valgrind, gperftools學習
主流的深度學習框架,例如Google Tensorflow,Mxnet,PaddlePaddle等,都是用Python驅動C++ core來執行訓練或者預測任務。對於這種類型的程序:ui
1.valgrind直接分析很是困難,須要本身編譯debug版本的、帶valgrind支持的專用Python版本,並且輸出的信息中大部分是Python本身的符號和調用信息,很難看出有用的信息,另外使用valgrind會讓程序運行速度變得很是慢,因此不建議使用。google
2.而gperftools使用簡單,無需從新編譯代碼便可運行,對運行速度的影響也比較小。spa
下面基於PaddlePaddle的一次內存泄漏問題的分析過程,介紹如何使用gperftools來分析和調試深度學習框架內存分配問題。.net
功能支持
gperftool主要支持如下四個功能:
1.thread-caching malloc
2.heap-checking using tcmalloc
3.heap-profiling using tcmalloc
4.CPU profiler
對於堆內存的分析,主要用到thread-caching malloc和heap-profiling using tcmalloc
使用流程
本教程基於paddle提供的Docker開發環境paddlepaddle/paddle:latest-dev,基於Ubuntu 16.04.4 LTS環境,基本上只要支持google-perftools就能夠了。
步驟
1. 安裝google-perftools
apt-get install libunwind-dev apt-get install google-perftools
2. 安裝pprof
go get -u github.com/google/pprof
3. 設置運行環境
# 若是是以root運行的話,其餘用戶可能須要相應的修改
export PPROF_PATH=/root/gopath/bin/pprof export PPROF_BINARY_PATH=/root/gopath/bin/pprof export LD_PRELOAD=/usr/lib/libtcmalloc.so.4
4. 使用heap profile來運行python程序。本質上是週期性的對堆的分配狀況作一次快照。
# HEAPPROFILE 設置生成的堆分析文件的目錄和文件前綴
# HEAP_PROFILE_ALLOCATION_INTERVAL 設置每分配多少存儲dump一次dump,默認1GB
隨着程序的運行,會在perf_log這個文件夾下生成不少文件,以下
-rw-r--r-- 1 root root 1.0M Jun 1 15:00 test.log.0001.heap -rw-r--r-- 1 root root 1.0M Jun 1 15:00 test.log.0002.heap -rw-r--r-- 1 root root 1.0M Jun 1 15:00 test.log.0003.heap -rw-r--r-- 1 root root 1.0M Jun 1 15:00 test.log.0004.heap -rw-r--r-- 1 root root 1.0M Jun 1 15:00 test.log.0005.heap -rw-r--r-- 1 root root 1.0M Jun 1 15:00 test.log.0006.heap
5. 使用pprof對heap文件進行分析。分析分爲兩種模式
→完整模式。會對當前heap作一個分析,顯示目前分配內存一些調用路徑。
pprof --pdf python test.log.0012.heap
上述命令會生成一個profile00x.pdf的文件,能夠直接打開。從下面的截圖能夠看出,在CPU版本fluid的運行過程當中,分配存儲最多的模塊是CPUAllocator(memory pool),而別的模塊相對而言分配內存較少,因此被忽略了,這對於分析內存泄漏是很不方便的,由於泄漏是一個緩慢的過程,相對於memory pool這種一開始就分配大片內存的模塊,泄漏的地方內存佔用相對較少,在這種圖中是沒法看到的。
memory allocator
→Diff模式。能夠對兩個時刻的heap作diff,把一些內存分配沒有發生變化的模塊去掉,而把增量部分顯示出來。
pprof --pdf --base test.log.0010.heap python test.log.1045.heap
上述命令也會生成一個profile00x.pdf的文件,從pdf能夠看出:ProgramDesc這個結構,在兩個版本之間增加了200MB+,因此這裏有很大的內存泄漏的可能性,最終結果也確實證實是這裏形成了泄漏。
result
result
下載安裝命令 ## CPU版本安裝命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安裝命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
*爲了方便你們使用PaddlePaddle,遇到問題可在中文社區提問,值班同窗將在24小時內響應!更有精品案例、課程提供,讓你們學習使用框架,輕鬆無憂!直達連接:
https://ai.baidu.com/forum/topic/list/168
本文分享 CSDN - 飛槳PaddlePaddle。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。