Как облегчить ResNet50 в задаче классификации?
Что проверяют
Начинаете ли вы с ограничения, а не с перечня методов. Облегчать модель можно ради размера, задержки или памяти, и у каждой цели свои инструменты. Следом обычно спрашивают, сколько точности вы готовы отдать и как это измерите.
Как отвечать
Сначала уточните цель и точку отсчёта. ResNet50 это около 25 млн параметров и порядка 4 GFLOPs на изображение 224×224. Замерьте задержку на целевом железе и точность на валидации, иначе сравнивать будет не с чем.
Дальше методы, от дешёвых к трудоёмким:
- другой backbone: ResNet18, MobileNetV3, EfficientNet-B0. Часто это самый большой выигрыш при небольшой потере, особенно если классов немного;
- меньший вход: вычисления свёрточной сети растут примерно квадратично от стороны картинки, 160 вместо 224 дают почти двукратную экономию;
- квантование: FP16 на GPU почти бесплатно, INT8 уменьшает веса вчетверо относительно FP32. Сначала post-training с калибровкой на нескольких сотнях картинок, при заметной просадке quantization-aware training. Инструменты: TensorRT, ONNX Runtime, OpenVINO, в PyTorch библиотека
torchao; - структурный прунинг: удаление целых каналов с последующим дообучением. В отличие от поэлементного, реально сокращает вычисления;
- дистилляция: ResNet50 становится учителем, лёгкий студент учится на его смягчённых температурой логитах и на истинных метках;
- компиляция: слияние BatchNorm со свёрткой, экспорт в ONNX,
torch.compile. Модель та же, работает быстрее.
После каждого шага снова меряйте точность и задержку и останавливайтесь, когда требование выполнено.
Где спотыкаются
Называют dropout, batch normalization и аугментации. Это про качество обучения, а не про облегчение: BatchNorm в ResNet уже есть, а dropout на инференсе выключен.
Обещают ускорение от torch.nn.utils.prune. Он зануляет веса маской, тензор остаётся той же формы, и без разреженных ядер скорость не меняется.
Сравнивают модели по FLOPs, а не по замеру. На GPU depthwise-свёртки упираются в память, и выигрыш в операциях не превращается в такой же выигрыш во времени.