Если ваш ЦП и графический процессор имеют значение <100% </strong>, ваши входы / выходы, скорее всего, являются узким местом.Попробуйте использовать пакеты большего размера , чтобы оптимизировать ввод-вывод в / из графического процессора за счет увеличения загрузки памяти. Предварительная выборка пакетов в GPU должна помочь решить эту проблему, перекрывая предварительную обработку данных с последующими вычислениями.Помимо этого, вы можете также рассмотреть возможность мониторинга загрузки диска и посмотреть, не становится ли он насыщенным.Сетевой ввод / вывод, например при потоковой передаче данных с любого вида удаленного хоста, также может быть проблемой ( например потоковая передача TFRecords из блоков хранения AWS S3 или GC).
Если ваш процессор на ~ 100%, а графический процессор <100% </strong>, то ваш процессор является узким местом.Если вы находитесь в облаке, рассмотрите возможность перехода к инстансам с большим количеством процессоров ( Процессор дешевый, GPU не хватает )Если вы не можете увеличить количество процессоров, то возможно переместить некоторые части графика в графический процессор.Тем не менее, Dataset
конвейер TF полностью работает на CPU (несмотря на это, см. ). Предварительная выборка также может помочь в этом, но стоимость порождения другого фонового потока для заполнения буфера для нисходящего потока может ослабить этот эффект.Другой вариант - выполнить некоторые или все этапы предварительной обработки в автономном режиме (, т. Е. до начала обучения).
Предварительная выборка .
- Попробуйте использовать более гибкий подход, чем
prefetch_to_device
, путем явного копирования в графический процессор с помощью tf.data.experimental.copy_to_device(...)
, а затем предварительной выборки.Это позволяет избежать ограничения, что prefetch_to_device
должно быть последним преобразованием в конвейере, и позволяет включать дополнительные приемы для оптимизации производительности Dataset
конвейера ( например, путем экспериментального переопределения распределения пула потоков ). - Попробуйте экспериментальную опцию
tf.contrib.data.AUTOTUNE
для предварительной выборки, которая позволяет среде выполнения tf.data
автоматически настраивать размеры буфера предварительной выборки в зависимости от вашей системы и среды.
В конце вы можете сделать что-то вроде этого:
dataset = dataset.apply(tf.data.experimental.copy_to_device("/gpu:0"))
dataset = dataset.prefetch(tf.contrib.data.AUTOTUNE)
Сравнение производительности .
( 8 CPU / 1x Tesla P100 /Начало V3 / Образцы ImageNet / 32 партии )