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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Введение:

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

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

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

Внимание:

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

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

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

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

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

Структурированная и неструктурированная обрезка:

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

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

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

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

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

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

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

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

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

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

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

Квантование

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

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

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

Аппроксимация низкого ранга

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

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

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

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

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

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

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

Родные библиотеки

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

Резюме

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

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