我正在运行分布式TensorFlow程序,每台机器都配备了Maxwell Titan X GPU。程序开始时出现OOM错误(以下错误消息):
tensorflow.python.framework.errors_impl.ResourceExhaustedError: Failed to allocate request for 48.00MiB (50331648B) on device ordinal 0
[[{{node cluster_303_1/xla_run}} = _XlaRun[Targs=[DT_BFLOAT16, DT_BFLOAT16], Tresults=[DT_BFLOAT16], _device="/job:ps/replica:0/task:0/device:XLA_GPU:0"](transformer/decoder/att_3/att/einsum/parallel_0/einsum/transpose_2_G1444, transformer/decoder/att_3/att/einsum_3/parallel_0/einsum/transpose_1_G1446, cluster_303_1/xla_compile)]]
这表明XLA_GPU设备的内存不足。同时,GPU_BFC拥有超过11GB的GPU内存,并且该内存中的大部分是空闲的。发生这种情况是因为,默认情况下,GPU_BFC会分配并保留几乎所有GPU内存,从而避免在执行过程中调用cuMemAlloc
。但是,XLA_GPU的内存分配不会通过GPU的BFC分配器,而是直接与CUDA驱动程序进行交互。在GPU_BFC之后,仅剩下数百MB的GPU内存供XLA_GPU使用。首先,为什么XLA_GPU需要一种不同的内存分配方式,而不是使用与GPU_BFC相同的BFC分配器?
我知道我可以let GPU_BFC allocate memory only when it is needed by turning on the allow_growth
in Session config。由于动态分配内存可能会降低性能,因此在XLA_GPU和GPU_BFC之间共享GPU内存是否有更好或更原则的方法?