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

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

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

Доброго времени суток. Есть несколько решений данной проблемы, но важно понимать что ускорить модель без потерь в accuracy довольно сложно.

Популярный метод который доказывает свою эффективность на практике это Квантование (Quantization https://arxiv.org/pdf/2103.13630.pdf), поскольку сразу решает две проблемы: облегчает модель и ускоряет время вывода. Осуществляется по принципу округления значений весов на более низкий уровень. Например, использовать числа половинной точности вместо чисел двойной точности.

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

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

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

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

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

Второе возможное решение это компиляторы графов. В данном случае из основной модели стоится граф и он оптимизируется под конкретное железо. Например, TensorRT™ — это SDK для высокопроизводительного вывода на основе глубокого обучения для видиокарт NVIDIA. Другой пример Apache TVM.

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

Мне кажется правильнее было бы сравнивать полносвязную сеть с CNN, используя одни и те же функции потерь. Но вообще, как мне кажется, такое сравнение не соберёт большого внимания, т.к. на сегодня есть сети точнее и куда более интереснее, чем LeNet или FCNN

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