В этой статье мы рассмотрим, что, почему и как происходит сжатие модели.

Что такое сжатие модели?

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

Зачем нужно сжатие модели?

В последнее время наметилась тенденция разработки больших, плохих и подлых моделей, жадных до GPU. От GPT-3 до BERT они есть везде. Если эти модели когда-либо использовались в производственной среде, они хороши для вычислений на стороне сервера, где вы можете поддерживать большое количество TPU, работающих в фоновом режиме, но они не годятся для периферийных устройств.

Давайте рассмотрим пример на примере научно-фантастического рассказа. Скажем, вы едете в гости к другу в автономном такси. Перед вами идет пешеход, и как раз вовремя автомобиль должен решить затормозить. Здесь нельзя рисковать зависимостью от соединения на стороне сервера. Что делать, если есть отставание или отсутствие сети? Поэтому вам нужен GPU/TPU в машине, что ограничивает объем вычислений.

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

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

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

Почему в Джумио?

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

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

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

Как выполняется сжатие модели?

Сжатие модели делится на два этапа: обучение модели и развертывание модели.

Обучение модели

Во-первых, вам нужно решить, какую библиотеку использовать. Вот некоторые из них, которые вы могли бы рассмотреть:

Затем вам нужно рассмотреть проблему и выбрать путь, по которому следует идти. Теперь мы обсудим, каковы варианты выбора и как сделать правильный выбор.

Вариант 1: Использование меньших магистралей

Введение:

Самый простой способ уменьшить размер модели — использовать меньшие магистрали! Была проделана большая работа по созданию новых магистральных сетей с хорошей производительностью при меньшем количестве параметров.

Выбор модели:

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

Рассмотрение:

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

Вариант 2: обрезка и дистилляция

Сокращение вступления:

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

  • Неструктурированное сокращение. Рассматривает каждый узел отдельно и проверяет, насколько он влияет на производительность модели и является ли его влияние низким. Если величина веса мала, вес обнуляется.
  • Структурная обрезка. Удаляет из модели целые слои, а не отдельные веса.

Структурированное и неструктурированное сокращение:

Неструктурированное сокращение гораздо более гибко в своей формулировке, так как можно стремиться отсеять больше ненужных весов. Тем не менее, у него есть важное узкое место в том, что нет хороших публичных библиотек, которые могут делать выводы по разреженным нейронным сетям. Следовательно, нужно использовать веса с нулевым значением для тех, которые вырезаны. Это означает, что память, которую модель использует в производстве, остается прежней. Хотя это все еще полезно, если кто-то хочет использовать заархивированные модели, где они занимают меньшую площадь диска при расширении до полного размера в памяти (ОЗУ).

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

Введение в дистилляцию:

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

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

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

Выбор модели:

Вы можете использовать обрезку для создания студенческой сети и использовать ее в режиме обучения «ученик-учитель», хотя это менее распространено.

Обучите меньшего члена той же костяковой семьи в режиме ученик-учитель.

Вариант 3: большая модель и обрезка

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

Квантование

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

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

Этот подход проще всего реализовать; Tensorflow изначально поддерживает квантование с TFLite, и Pytorch также имеет некоторую поддержку для него. Для получения дополнительной информации см. эту запись в блоге. Вы также можете достичь более высоких уровней квантования, используя специальные инструменты развертывания и/или оборудование (процессор).

Приближение низкого ранга

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

Развертывание на периферийных устройствах

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

Размер модели + задачи

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

Размер библиотеки

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

Собственные библиотеки

В наши дни сами мобильные устройства имеют множество отличных собственных библиотек машинного обучения. В iOS есть coreml, а в Android — Tensorflow для упрощения интеграции.

Резюме

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

Я надеюсь, что этот пост помог вам понять, с чего начать работу со всеми этими инструментами и использовать их!