Verge & IrisCore
IrisCore IrisCore
Привет, я тут набросала новую нейросеть, которая может работать в реальном времени на смарт-часах – главное, скорость и точность. Как тебе идея? Попробуем немного поднажать?
Verge Verge
Ну это что-то невероятное – нейронные сети в реальном времени на смарт-часах? Я за! Давай выжимаем максимум, убираем лишнее и посмотрим, насколько быстро мы сможем разогнаться, пока батарея не взмолится. Попробуем выжать все соки, может, и обойдем всех конкурентов!
IrisCore IrisCore
Звучит масштабно. Давай сначала разберемся с алгоритмическими узкими местами и вычистим все лишнее. Если нам удастся снизить задержку инференса до нескольких миллисекунд, батарея будет довольна, и вся система станет стабильнее. Я запущу скрипт профилирования и покажу тебе конкретные цифры.
Verge Verge
Замечательно, давай уже посмотрим на эти цифры. Убери всё лишнее, выжми максимум, и пусть задержки несутся. Запусти профайлер, покажи, где утечки, и мы превратим эти узкие места в турбо-режим!
IrisCore IrisCore
Хорошо, запускаю профайлер. Следи за статистикой в реальном времени, давай выцелим каждую миллисекунду, которую можно убрать. Отлично, запустила профайлер на текущей модели. Вот основные узкие места: во-первых, слой пакетной нормализации занимает 12% от общего времени задержки, во-вторых, полносвязный слой, объединяющий последние две карты признаков, потребляет 9%, и в-третьих, перенос данных из GPU в CPU занимает около 7%. Если мы заменим пакетную нормализацию на групповую или вообще уберем ее в финальных слоях, мы сможем сократить как минимум 10 миллисекунд. Замена полносвязного слоя на depthwise separable convolution может уменьшить эти 9% до 4%. И, наконец, можно оставить вывод на GPU и переносить только финальное предсказание, сократив время копирования вдвое. Это должно дать общий прирост примерно в 18 миллисекунд, приблизив нас к целевому показателю менее 50 миллисекунд. Скажи, какие изменения будем внедрять?
Verge Verge
Вот это данные, просто бомба – пора бежать! Я полностью за замену batch norm на group norm или вообще убираем, где это возможно, и идея с depthwise separable conv – это прямо огонь для этой узкой части с полносвязными слоями. Держать вывод на GPU и убрать копирование – очевидное решение. Давай внедрим изменения и посмотрим, как эти 18 миллисекунд улучшат результат – мы обязательно выйдем меньше 50 миллисекунд!
IrisCore IrisCore
Отлично, начну с замены batch norm слоев на group norm и уберу лишние. Потом заменю последний dense слой на depthwise separable convolution. Вывод оставлю на GPU и буду стримить напрямую. Сейчас запущу обновленную модель и проверю задержку – надеюсь попасть в этот идеальный диапазон ниже 50 миллисекунд. Скоро сообщу цифры.