tensorflow CUDA_ERROR_OUT_OF_MEMORY:Could not allocate pinned host memory

2018-06-06 11:44:03.045361: E tensorflow/stream_executor/cuda/cuda_driver.cc:967] failed to alloc 4294967296 bytes on host: CUDA_ERROR_OUT_OF_MEMORY
2018-06-06 11:44:03.045398: W ./tensorflow/core/common_runtime/gpu/pool_allocator.h:195] could not allocate pinned host memory of size: 4294967296
2018-06-06 11:44:03.045421: E tensorflow/stream_executor/cuda/cuda_driver.cc:967] failed to alloc 3865470464 bytes on host: CUDA_ERROR_OUT_OF_MEMORY
2018-06-06 11:44:03.045427: W ./tensorflow/core/common_runtime/gpu/pool_allocator.h:195] could not allocate pinned host memory of size: 3865470464
2018-06-06 11:44:03.045444: E tensorflow/stream_executor/cuda/cuda_driver.cc:967] failed to alloc 3478923264 bytes on host: CUDA_ERROR_OUT_OF_MEMORY
2018-06-06 11:44:03.045449: W ./tensorflow/core/common_runtime/gpu/pool_allocator.h:195] could not allocate pinned host memory of size: 3478923264

最近跑tensorflow会遇到上面的问题,即使减小网络,减少了GPU的内存使用也没用。

其实仔细看错误信息可以发现这个问题并不是因为GPU内存不够,而是主内存不够,CUDA中的pinned host memory(固定主内存)使用的是主机的内存。我们知道虚拟内存是可以分页的(很大的),但CUDA中的固定主内存是不使用分页内存而直接使用主机的内存(买电脑时经常说的8G内存)。这样能加快数据交换的速度,但不可避免的造成主内存的大量占用。想要了解更多有关pinned host memory的知识,可以查看这个:6.1 CUDA: pinned memory固定存储

所以出现这个问题时我的电脑基本是死机的,只有kill掉后释放内存,电脑才能正常使用。

综上,解决办法有三个:

1、加内存条。(老板,来十斤内存条,海盗船DDR4 16G的那种)

2、使用虚拟内存。

3、少用点固定主内存或者即用即释放。

关于2和3,tensorflow的python接口到这个时候似乎没有提供API分配CPU内存,有关CPU和GPU内存交换的内容好像是透明的。不过C++版tensorflow可能可以做一些尝试,这里就不讨论了(因为我也不知道)

但我一个不想砸钱又不想重新配环境的哥们在StackOverflow上找到了这个问题,问题最后提到tensorflow中的数据输入方式会影响CPU的内存分配,所以减少一下数据的输入,比如将256*256的图片换成128*128的图片就可以减少几乎一半的主内存了。(你会发现跑的还更快了)

你可能感兴趣的:(tensorflow)