使用 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 視窗,將配置檔案資訊顯示為有向圖。