У меня есть поток данных, на котором я тренирую несколько моделей Keras.Входящие данные сортируются по разным категориям.Если будет собрано достаточное количество данных для одной категории, я создаю модель, выполняю некоторые начальные занятия по ней, сохраняю ее в структуру данных для последующего использования и делаю классификации по данным категории модели, поступающим в поток.Во втором потоке я проверяю условия, которые могут возникнуть для переобучения модели новым данным и переобучения в этом потоке, если необходимо.
Пока это работает вполне нормально.
Чтобы не блокироватьОбработка входящего потока данных в ожидании завершения начального обучения. Я также переместил это начальное обучение во второй поток.
Проблема теперь заключается в следующем: как только я перенесу начальное обучение на производительность второго потока наобучение (функция model.fit) становится ужасным.Он использует только одно ядро, хотя перед перемещением в другой поток он использовал все ядра.Если я верну его снова, все снова будет хорошо.До сих пор я не могу придумать объяснения этому поведению или решения.
У кого-нибудь есть подсказка для меня?
Я пытался поиграться с tf.Graph и tf.Sessionобъекты, но безрезультатно ...
Редактировать: Я помещаю sleep (5) в код первого потока, как только второй поток начинает выполнять начальное обучение модели.Затем скорость тренировки снова поднимается до приемлемого уровня.Похоже, что работа первого потока мешает работе второго потока.На самом деле входящий поток идет с максимальной скоростью в моем тестовом сценарии, таким образом, используя одно целое ядро.Похоже, это может быть связано с ограниченным питонным потоком питонов?Хотя мне интересно, почему это не проблема при переобучении во втором потоке.
Редактировать: Похоже, что я сталкиваюсь с ограничениями GIL Python здесь.Постараюсь найти способ обойти это ...