tf.data: распараллелить шаг загрузки - PullRequest
5 голосов
/ 22 апреля 2020

У меня есть конвейер ввода данных, который имеет:

  • входные точки данных типов, которые не могут быть преобразованы в tf.Tensor (dicts и еще много чего)
  • функции предварительной обработки, которые не могли понимать типы тензорных потоков и работать с этими точками данных; некоторые из них делают увеличение данных на лету

Я пытался втиснуть это в tf.data конвейер, и я застрял при параллельном запуске предварительной обработки для нескольких точек данных. До сих пор я пробовал это:

  • использовать Dataset.from_generator(gen) и выполнить предварительную обработку в генераторе; это работает, но обрабатывает каждую точку данных последовательно, независимо от того, какое расположение prefetch и fake map вызывает, я исправляю его. Разве нельзя выполнить предварительную выборку параллельно?
  • инкапсулирует предварительную обработку в tf.py_function, чтобы я мог map параллельно выполнить ее с моим набором данных, но
    1. это требует некоторых довольно уродливых (de) сериализация для встраивания экзотических типов в строковые тензоры,
    2. , по-видимому, выполнение 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

...