Назад
58

В ускорении самое важное…

58

Ха-ха, попались? На самом деле, не существует какой-то одной вещи, которую можно применить, чтобы нейросеть ускорилась на 1000% процентов. Зато существует много мест, из-за которых ускорения может не случиться. В этой статье подсветим такие места и покажем, какие вопросы можно задать себе, чтобы не потратить много времени впустую.

Пайплайн ускорения сети

В целом, пайплайн ускорения сети выглядит следующим образом:

  1. Понимание устройства, на котором вы будете запускать нейросеть;
  2. Выбор бейслайна для ускорения (если возможно);
  3. Выбор «алгоритма ускорения»;
  4. Инференс на устройстве.

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

Устройство для инференса

Конечное устройство определяет всё, и нужно применять алгоритмы ускорения с оглядкой на него. Применили неструктурированный прунинг?

  • А вы уверены, что sparse-вычисления поддерживаются на вашем устройстве и вашим бекендом?
  • А ваше устройство всегда работает в режиме максимальной производительности или можно наоборот включить минимальное энергпотребление?
  • А насколько вообще этим устройством занимается вендор?

Все эти вопросы требуют грамотного осмысления особенностей устройств.

Например, нет смысла применять неструктурированный прунинг на android-телефоне, потому что на нём не поддерживаются разреженные вычисления.

Выбор бейслайна для ускорения

Под бейслайном для ускорения мы понимаем конкретную архитектуру: resnet-50, effnet-b2, etc. Выбор бейслайна очень тесно связан с предыдущим пунктом.

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

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

Выбор «алгоритма ускорения»

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

Например, может быть надо сразу реализовывать свой собственный NAS (Neural Architecture Search)? Идея хорошая, но вы уверены, что сможете это сделать за разумное время? А хватит ли вам вычислительных ресурсов? А гиперпараметры самого NAS нужно искать?

NAS сложно, может начать с прунинга? Или ограничиться крутым алогритмом дистилляции, а архитектура ученика это дело десятое? На все эти вопросы вы не сможете ответить без понимания теоретических основ того или иного метода.

Алгоритм ускорения я намеренно взял в кавычки, потому что при всём комплексе методов нельзя (а самое главное и не нужно) выбирать что-то одно и навсегда. Ведь это ещё и зависит от двух предыдущих пунктов.

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

Инференс на устройстве

Этот пункт я вынес отдельно, т.к. тут пойдёт речь про выбор самого бекенда на устройстве. Например, вы слышали, что fp16 ускоряет вычисления? А есть ли у вас fp16-операции для вычисления? Окей, тогда может быть квантование? Ну, например, с динамическим диапазоном?

Вот пример, где подобный алгоритм применили на телефоне Pixel2 на TFlte.

Авторам таблички следовало бы ещё добавить дисперсию при замерах времени

Заметим, что после применения квантования с динамическим диапазоном latency у MobileNet-v2 стало выше, хотя при QuantizationAwareTraining latency снизилось практически в 2 раза.

Неужели во время QAT мы учим сеть как-то снижать latency? (Конечно же, нет)

Титры

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

Нужно помнить, что вы ускоряете нейросеть не в вакууме, а под конкретное железо и бекенд. Прежде чем схватиться за архитектуру или алгоритм ускорения, попробуйте его почелленджить: точно ли он «заведётся» в моём случае? Вдумчивый ответ на этот вопрос сэкономит вам много времени, а вашей компании — денег 😉

Телеграм-канал

DeepSchool

Короткие посты по теории ML/DL, полезные
библиотеки и фреймворки, вопросы с собеседований
и советы, которые помогут в работе

Открыть Телеграм

Увидели ошибку?

Напишите нам в Telegram!