Автор: Александр Гончаренко, СТО enot.ai

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

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

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

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

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

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

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

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

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

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

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

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

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