使用 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 窗口,将配置文件信息显示为有向图。