Я заменил конвейер предварительной обработки CIFAR-10 в проекте подходом Dataset API, что привело к снижению производительности примерно на 10-20%.
Предварительная обработка довольно стандартна: - читать изображение с диска - произвольно / обрезать и переворачивать - перемешивать, пакетно - передавать в модель
В целом я вижу, что пакетная обработка теперь на 15% быстрее, но время от времени (или, точнее, всякий раз, когда я повторно инициализирую фрейм данных или ожидаю перетасовки), пакет блокируется на долгое время (30 секунд), что в сумме составляет более медленную эпоху -периодическая обработка.
Такое поведение, похоже, связано с внутренним хешированием. Если я уменьшу N в ds.shuffle (buffer_size = N), задержки будут короче, но пропорционально более частыми. Удаление перемешивания во всех результатах приводит к задержкам, как если бы buffer_size был установлен равным размеру набора данных.
Может ли кто-нибудь объяснить внутреннюю логику Dataset API, когда дело доходит до чтения / кеширования? Есть ли вообще причина ожидать, что API набора данных будет работать быстрее, чем очереди, созданные вручную?
Я использую TF 1.3.