Увеличение batch_size
не поможет, поскольку torchvision
выполняет преобразование для одного изображения, когда оно загружено с вашего диска.
Существует несколько способов ускорения загрузки данных с повышением уровня сложности. :
- Улучшение времени загрузки изображений
- Загрузка и нормализация изображений и кэша в ОЗУ (или на диске)
- Создание преобразований и сохранение их на диск
- Применение преобразований без кэширования (повороты, переворачивания, кадрирование) пакетным способом
- Предварительная выборка
1. Улучшение загрузки изображения
Простые улучшения можно получить, установив Pillow-SIMD вместо оригинального pillow
. Это замена для замены и может быть быстрее (или так востребовано по крайней мере для Resize
, который вы используете).
В качестве альтернативы, вы можете создать свою собственную загрузку и обработку данных с помощью OpenCV
как говорят некоторые, быстрее или проверяют альбуминаций (хотя не могу сказать, улучшат ли они производительность и могут ли они потратить много времени впустую, не получая никакой выгоды, кроме опыта обучения).
2. Загрузка и нормализация изображений и кэша
Вы можете использовать функциональность Python LRU Cache для кэширования некоторых выходных данных.
Вы также можете использовать torchdata
, который действует почти так же, как torch.utils.data.Dataset
PyTorch, но позволяет кэшировать на диск или в ОЗУ (или смешанные режимы) с простыми cache()
на torchdata.Dataset
(см. github репозиторий , отказ от ответственности: я автор ).
Помните: вы должны загружать и нормализовать изображения, кэш и после этого использовать RandomRotation
, RandomResizedCrop
и RandomHorizontalFlip
(поскольку они меняются при каждом запуске).
3. Произведите преобразования и сохраните их на диск
Вам потребуется выполнить много преобразований изображений, сохранить их на диск и впоследствии использовать этот расширенный набор данных. Еще раз, это может быть сделано с torchdata
, но это действительно расточительно, когда дело доходит до ввода-вывода и жесткого диска и очень не элегантного решения. Кроме того, это «stati c», поэтому данные будут длиться только для X эпох, это не будет «бесконечный» генератор с дополнениями.
4. Пакетные преобразования
torchvision
не поддерживают его, поэтому вам придется писать эти функции самостоятельно. См. эту проблему для обоснования. AFAIK никакая другая третья сторона не предоставляет это также. Для больших партий это должно ускорить процесс, но я думаю, что реализация - это открытый вопрос (поправьте меня, если я ошибаюсь).
5. Предварительная выборка
ИМО будет сложнее всего реализовать (хотя очень хорошая идея для проекта - подумать об этом). В основном вы загружаете данные для следующей итерации, когда ваша модель тренируется. torch.utils.data.DataLoader
действительно предоставляет его , хотя есть некоторые проблемы (например, рабочие, останавливающиеся после загрузки своих данных). Вы можете прочитать ветку PyTorch об этом (не уверен, так как я не проверял самостоятельно). Кроме того, много ценного понимания , предоставленного этим комментарием и этого сообщения в блоге (хотя не уверен, насколько они актуальны).
Все в все, чтобы существенно улучшить загрузку данных, вам нужно сильно испачкать руки (или, может быть, есть библиотеки, делающие это для PyTorch, если да, я бы хотел узнать о них).
Также не забудьте профилировать свои изменения, см. torch.nn.bottleneck
РЕДАКТИРОВАТЬ: DALI проект может быть стоит проверить Хотя у AFAIK есть некоторые проблемы с тем, что объем оперативной памяти растет линейно с числом эпох.