使用 tcmalloc 分配器
为了提高内存分配性能,许多 TensorFlow 用户经常使用 tcmalloc
而不是默认的 malloc()
实现,因为在分配和释放大对象(例如许多张量)时,tcmalloc
受碎片的影响较小。已知一些内存密集型 TensorFlow 程序会使用默认的 malloc()
泄漏堆地址空间 (同时释放它们使用的所有单个对象),但在切换到 tcmalloc
后执行得很好。此外,tcmalloc
还包括一个堆分析器 ,可以跟踪可能发生的任何剩余泄漏的位置。
tcmalloc
的安装将取决于你的操作系统,但以下适用于 Ubuntu 14.04(可靠) (其中 script.py
是你的 TensorFlow Python 程序的名称):
$ sudo apt-get install google-perftools4
$ LD_PRELOAD=/usr/lib/libtcmalloc.so.4 python script.py ...
如上所述,简单地切换到 tcmalloc
可以解决许多明显的泄漏问题。但是,如果内存使用量仍在增长,你可以使用堆分析器,如下所示:
$ LD_PRELOAD=/usr/lib/libtcmalloc.so.4 HEAPPROFILE=/tmp/profile python script.py ...
运行上述命令后,程序将定期将配置文件写入文件系统。配置文件序列将命名为:
/tmp/profile.0000.heap
/tmp/profile.0001.heap
/tmp/profile.0002.heap
- …
你可以使用 google-pprof
工具读取配置文件,该工具可以作为 google-perftools
软件包的一部分安装(例如,在 Ubuntu 14.04 上)。例如,要查看上面收集的第三个快照:
$ google-pprof --gv `which python` /tmp/profile.0002.heap
运行上述命令将弹出 GraphViz 窗口,将配置文件信息显示为有向图。