Используя многопроцессорную работу с theano

Я пытаюсь использовать theano с многопроцессорной обработкой процессора с библиотекой нейронной сети, Keras.

я использую device=gpu пометьте и загрузите модель keras. Затем для извлечения функций для более миллиона изображений, я использую многопроцессорный пул.

Функция выглядит примерно так:

from keras import backend as K

f = K.function([model.layers[0].input, K.learning_phase()], [model.layers[-3].output,])

def feature_gen(flz):
    im = imread(flz)
    cPickle.dump(f([im, 0])[0][0], open(flz, 'wb'), -1)

pool = mp.Pool(processes=10)
results = [pool.apply_async(feature_gen, args=(f, )) for f in filelist]]

Это, однако, начинает создавать пулы в памяти графического процессора, и мой код завершается с ошибкой памяти. Можно ли заставить многопроцессорное создание потоков в памяти процессора, а затем использовать определенные части для извлечения функций, таких как f([im, 0])[0][0] с графическим процессором?

Если нет, есть ли альтернатива сделать то же самое параллельно в Python?

1 ответ

Можно использовать несколько процессов, если другие процессы не используют керасы, насколько мне известно, вам нужно ограничить использование керас одним процессом. Похоже, это включает в себя все классы и методы keras, даже те, кто, кажется, не использует gpu, например ImageDataGenerator.

Если рабочая нагрузка ограничена графическим процессором, также можно использовать библиотеку потоков, которая создает потоки вместо процессов, например, для загрузки данных, пока графический процессор обрабатывает предыдущий пакет, тогда ограничение не применяется. Из-за глобальной блокировки интерпретатора это не является решением в средах с ограниченным использованием ЦП.

Ваша ситуация выглядит как параллель [читай, работай на GPU, пиши]. Это может быть преобразовано в конвейер, например, чтение некоторых процессов, основной процесс, выполняющий работу графического процессора, и запись некоторых процессов.

  1. Создание объектов очереди для ввода / вывода (threading.Queue или multiprocessing.Queue)
  2. Создать фоновые рабочие потоки / процессы, которые читают данные с диска и подают их во входную очередь
  3. Создание фоновых рабочих потоков / процессов, которые записывают данные из очереди вывода на диск
  4. основной цикл, который принимает данные из входной очереди, создает пакеты, обрабатывает данные в графическом процессоре и заполняет выходную очередь
Другие вопросы по тегам