急切执行与多处理不兼容
eager excution is not compatible with multiprocessing
我正在使用tensorflow急于做计算。
目的是在所有 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
函数内核将由在四个 GPU 上分配工作的主循环调用。
但它产生了 error:CUDA_ERROR_OUT_OF_MEMORY.
这其实很短,应该不会占用很多资源。
有人知道如何解决这个问题吗?
由于Tensorflow贪婪分配内存,一个进程可能会耗尽所有资源。
参考:
如果您看一下 GPUOptions,除了上面答案中建议的设置 per_process_gpu_memory_fraction 之外,您还可以看一下使用 allow_growth=True 来请求内存和在需要的时候。
您可以尝试的第二件事是使用 CUDA_VISIBLE_DEVICES 选项让每个进程仅使用 GPU 的一个子集运行。
参考:
我正在使用tensorflow急于做计算。 目的是在所有 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
函数内核将由在四个 GPU 上分配工作的主循环调用。 但它产生了 error:CUDA_ERROR_OUT_OF_MEMORY.
这其实很短,应该不会占用很多资源。
有人知道如何解决这个问题吗?
由于Tensorflow贪婪分配内存,一个进程可能会耗尽所有资源。 参考:
如果您看一下 GPUOptions,除了上面答案中建议的设置 per_process_gpu_memory_fraction 之外,您还可以看一下使用 allow_growth=True 来请求内存和在需要的时候。
您可以尝试的第二件事是使用 CUDA_VISIBLE_DEVICES 选项让每个进程仅使用 GPU 的一个子集运行。
参考: