
В ходе наших исследований и разработки продукта мы систематизировали ряд лучших практик для эффективного обучения CNN, и мы хотели бы поделиться некоторыми из них с вами здесь.
tl;dr
Обучите свою CNN намного быстрее, используя Composer (наша библиотека для эффективного обучения) и образ докера MosaicML, а также включите последние каналы с помощью аргумента командной строки --algorithms channels_last.
Введение
Цель MosaicML — сделать обучение нейронной сети более эффективным за счет улучшения алгоритмов и программного обеспечения. Мы проводим эмпирические исследования, чтобы понять процесс обучения и разработать методы, которые сокращают время или стоимость обучения. Мы уже добились ускорения и снижения затрат на стандартных тестах: 3,4x для зрения и 1,6x для NLP. Наша цель — добиться 4-кратного ускорения и снижения затрат в год и повторять этот подвиг каждый год.
В ходе наших исследований и разработки продуктов мы систематизировали ряд передовых методов эффективного обучения и хотели бы поделиться некоторыми из них с вами здесь. Большинство лучших практик, которые мы обсуждаем здесь, относятся к обучению CNN, но следите за сообщениями в блогах о более общих и специфичных для НЛП передовых практиках. Некоторые из лучших практик в этом посте могут быть знакомы опытным специалистам по машинному обучению, но вы будете удивлены, узнав, сколько известных документов и популярных программных библиотек не используют их. Когда это возможно, мы предоставляем подробную информацию или ссылки о том, как реализовать эти передовые методы. Но мы также избавили вас от работы по их внедрению, объединив их все в одном месте: Composer, наша библиотека для эффективного обучения.
Без лишних слов, давайте начнем!
1. Нет неоднозначных мнений о тренировках смешанной точности

Большинство сред глубокого обучения используют 32-битную плавающую точку (FP32, или полная точность) для всех значений — весов моделей, активаций, градиентов и состояния оптимизатора — и арифметических операций. Можно ускорить обучение, уменьшив точность всех значений и операций до 16-битной с плавающей запятой (FP16, или половинная точность), но это может серьезно ухудшить качество модели. Однако снижение точности только некоторых значений и операций до FP16 может ускорить обучение без какого-либо снижения качества модели, что приведет к значительному повышению эффективности. Это сочетание FP32 и FP16 называется тренировкой смешанной точности.
Простой способ выполнить обучение смешанной точности — использовать библиотеку NVIDIA’s AMP (Automatic Mixed Precision), которая интегрирована с PyTorch. AMP работает, сохраняя первичную копию весов модели в FP32, затем создавая копию модели FP16 и выполняя полное прямое и обратное распространение в FP16. Затем градиенты веса преобразуются в FP32 перед обновлением основных весов модели. Эта последняя деталь — обновление веса в FP32 — имеет решающее значение для получения хороших результатов.
На качество модели не влияет обучение смешанной точности, и оно дает существенные преимущества: обучение может быть ускорено в 2–4,5 раза, а требования к памяти могут быть снижены почти в 2 раза по сравнению с обучением FP32. Увеличение скорости обучения связано с тем, что скорость умножения двух чисел примерно пропорциональна квадрату битов числа. Уменьшение объема памяти связано с тем, что числа FP16 вдвое меньше чисел FP32. Эти преимущества делают обучение смешанной точности особенно ценным для обучения больших моделей и более быстрого обучения моделей.
AMP включается одним гиперпараметром (точность: amp в файле конфигурации или --precision amp в командной строке) и включен по умолчанию в Composer.
2. Каналы для быстрого обучения CNN

Преобразователи зрения могут быть горячей новинкой в исследованиях компьютерного зрения, но сверточные нейронные сети (СНС) все еще живы и работают, поэтому есть веские причины заботиться об их более эффективном обучении.
Свертки обычно работают с четырехмерными тензорами, где размеры соответствуют пакету из N выборок (например, изображений), C каналов (например, каналы красного, зеленого и синего цветов на входе) и картам объектов H x W (например, , отдельные пиксели этих каналов). Например, пакет из 128 изображений RGB размером 224 x 256 пикселей будет представлен как тензор 128 (изображений) x 3 (RGB) x 224 (ширина пикселя) x 256 (высота пикселя). Большинство библиотек глубокого обучения хранят тензоры в памяти в формате NCHW, то есть с шириной в качестве размерности тензора, который непрерывно хранится в памяти. Но современные графические процессоры NVIDIA — наиболее распространенное оборудование для обучения моделей глубокого обучения — выполняют свертки в формате NHWC (т. е. с последними каналами). Это означает, что тензоры NCHW необходимо транспонировать в NHWC перед каждой сверткой. Хранение в виде NHWC устраняет необходимость в таком перемещении и экономит время и вычислительные ресурсы.
NVIDIA сообщает об улучшении производительности в 1,15–1,6 раза (TFLOPS) при использовании последних каналов, а это руководство по PyTorch сообщает об улучшении пропускной способности в 1,22 раза (изображений в секунду). Наши внутренние тесты показывают, что последние каналы могут повысить пропускную способность в 1,2-1,3 раза, в зависимости от оборудования. Это делает каналы бесплатным обедом для всех, кто обучает модель с помощью сверточных слоев на архитектуре Volta (V100) или более новом графическом процессоре NVIDIA.
Channels last — это один из многих методов ускорения, включенных в Composer, где его можно включить с помощью одного гиперпараметра (если применяется в командной строке: --algorithms channels_last).
3. Следите за своим шагом: пошаговые графики скорости обучения

Планирование скорости обучения (LR) — корректировка скорости обучения в ходе обучения — имеет важное значение для достижения самых современных результатов с глубокими сетями. Существует множество различных шаблонов расписания LR (см. этот удобный список из Papers With Code), и каждое из этих расписаний может быть реализовано с разным временным разрешением. Точно так же, как время настенных часов можно измерять в разных единицах, таких как минуты, часы и дни, обучение можно разделить на отдельные шаги (одно обновление веса) и эпохи ( достаточно шагов, чтобы пройти через весь набор данных). Обычно скорость обучения планируют с разрешением эпохи, то есть корректировка скорости обучения происходит только один раз за эпоху.
Однако мы в MosaicML обнаружили, что использование пошагового разрешения расписания LR (т. е. изменение скорости обучения в соответствии с расписанием после каждого шага) дает более высокую производительность по сравнению с эпохальным разрешением. В частности, мы обнаружили, что пошаговые расписания LR могут повысить точность на 0,2–0,4% для ResNet-50, обученного на ImageNet, по сравнению с идентичными в остальном моделями, обученными по эпохальным расписаниям (см. наш рецепт обучения здесь). Поскольку скорость обучения и точность часто взаимозаменяемы, это повышение точности приводит к повышению скорости обучения: ResNet50, обученная по ступенчатому графику LR, тренируется с целевой точностью примерно в 1,06 раза быстрее, чем эквивалентная модель, обученная с эпохальным разрешением.
Реализации планировщика скорости обучения в большинстве сред глубокого обучения (например, PyTorch, TensorFlow) реализованы с учетом разрешения по эпохам по умолчанию, что возлагает на пользователя бремя преобразования между шагами и эпохами. Композитор облегчает эту головную боль, позволяя описывать графики скорости обучения в одном разрешении, а выполнять их в другом. Например, пользователь может описать график скорости обучения в эпохах (например, прогрев для 5 эпох, косинусное затухание для 95 эпох), что часто является более интуитивно понятным и удобным решением, но под капотом Composer выполняет график скорости обучения по шагам для превосходную производительность.
Пошаговое разрешение для расписаний LR переключается одним гиперпараметром (шаг --schedulers.{имя_названия}.interval) и включено по умолчанию в Composer.
4. Полегче с увеличением изображения

Увеличение данных — это метод, при котором новые выборки данных создаются путем изменения существующих выборок данных, например, путем поворота или изменения контраста изображения. Это обычно используемый метод для повышения производительности моделей глубокого обучения для компьютерного зрения. Аугментация данных дает два преимущества: она увеличивает эффективное количество выборок данных и может позволить модели научиться быть инвариантной по отношению к аугментациям. Используя классификацию изображений в качестве примера, хороший классификатор изображений должен распознавать, что изображение собаки все еще должно быть классифицировано как собака, даже после того, как изображение было переведено или перевернуто влево-вправо.
Увеличение данных для изображений (то есть увеличение изображения) является неотъемлемой частью большинства рецептов обучения для достижения самых современных результатов во многих задачах компьютерного зрения. К популярным схемам увеличения изображения относятся AutoAugment, RandAugment и AugMix, каждая из которых последовательно выполняет множество дополнений изображения. Увеличение изображения по умолчанию выполняется ЦП в стандартных средах глубокого обучения. Но это может иметь непредвиденные последствия для скорости обучения.
Мы в MosaicML провели серию экспериментов, чтобы проверить эффективность методов увеличения изображения. Мы обнаружили, что методы аугментации изображения действительно повышают точность на основе шага или эпохи — требуется меньше шагов для достижения той же производительности по сравнению с тем, чтобы не использовать методы аугментации, — но эти методы часто настолько интенсивно используют ЦП, что они существенно увеличить время на шаг. Конечным результатом было то, что время обучения настенных часов с заданной точностью было фактически увеличено в 1,5-8 раз по сравнению с обучением без увеличения изображения, в зависимости от конфигурации оборудования и схемы увеличения. Это означает, что вы ограничены чем-то другим, кроме вашего дорогого графического процессора, что фактически приводит к его потере. Следите за новостями в блоге, где скоро появится подробный пост об увеличении изображения!
Суть в том, что касается влияния увеличения изображения на время обучения:
- Используйте схемы дополнений, которые менее требовательны к ЦП, такие как TrivialAugment (который похож на RandAugment, но требует меньше дополнений для каждого изображения).
- Используйте аппаратные конфигурации с большей вычислительной мощностью ЦП:ГП (например, много ЦП на ГП или относительно старые/недостаточно мощные ГП).
- Тренируйте большие модели. Это снижает пропускную способность графического процессора и дает центральному процессору больше времени, чтобы не отставать.
- Выполняйте аугментацию изображения на графическом процессоре с помощью такой библиотеки, как Kornia или DALI.
5. Смягчите удар по обработке изображений с помощью Pillow-SIMD

Фреймворки глубокого обучения используют сторонние библиотеки для обработки изображений ЦП. Эти библиотеки обрабатывают все, от операций низкого уровня, таких как декодирование JPEG, до операций высокого уровня, таких как увеличение данных. Pytorch и Keras делают это с помощью библиотеки Pillow по умолчанию, но мы смогли ускорить обучение ResNet50 на ImageNet в 1,2–2 раза (в зависимости от аппаратной платформы и рецепта обучения) с помощью Pillow-SIMD, прямая замена подушке. Pillow-SIMD ускоряет обработку изображений за счет распараллеливания определенных операций. Это, в свою очередь, может ускорить обучение, поскольку обработка изображений ЦП часто создает узкие места для обучения, как обсуждалось в предыдущем разделе. В сценариях, в которых обработка изображений ЦП может не создавать узких мест, таких как обучение большого ViT или ResNet-152, мы можем не заметить изменения пропускной способности при переключении на Pillow-SIMD.
Несмотря на то, что установить Pillow-SIMD довольно просто, наш докер-образ Composer уже загружен с ним, так что вам не о чем беспокоиться.
Заключение
Мы надеемся, что эти передовые методы ускорят обучение вашей модели. Следите за новостями от MosaicML по другим темам эффективного машинного обучения! И, как всегда, мы будем рады ответить на ваши вопросы, принять ваши запросы на включение и пригласить вас присоединиться к команде!
Первоначально опубликовано на https://www.mosaicml.com.