Запустить логический вывод на CPU, используя pytorch и многопроцессорность - PullRequest
0 голосов
/ 28 сентября 2019

Я обучил модель CNN на GPU, используя FastAI (бэкэнд PyTorch).Сейчас я пытаюсь использовать эту модель для вывода на той же машине, но использую процессор вместо графического процессора.Наряду с этим я также пытаюсь использовать несколько процессорных ядер, используя многопроцессорный модуль.Теперь возникает проблема:

Выполнение кода на одном процессоре (без многопроцессорной обработки) занимает всего 40 секунд для обработки почти 50 изображений

Запусккод на нескольких процессорах, использующих многопроцессорную обработку факелов, занимает более 6 минут для обработки тех же 50 изображений

from torch.multiprocessing import Pool, set_start_method
os.environ['CUDA_VISIBLE_DEVICES']=""
from fastai.vision import *
from fastai.text import *
defaults.device = torch.device('cpu')

def process_image_batch(batch):

    learn_cnn  = load_learner(scripts_folder, 'cnn_model.pkl')
    learn_cnn.model.training = False    
    learn_cnn.model = learn_cnn.model.eval()
    # for image in batch: 
    #     prediction = ... # predicting the image here
    #     return prediction

if __name__ == '__main__':
    #
    # image_batches = ..... # retrieving the image batches (It is a list of 5 lists)
    # n_processes = 5
    set_start_method('spawn', force=True)
    try:
        pool = Pool(n_processes)
        pool.map(process_image_batch, image_batches)
    except Exception as e:
        print('Main Pool Error: ', e)
    except KeyboardInterrupt:
        exit()
    finally:
        pool.terminate()
        pool.join()

Я не уверен, что вызывает это замедление в многопроцессорном режиме.Я прочитал много постов, в которых обсуждается похожая проблема, но нигде не смог найти правильного решения.

1 Ответ

1 голос
/ 30 сентября 2019

Я думаю, что вы совершили очень наивную ошибку: вы читаете объект модели в функции, которую вы распараллеливаете.

То есть для каждого отдельного изображения вы перезагружаете модель с диска.В зависимости от размера объекта вашей модели, ввод-вывод будет занимать больше времени, чем выполнение шага вперед.

Пожалуйста, попробуйте прочитать модель один раз в главном потоке, а затем сделать объект доступным для вывода в параллельной функции.

...