У меня есть конвейер ввода данных, который имеет:
- входные точки данных типов, которые не могут быть преобразованы в
tf.Tensor
(dicts и еще много чего) - функции предварительной обработки, которые не могли понимать типы тензорных потоков и работать с этими точками данных; некоторые из них делают увеличение данных на лету
Я пытался втиснуть это в tf.data
конвейер, и я застрял при параллельном запуске предварительной обработки для нескольких точек данных. До сих пор я пробовал это:
- использовать
Dataset.from_generator(gen)
и выполнить предварительную обработку в генераторе; это работает, но обрабатывает каждую точку данных последовательно, независимо от того, какое расположение prefetch
и fake map
вызывает, я исправляю его. Разве нельзя выполнить предварительную выборку параллельно? - инкапсулирует предварительную обработку в
tf.py_function
, чтобы я мог map
параллельно выполнить ее с моим набором данных, но - это требует некоторых довольно уродливых (de) сериализация для встраивания экзотических типов в строковые тензоры,
- , по-видимому, выполнение
py_function
будет передано (однопроцессному) интерпретатору python, поэтому я застряну с python GIL, который не сильно мне помог бы
- Я видел, что вы могли бы сделать некоторые трюки с
interleave
, но не нашел ни одного, у которого нет проблем с первыми двумя идеями.
Я что-то здесь упускаю? Я вынужден либо изменить мою предварительную обработку, чтобы она могла работать в графике, или есть ли способ мультипроцессировать ее?
Наш предыдущий способ сделать это - использовать keras.Sequence, который работал хорошо, но слишком много люди продвигают обновление до tf.data
API. (черт, даже пробуя керасы. Последовательность с tf 2.2 дает WARNING:tensorflow:multiprocessing can interact badly with TensorFlow, causing nondeterministic deadlocks. For high performance data pipelines tf.data is recommended.
)
Примечание: я использую tf 2.2rc3