Как стать автором
Обновить

Сжимаем трансформеры: простые, универсальные и прикладные способы cделать их компактными и быстрыми

Время на прочтение6 мин
Количество просмотров5.2K
Всего голосов 19: ↑19 и ↓0+19
Комментарии13

Комментарии 13

Прунинг и дистилляция

Я пробовал дистиллировать...

А что насчёт прунинга?

Не знаю как делать прунинг, чтобы он в продакшене давал приросты по скорости. Все эти "научные" статьи, которые сначала хвастаются 95% степенью спарсификации (на матрице fp32 множителей размером со всю модель), а потом стыдливо в одно предложение говорят "ой, ну алгоритмов перемножения sparse матриц еще нет", как-то не впечатляют.


С другой стороны именно в случае self-attention модуля обрезание голов можно по идее назвать structured прунингом.

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

А какой подход к structured прунингу реально работает? Есть рецепты? Укладывается в 50 строк?)

Реально (в моих CV задачах) работает модификация прунинга, основного на Taylor expansion, рецепты которого есть, но (пока) делиться которыми не могу. В 50 строк не укладывается, но уложится в меньшее их число, если алгоритмы запихнуть в либу)

А в чем суть? Ряды Тейлора? Есть какие-то примеры / статьи / референсные имплементации?

На текущий момент, самый точный метод, известный мне по прунингу — Optimal Brain Surgeon. В этом подходе необходимо считать матрицу Гессе модели (берется приближение функцией второго порядка в окрестности минимума), и оптимальный сдвиг берется такой, что он убирает часть весов и рост ошибки наименьший. Оригинальная работа очень старая, поэтому там совсем игрушечные модели, в своей практике я работаю с моделями порядка несколько тысяч весов (ТЗ требует сверхкомпактный моделей для обработки сигналов) — и на текущий момент OBS — дает самое лучшее качество при том же количество весов. Про наличие открытых имплементаций увы не знаю. Самый простой, но грубоватый подход — magnitude based. Он добавлен в стандартные Фреймворк, есть в Tensorflow (Tutorial). Но без серьезной просадки в качестве, полагаю, более чем раза в 2 модель ужать не получится в большинстве задач.

А как эти методы потом работают в продакшене? А сетками размера реальных сеток из CV это все работает?

В Signal processing это работает на реальных архитектурах для продакшена. Детали обычно являются корпоративной тайной — поэтому в открытом доступе не появляются. В компьютерном зрении считать матрицу Гессе честно слишком накладно (ее размер для типичной архитектуры типа Resnet, EfficientNet будет порядка 10^7 x 10^7 — 10^14), что никуда не влезет. Но методы основанные на приближениях как-то работают https://arxiv.org/pdf/2101.08940.pdf. В приведенной работе где-то в 3-4 раза ужали размер модели (но правда все на CIFAR-10), а интересно было в  real-life applications увидеть пример.

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

Еще интересная работа, на мой взгляд, обучение разреженной модели с перешиванием весов — RigL. Веса убираются по magnitude-based прунингу, а новые выращиваются на основе градиента лосс-функции. В примерах есть сжатие до 4-5 раз почти без просадки качества и есть открытая реализация на Tensorflow

А в проде такие модели реально быстрее?

Нашел пример по ускорению Берта благодаря прунингу (https://blog.rasa.com/pruning-bert-to-accelerate-inference/). Но начинает уже просаживаться качество при этом. В CV — в основном работы смотрят на (количество параметров и флопс)[https://blog.rasa.com/pruning-bert-to-accelerate-inference/], но в экспериментах просто кладется маска на веса, что не ускоряет модель на практике. В обработке сигналов обычно смотрят на скорость работы — она фиксированная, а чтобы число умножений было не более определенного порога

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации