Tensorflow 即时执行与多处理不兼容

Tensorflow 即时执行与多处理不兼容,tensorflow,out-of-memory,eager,Tensorflow,Out Of Memory,Eager,我正在使用tensorflow进行计算。 目的是在所有GPU上分配工作。但是,我发现使用多处理无法做到这一点 以下是代码(除了一些额外的工作外,代码确实很短): 函数内核将由主循环调用,主循环将工作分配到四个GPU上。 但它产生了一个错误:CUDA_error_内存不足 这其实很短,不应该占用很多资源 有人知道如何解决这个问题吗?由于Tensorflow贪婪地分配内存,一个进程可能会消耗所有资源。 参考: 如果您看一看,除了设置上面答案中建议的每进程\u gpu\u内存\u分数外,您还可以看一看

我正在使用tensorflow进行计算。 目的是在所有GPU上分配工作。但是,我发现使用多处理无法做到这一点

以下是代码(除了一些额外的工作外,代码确实很短):

函数内核将由主循环调用,主循环将工作分配到四个GPU上。 但它产生了一个错误:CUDA_error_内存不足

这其实很短,不应该占用很多资源


有人知道如何解决这个问题吗?

由于Tensorflow贪婪地分配内存,一个进程可能会消耗所有资源。 参考:

如果您看一看,除了设置上面答案中建议的每进程\u gpu\u内存\u分数外,您还可以看一看使用allow\u growth=True在需要时请求内存

您可以尝试的第二件事是使用CUDA_VISIBLE_DEVICES选项,让每个进程只使用GPU的一个子集进行操作。
参考资料:

由于Tensorflow贪婪地分配内存,一个进程可能会消耗所有资源。 参考:

如果您看一看,除了设置上面答案中建议的每进程\u gpu\u内存\u分数外,您还可以看一看使用allow\u growth=True在需要时请求内存

您可以尝试的第二件事是使用CUDA_VISIBLE_DEVICES选项,让每个进程只使用GPU的一个子集进行操作。 参考:

import os,sys
import multiprocessing
import numpy as np
# clear folder
folder = os.getcwd()+'/temp/'
for the_file in os.listdir(folder):
    file_path = os.path.join(folder, the_file)
    if os.path.isfile(file_path):
        os.unlink(file_path)

# process
p={}
n_batches=4

# kernel to be called in each process
# here, the example is just to return i_batch
def kernel(i_batch):
    import tensorflow as tf
    from tensorflow.python.eager.context import context, EAGER_MODE, GRAPH_MODE
    def switch_to(mode):
        ctx = context()._eager_context
        ctx.mode = mode
        ctx.is_eager = mode == EAGER_MODE
    switch_to(EAGER_MODE)
    assert tf.executing_eagerly()

    with tf.device("GPU:"+str(i_batch)):
        tf.tile([1],[10])
        r=tf.constant(i_batch).numpy()
    return r

# multiprocessing loop
for i_batch in range(n_batches):
    def multi_processing():
        result=kernel(i_batch)
        np.save(os.getcwd()+'/temp/result'+str(i_batch), result)

    # start multi-processing to allocate     
    p[i_batch] = multiprocessing.Process(target=multi_processing)
    p[i_batch].daemon = True
    p[i_batch].start()

# wait
for i_batch in range(n_batches):   
    p[i_batch].join()

result=0.
for i_batch in range(n_batches): 
    result+=np.load(os.getcwd()+'/temp/result'+str(i_batch)+'.npy')
result