Пара пояснений: tf.py_func
может работать параллельно с вашим sess.run()
(потому что sess.run()
освобождает GIL), но вы не можете запустить несколько tf.py_func
в одном и том же процессе Python.
Обычный ответ в таких случаях - выполнить предварительную обработку в автономном режиме, сохранить результаты на диске (например, в формате TFRecord), прочитать готовые данные из файлов во время обучения.Вероятно, вы можете распараллелить автономную предварительную обработку, используя что-то вроде многопроцессорной обработки.
Если вы можете выразить свою предварительную обработку с помощью операций tf, вы можете запустить ее параллельно, используя Dataset.map
, но в tf.data
нет встроенной поддержки многопроцессорной обработки Python.Если вышеперечисленное не работает по какой-либо причине, вам, вероятно, придется подключить многопроцессорную систему самостоятельно.
Один из способов решения этой проблемы заключается в следующем.Пусть несколько процессов генерируют ваши входные данные, помещают их в multiprocessing.Queue (или разделяемую память с некоторой блокировкой вокруг нее).Реализуйте принимающую сторону, используя функцию генератора, и создайте набор данных, используя from_generator .