В нашу эпоху глубокого обучения и искусственного интеллекта обучение модели с миллионами параметров - задача не из дешевых. Я имею в виду и метафорически, и буквально. И если у вас нет для этого личной настройки, обучение модели на облачных ресурсах может стоить вам целого состояния.

Существует множество сервисов, которые предоставляют вычислительные машины с графическими процессорами с поддержкой CUDA. Но все они почти одинаково дороги. А если ваш код плохо оптимизирован, это будет для вас проклятием.

Многие из наших энтузиастов глубокого обучения на самом деле не сосредотачиваются на оптимизации кода и пытаются выделить чрезмерное количество ресурсов только для небольшого улучшения общей производительности. Но с небольшой оптимизацией они могут добиться того же и сэкономить много времени и денег.

Итак, здесь я собираюсь указать на некоторые из лучших практик по снижению затрат на обучение моделей глубокого обучения.

Профилирование кода

Профилирование кода не так популярно среди практиков глубокого обучения, но оно может помочь лучше понять, что происходит под капотом. Профилирование вашего кода может означать многое, но сейчас самое важное - знать, какие функции или методы отнимают у вас большую часть времени.

Каждая структура глубокого обучения оптимизирована для выполнения задач манипулирования матрицами. Но у модели есть еще много чего предложить. Например, операция свертки обычно занимает гораздо больше времени, чем простое преобразование матрицы. В другом случае, возможно, вы написали новую технику, которая включает в себя циклы с многократным повторением ваших параметров. Или, может быть, вы применяете предварительную обработку данных с учетом содержимого на лету.

Когда вы профилируете свой код, вы сможете легко обнаружить все эти узкие места. Возможно, некоторые из блокираторов будут неизбежны, но вы обязательно найдете такие, которых легко избежать.

Как написать хороший загрузчик данных

Когда вы тренируете свою модель, ваше внимание должно быть обращено на то, насколько хорошо она обучается, это ваш главный приоритет. Таким образом, ваш загрузчик данных должен предоставлять необходимые данные всякий раз, когда они нужны модели, а не заставлять модель ждать. Потратив немного времени на написание хорошего загрузчика данных, вы, в конечном итоге, выиграете во многих отношениях.

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

Если ваш метод обучения позволяет, вы также можете сохранить свои данные в контейнерах HDF5 / Parquet / Feather и прочитать их позже в процессе обучения. В формате HDF5 вы можете сохранять данные в разных группах, чтобы получать данные еще быстрее.

Мониторинг использования системы

Системный мониторинг поможет вам лучше понять, насколько хорошо вы используете свои ресурсы.

Например, на приведенном выше рисунке мы видим, что из-за неспособности нашего ЦП доставлять данные вовремя, графический процессор не может работать на полную мощность. В этом случае добавление другого графического процессора или замена графического процессора на больший объем памяти и мощности не решат проблему.

Теперь, когда процессоры намного дешевле, чем графические процессоры, после добавления мощного процессора результат должен выглядеть следующим образом

Графики показывают значительное улучшение использования графического процессора, но снижение рабочего цикла центрального процессора. Хотя это всего лишь пример, он демонстрирует, как мы можем найти лучший компромисс, чтобы уменьшить потери ресурсов.

Тренировка на смешанную точность

Обучение со смешанной точностью¹ теперь является признанным методом для более быстрого обучения моделей глубокого обучения и уменьшения вычислительной сложности. Мы можем воспользоваться этой техникой, если мы выполняем PoC или в ситуации, когда мы вынуждены идти на компромисс между точностью и скоростью.

Сниженная точность значительно сокращает время обучения, а также требует меньше памяти. Вдобавок ко всему, если мы будем использовать бортовые компьютеры для развертывания таких моделей, время вывода также значительно сократится.

Распределение графических процессоров позже

Когда вы находитесь на начальной стадии разработки, вам может вообще не понадобиться графический процессор. Перевод кодов из режима CPU в режим GPU занимает всего несколько секунд. Так что не тратьте деньги на неиспользованный графический процессор.

Выполняйте всю очистку данных, предварительную обработку и проверки работоспособности в режиме ЦП, и, наконец, когда вы уверены в своем коде, выделите графический процессор в соответствии с вашим бюджетом и требованиями.

Сохраняйте как можно больше информации

Постарайтесь уменьшить количество бессмысленных экспериментов. Новички делают эту ошибку чаще. Они не регистрируют никакой информации об обучении и в конечном итоге проводят одни и те же эксперименты несколько раз.

По крайней мере, запишите гиперпараметры и основные изменения в стратегии обучения, чтобы исключить такие события.

Расчет накопленного градиента

Накопление градиентов может быть спасением, если у вас заканчивается память графического процессора при попытке выполнить большой пакет. Например, если вы можете без проблем передать пакет из 4 образцов, но вы хотите передать пакеты из 16 образцов, то вы можете сделать 4 прямого прохода и накопить потери каждого прохода. Затем выполните только один проход назад для этих 4 партий.

К сожалению, не все фреймворки глубокого обучения предоставляют эту функцию накопления градиента, поэтому вам может потребоваться написать некоторые дополнительные функции для ее реализации.

Использование PyBind для ускорения работы

Не позволяйте вашей преданности языку программирования обходиться вам дороже, чем она того заслуживает. Python предоставляет множество возможностей и гибкости, но с точки зрения скорости он значительно медленнее, чем C / C ++ и многие другие языки программирования.

Итак, научитесь писать код на C ++, чтобы ускорить общий процесс обучения. PyBind11 - отличный инструмент для объединения C ++ 11 с Python. Попробуйте!

Использование инструментов настройки гиперпараметров

Потратьте время на инструменты настройки гиперпараметров⁴. Поверьте, позже это сэкономит много времени.

Неправильная инициализация данных с настройкой гиперпараметров по умолчанию может стоить вам дополнительных десяти или сотен эпох для достижения желаемой цели. Поэтому вместо того, чтобы тратить время на каждый эксперимент, постарайтесь потерять его хоть раз в начале.

Использование признанной структуры для автоматизации вещей

Есть несколько замечательных библиотек и фреймворков для автоматизации многих вещей, о которых говорилось выше. Например, если вы используете Pytorch, то есть библиотеки, такие как Pytorch Ignite и Pytorch-lightning, чтобы выполнять за вас множество утомительных задач.

В последнее время Pytorch-lightning³ приобрел большую популярность благодаря объединению множества полезных функций, которые могут дать вам прочную основу для более организованного проведения ваших экспериментов. Различные полезные хуки с поддержкой сторонних библиотек сделали его одной из лучших библиотек машинного обучения.

Optuna, с другой стороны, представляет собой специализированный фреймворк для настройки гиперпараметров, который может запускать сложные алгоритмы поиска гиперпараметров даже для дорогостоящих в вычислительном отношении моделей. Интегрировать его с популярным фреймворком Deep Learning очень просто и интуитивно понятно.

Увидеть общую картину

Наконец-то клише!
Попробуйте визуализировать свой прогресс с помощью стандартных показателей и оценок. Это даст вам более широкое представление о поведении вашей модели. Скорее всего, вам не захочется продолжать обучение модели, которая с самого начала переоснащается.

Я надеюсь, что этот пост поможет вам более эффективно проводить эксперименты по глубокому обучению. Если у вас есть какие-либо вопросы или предложения относительно этой публикации, пожалуйста, оставьте комментарий. Хорошего дня!

использованная литература

  1. Смешанное прецизионное обучение - Nvidia
  2. Автоматическая система смешанной точности Pytorch
  3. Примеры молний Pytorch
  4. Оптуна + Pytorch Lightning
  5. Пользовательские расширения C ++ и CUDA