нетерпение не совместимо с многопроцессорностью - PullRequest
0 голосов
/ 23 сентября 2018

Я использую tenorflow, желающий сделать расчет.Цель состоит в том, чтобы распределить работу на все графические процессоры.Однако я считаю, что это невозможно сделать с помощью многопроцессорной обработки.

Ниже приведен код (он действительно очень короткий, за исключением некоторой дополнительной работы):

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

ядро ​​функции должновызываться основным циклом, который распределяет работу по четырем процессорам.Но это привело к ошибке: CUDA_ERROR_OUT_OF_MEMORY.

Это на самом деле очень мало, не должно занимать много ресурсов.

Кто-нибудь знает, как это исправить?

1 Ответ

0 голосов
/ 23 сентября 2018

Поскольку Tensorflow жадно выделяет память, один процесс может потреблять все ресурсы.Ссылка: https://stackoverflow.com/a/34514932/10111931

Если вы посмотрите на GPUOptions , кроме настройки per_process_gpu_memory_fraction, предложенной в ответе выше, вы можете взглянуть на использование allow_growth = True для запроса памяти как икогда требуется.

Второе, что вы можете попробовать, это использовать опцию CUDA_VISIBLE_DEVICES, чтобы позволить каждому процессу работать только с подмножеством графических процессоров.Справка: https://stackoverflow.com/a/37901914/10111931

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...