如何用gperftools分析深度學習框架的內存泄漏問題
本系列為高階乾貨,面向深度學習從業者,欄目會定期分享PaddlePaddle研發工程師和產品經理的行業經驗。本篇和內存泄漏分析相關,適合中高階深度學習工程師仔細閱讀,預計閱讀時間5分鐘
喬龍飛:PaddlePaddle開源社區成員,百度資深研發工程師,目前負責PaddlePaddle相關技術工作
什麼是內存泄漏
計算機程序都可能有內存泄漏的風險。內存泄漏一般是由於程序在堆(heap)上分配了內存而沒有釋放,隨著程序的運行佔用的內存越來越大,一方面會影響程序的穩定性,可能讓運行速度越來越慢,或者造成oom,甚至會影響程序所運行的機器的穩定性,造成宕機。
內存泄漏的分析工具
目前有很多內存泄漏分析工具,比較經典的有valgrind,gperftools
主流的深度學習框架,例如Google Tensorflow,Mxnet,PaddlePaddle等,都是用Python驅動C++ core來執行訓練或者預測任務。對於這種類型的程序:
1.valgrind直接分析非常困難,需要自己編譯debug版本的、帶valgrind支持的專用Python版本,而且輸出的信息中大部分是Python自己的符號和調用信息,很難看出有用的信息,另外使用valgrind會讓程序運行速度變得非常慢,所以不建議使用。
2.而gperftools使用簡單,無需重新編譯代碼即可運行,對運行速度的影響也比較小。
下面基於PaddlePaddle的一次內存泄漏問題的分析過程,介紹如何使用gperftools來分析和調試深度學習框架內存分配問題
功能支持
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-devapt-get install google-perftools
2.安裝pprof
go get -u github.com/google/pprof
3.設置運行環境
# 如果是以root運行的話,其他用戶可能需要相應的修改
export PPROF_PATH=/root/gopath/bin/pprofexport PPROF_BINARY_PATH=/root/gopath/bin/pprofexport LD_PRELOAD=/usr/lib/libtcmalloc.so.4
4.使用heap profile來運行python程序。本質上是周期性的對堆的分配情況做一次快照。
# HEAPPROFILE 設置生成的堆分析文件的目錄和文件前綴
# HEAP_PROFILE_ALLOCATION_INTERVAL 設置每分配多少存儲dump一次dump,默認1GB
隨著程序的運行,會在perf_log這個文件夾下生成很多文件,如下
5.使用pprof對heap文件進行分析。分析分為兩種模式
→完整模式。會對當前heap做一個分析,顯示目前分配內存一些調用路徑。
上述命令會生成一個profile00x.pdf的文件,可以直接打開。從下面的截圖可以看出,在CPU版本fluid的運行過程中,分配存儲最多的模塊式CPUAllocator(memory pool),而別的模塊相對而言分配內存較少,所以被忽略了,這對於分析內存泄漏是很不方便的,因為泄漏是一個緩慢的過程,相對於memory pool這種一開始就分配大片內存的模塊,泄漏的地方內存佔用相對較少,在這種圖中是無法看到的。
memory allocator
→Diff模式。可以對兩個時刻的heap做diff,把一些內存分配沒有發生變化的模塊去掉,而把增量部分顯示出來。
上述命令也會生成一個profile00x.pdf的文件,從pdf可以看出:ProgramDesc這個結構,在兩個版本之間增長了200MB+,所以這裡有很大的內存泄漏的可能性,最終結果也確實證明是這裡造成了泄漏。
result
result
*為了方便大家使用PaddlePaddle,遇到問題可在中文社區提問,值班同學將在24小時內響應!更有精品案例、課程提供,讓大家學習使用框架,輕鬆無憂!直達鏈接:
https://ai.baidu.com/forum/topic/list/168
TAG:PaddlePaddle |