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?