Чтобы полностью использовать графический процессор во время обучения, мне нужно иметь возможность передавать около 250 МБ / с необработанных данных в графический процессор (данные не сжимаются). Я получаю доступ к данным через быструю сеть, которая может без проблем работать со скоростью более 2 ГБ / с c. GIL Python делает довольно сложным включение этих скоростей в тот же процесс, который запускает Tensorflow без негативного влияния на тренировку l oop. Общая память Python 3.8 может облегчить это, но это пока не поддерживается Tensorflow.
Поэтому я использую tf.io.gfile.GFile
для чтения данных по сети (данные хранятся на высокой пропускной способности S3 совместимый интерфейс). Значение GFile
состоит в том, что он не задействует GIL и, таким образом, хорошо играет с обучением l oop. Для достижения высокой пропускной способности требуется существенное распараллеливание сетевого ввода-вывода.
Мне кажется, что я могу получить только 75-100 МБ / с c из этого подхода.
Я рассчитал два подхода:
- Создайте
tf.data.Dataset
и используйте tf.data.Dataset.map(mymapfunc, num_parallel_calls=50)
(я пробовал много значений num_parallel_calls, включая AUTOTUNE). - Создайте функцию, которая читает данные, используя
tf.io.gfile.GFile
, и просто запустите ее, используя несколько потоков в concurrent.futures.ThreadPoolExecutor
, попытка подсчитать количество потоков примерно до 100 (улучшение не превышает примерно 20, и в конечном итоге больше потоков замедляет ее вниз).
В обоих случаях у меня стоит 75-100 МБ / с c.
Вопросы:
Мне интересно, есть ли причина для GFile
для достижения верхнего предела, который, возможно, более очевиден для кого-то еще.
Я также предполагаю, что мне следует проверить: tf.io.gfile.GFile
работает на numpy земле, в обоих случаях выше, я выполняю GFile
операций с python земли (в случае tf.data.Dataset
Я использую tf.py_function
). Если GFile предназначен для более эффективного выполнения операций с графами, я не знаю об этом и должен быть исправлен.