Tensorboard OOM隐患
Tensorboard启动时面对大量文件时存在内存过高问题,在启动之后tensorboard是可以正常启动查看的,但是很多人没有发现,tensorboard的内存占用会慢慢增加。
其实这个增长有快有慢。当logdir下的文件越多,内存升高越快。这到底是与文件总大小有关,还是跟个数有关。我们分别进行试验。
1.初始实验
root@web-tb-v1-679948455-x96hd:/tmp/data/test# cd
events.out.tfevents.1592482650.test-tb-v1-6bb74f84db-gphg2.591.0 n01632777/ n01675722/
n01608432/ n01644373/ n01677366/
n01614925/ n01644900/ n01685808/
n01616318/ n01664065/ n01687978/
n01629819/ n01665541/ n01688243/
n01630670/ n01667114/ n01689811/
n01631663/ n01667778/
n01632458/ n01669191/
当下文件夹每个约有一千个数kb的文件。再次启动tensorboard。
当下文件数目比左图要高,内存占用增长速度明显比之前快一点。
我们将所有文件夹打包成tar,那么就造成总容量不变但是总文件数变小了。
root@web-tb-v1-679948455-x96hd:/tmp/data/test# ls
events.out.tfevents.1592482650.test-tb-v1-6bb74f84db-gphg2.591.0 test10.tar test12.tar test14.tar test16.tar test18.tar test2.tar test21.tar test4.tar test6.tar test8.tar
test1.tar test11.tar test13.tar test15.tar test17.tar test19.tar test20.tar test3.tar test5.tar test7.tar test9.tar
显然这次初始占用的内存要比之前,零散的大,但是内存增长速度降低了。我们获得结论一,内存增长率跟logdir下数目大小成正比,初始占用内存率与单个文件大小成正比。
2.提出最后一个假设
是否等存在之前零散文件夹环境下,等待内存上升也能实现700mb内存的终点然后稳定。
将所有的压缩包解压,任tensorboard运行。
实际上,任其运行当下的内存占用已经超过之前稳定时候需要占用的内存。也就得到 结论二:尽管数目小的大文件在初始时候会占用比较大的内存,但是之后内存占用会相对稳定,若是离散文件居多,则会引发内存快速增长。
OOM了
3.总结
根据结论:
- 内存增长率跟logdir下数目大小成正比,初始占用内存率与单个文件大小成正比。
- 尽管数目小的大文件在初始时候会占用比较大的内存,但是之后内存占用会相对稳定,若是离散文件居多,则会引发内存快速增长。
4. 原因分析与建议
经过查看代码,我怀疑是以下代码段引发的:
# tensorboard/backend/event_processing/directory_watcher.py
def _GetNextPath(self):
"""Gets the next path to load from.
This function also does the checking for out-of-order writes as it iterates
through the paths.
Returns:
The next path to load events from, or None if there are no more paths.
"""
paths = sorted(
path
for path in io_wrapper.ListDirectoryAbsolute(self._directory)
if self._path_filter(path)
)
......
next_paths = list(
path for path in paths if self._path is None or path > self._path
)
if next_paths:
return min(next_paths)
else:
return None
尽管拥有_path_filter筛选evnet格式文件(通过命名格式),但是打开文件时还是存在泄露,这个开源社区也有相关issues。建议尽量在干净且文件总数较小的目录启动tensorboard。
有任何问题可以直接留言