В ускорении самое важное…
Ха-ха, попались? На самом деле, не существует какой-то одной вещи, которую можно применить, чтобы нейросеть ускорилась на 1000% процентов. Зато существует много мест, из-за которых ускорения может не случиться. В этой статье подсветим такие места и покажем, какие вопросы можно задать себе, чтобы не потратить много времени впустую.
Пайплайн ускорения сети
В целом, пайплайн ускорения сети выглядит следующим образом:
- Понимание устройства, на котором вы будете запускать нейросеть;
- Выбор бейслайна для ускорения (если возможно);
- Выбор «алгоритма ускорения»;
- Инференс на устройстве.
Как правило, эти пункты сильно связаны между собой. Изменения в одном пункте могут повлечь пересмотр других. Разберём по шагам каждый из четырёх пунктов и укажем на их особенности.
Устройство для инференса
Конечное устройство определяет всё, и нужно применять алгоритмы ускорения с оглядкой на него. Применили неструктурированный прунинг?
- А вы уверены, что 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? (Конечно же, нет)
Титры
В ускорении сетей есть много мест, из-за которых можно потратить время и силы впустую, если заранее не подумать.
Нужно помнить, что вы ускоряете нейросеть не в вакууме, а под конкретное железо и бекенд. Прежде чем схватиться за архитектуру или алгоритм ускорения, попробуйте его почелленджить: точно ли он «заведётся» в моём случае? Вдумчивый ответ на этот вопрос сэкономит вам много времени, а вашей компании — денег 😉