tf.keras fit_generator зависает при использовании подпроцесса - PullRequest
0 голосов
/ 21 февраля 2020

Python 3.6.8
Ubuntu 18.04
Tensorflow 1.13.2 (keras 2.2.4-tf)
Keras 2.2.4 CUDA 10.1
драйвер NVIDIA v435.21
GeForce RTX 2080 Ti

У меня есть проект большего размера, где в одном файле ( main.py ) я обрабатываю все результаты обучения по модели tf.keras. Я использую модуль подпроцесса python для запуска фазы обучения.

Когда я использовал keras.model.fit_generator Я смог получить результаты обучения через стандартный вывод, но когда я переключился tenensflow.keras.model.fit_generator процесс остановлен. Коэффициент использования графического процессора равен 0%, и он не выдает никаких ошибок. Я использую набор данных MNIST для модели tf.keras VGG16.

2020-02-21 13:56:28.920405: I tensorflow/core/common_runtime/gpu/gpu_device.cc:990]      0 1
2020-02-21 13:56:28.920408: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1003] 0:   N N
2020-02-21 13:56:28.920411: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1003] 1:   N N
2020-02-21 13:56:28.920459: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 10166 MB memory) -> physical GPU (device: 0, name: GeForce RTX 2080 Ti, pci bus id: 0000:01:00.0, compute capability: 7.5)
2020-02-21 13:56:30.853820: I tensorflow/stream_executor/dso_loader.cc:152] successfully opened CUDA library libcublas.so.10.0 locally
Epoch 1/3

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

Вещи, которые я пробовал:
* пользовательский DataGenerator (с использованием tf.keras.utils.Sequence)
* passsing 'use_multiprocessing = False' and 'worker 'to fit_generator

Шаги для воспроизведения: в терминальном режиме: python3 main.py

#main.py
import sys
import subprocess
import os

def main():
    args = [sys.executable, './train.py', '0']
    env = os.environ.copy()
    p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True, env=env)
    while p.poll() is None:
        for line in p.stdout:
            if not line == '':
                print(line.strip())

if __name__ == '__main__':
   main()

#train.py
import tensorflow as tf
def train():
    classes=10
    input_shape = (32,32,3)
    model = tf.keras.applications.vgg16.VGG16(input_tensor=tf.keras.layers.Input(shape=input_shape), classes=classes, weights=None )
    train_generator = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255).flow_from_directory(folder_path, 
                                                                                                        class_mode='categorical',
                                                                                                        target_size=(32,32),
                                                                                                        batch_size=2,
                                                                                                        seed=1)
    opt = tf.keras.optimizers.Adam(lr=0.0001)
    metric = [tf.keras.metrics.categorical_accuracy]
    loss = tf.keras.losses.binary_crossentropy
    model.compile(optimizer=opt, loss=loss, metrics=metric)
    history = model.fit_generator(train_generator, steps_per_epoch=30000, epochs=3)

if __name__ == '__main__':
    train()

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

def train(queue):
    classes=10
    input_shape = (32,32,3)
    model = tf.keras.applications.vgg16.VGG16(input_tensor=tf.keras.layers.Input(shape=input_shape), classes=classes, weights=None )
    train_generator = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255).flow_from_directory(folder_path, 
                                                                                                        class_mode='categorical',
                                                                                                        target_size=(32,32),
                                                                                                        batch_size=2,
                                                                                                        seed=1)
    opt = tf.keras.optimizers.Adam(lr=0.0001)
    metric = [tf.keras.metrics.categorical_accuracy]
    loss = tf.keras.losses.binary_crossentropy
    model.compile(optimizer=opt, loss=loss, metrics=metric)
    history = model.fit_generator(train_generator, steps_per_epoch=30000, epochs=3)

def main():
    q = multiprocessing.Queue
    p = multiprocessing.Process(target=train, args=([queue]))
    p.start
    p.join

if __name__ == '__main__':
    main()

Вопрос
Кто-нибудь знает, что является причиной этого и / или как Исправить это? Я думаю, что одним из способов будет использование многопроцессорной обработки и пользовательского обратного вызова, который записывает в очередь, или как-то читать строки из stdout?

...