Как увеличить скорость на тесте без повторного обучения модели?
Что проверяют
Умеете ли вы ускорить инференс, не трогая обучение: сжать модель, сменить рантайм, правильно подавать данные. Следом спрашивают, сколько качества вы готовы отдать за скорость и как это измерите.
Как отвечать
Сначала профилирование: где уходит время, в самой модели, в препроцессинге или в сериализации и сети. Нередко узкое место это построчная предобработка в pandas, а не модель. Дальше по слоям:
- батчинг: предсказывать пачками, а не по одному объекту. На GPU это главный рычаг, для онлайн-сервиса есть динамический батчинг, например в Triton Inference Server;
- квантизация после обучения (PTQ): веса и активации в INT8, FP16 или BF16. Ускорение ощутимое, но потерю качества обязательно меряют на отложенной выборке;
- компиляция и рантайм: экспорт в ONNX и ONNX Runtime, TensorRT для GPU NVIDIA, OpenVINO для процессоров Intel,
torch.compileв PyTorch 2; - режим инференса:
model.eval()иtorch.inference_mode(), чтобы не строить граф для градиентов; - бустинги: предсказание на части деревьев (
iteration_rangeв XGBoost,num_iterationв LightGBM) и компиляция ансамбля через Treelite; - кэш: повторяющиеся запросы и эмбеддинги неизменных объектов считают один раз;
- признаки: убрать дорогой признак без переобучения нельзя, но его можно посчитать заранее и отдавать из feature store.
Дистилляцию и прунинг с дообучением стоит назвать как следующий шаг, если ограничение «без переобучения» можно ослабить.
Где спотыкаются
Предлагают PCA или отбор признаков. Модель обучена на исходном пространстве признаков, и подать ей сжатые данные без переобучения нельзя.
Меряют скорость одним прогоном без прогрева и не на целевом железе. Первый вызов включает загрузку, компиляцию и выделение памяти; честный замер это p50 и p99 задержки после прогрева на том сервере, где модель будет работать.
Квантизуют и не проверяют качество. Часть моделей в INT8 теряет заметно больше ожидаемого, и видно это только на своей выборке и по бизнес-метрике.