Может ли подпроцесс передавать данные в Tensorflow напрямую, без прохождения основного процесса Python (без блокировки GIL)? - PullRequest
1 голос
/ 04 апреля 2020

Я работаю с моделью с высоким IO (один графический процессор может жевать 600 МБ / с c несжимаемых данных). Для обработки ввода-вывода требуется около 4 процессорных ядер, поэтому основной обучающий процесс l oop не может этого сделать.

В настоящее время у меня есть несколько подпроцессов, которые отбирают данные из распределенной файловой системы и записывают в локальную систему. Файлы tfrecords (размер набора данных превышает локальное хранилище). Мой основной учебный процесс использует TFRecordsDataset & tf.data.Dataset.from_generator для перебора файлов по мере их записи на диск.

Это работает, но запись на диск только для повторного чтения является явно неоптимальной. Интересно, есть ли лучший подход, который может использовать подпроцессы для передачи сэмплов непосредственно в Tensorflow? Я не могу передать данные в основной учебный процесс через Python, потому что для перемещения такого количества данных требуется более 1 ядра ЦП, и узкие места Python в GIL.

Я попытался написать данные в именованные каналы, но TFRecordsDataset выполняет операции поиска и, следовательно, не может читать из каналов, только файлы. Есть еще идеи?

1 Ответ

1 голос
/ 04 апреля 2020

На ум приходит пара вещей:

Если вы этого еще не сделали, поместите локальные данные на SSD (если возможно, NVMe). Это дает значительное ускорение без каких-либо изменений кода.

Вы можете попробовать чтение / запись локальных файлов с помощью mmap. Затем ОС сохранит в памяти последние просмотренные страницы; столько, сколько поместится в дисковый кеш. Если одна программа записывает данные, а другие их читают, это похоже на общую память, но с файловым интерфейсом.

Вы можете использовать сокеты для передачи данных между процессами.

См., Например, это пример pytables .

Если вы работаете в UNIX -подобной системе, вы можете использовать общую память POSIX через ctypes. Конечно, если бы вы могли использовать разделяемую память 3.8 из multiprocessing, это, вероятно, намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...