高階乾貨|如何用gperftools分析深度學習框架的內存泄漏問題

本系列爲高階乾貨,面向深度學習從業者,欄目會按期分享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,甚至會影響程序所運行的機器的穩定性,形成宕機。框架

內存泄漏的分析工具工具

目前有不少內存泄漏分析工具,比較經典的有valgrindgperftools學習

主流的深度學習框架,例如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 mallocheap-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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索