Как балансировать скорость ответа модели и размер модели
Что проверяют
Умеете ли вы превратить абстрактное «сделать быстрее» в измеримую задачу с бюджетом по задержке, памяти и качеству. Следом обычно просят рассказать, какой метод вы применяли сами и сколько качества он стоил.
Как отвечать
Начните с требований, а не с методов: целевая задержка по p95 и p99, пропускная способность, железо (сервер с GPU, CPU, телефон), допустимая просадка метрики. Для LLM отдельно время до первого токена и скорость генерации. Потом замер базовой модели на целевом железе и только затем оптимизация:
- квантование: веса и активации в INT8, для LLM часто INT4 (GPTQ, AWQ) или FP8 на свежих GPU. INT8 вчетверо компактнее FP32, INT4 вчетверо компактнее FP16, а выигрыш в скорости зависит от быстрых ядер под формат. Если post-training квантование теряет много качества, помогает QAT;
- дистилляция: маленькая модель учится на выходах большой. Классический пример DistilBERT: примерно на 40% меньше и на 60% быстрее BERT при сохранении около 97% качества на GLUE;
- прунинг: структурный (каналы, головы внимания, слои) реально ускоряет, неструктурный уменьшает число ненулевых весов, но на обычном железе без разреженных ядер скорость почти не меняет;
- рантайм и сервинг: ONNX Runtime, TensorRT, OpenVINO,
torch.compile, для LLM vLLM с непрерывным батчингом, спекулятивное декодирование; - архитектура: каскад, где лёгкая модель отвечает на простые запросы, а сложные уходят к большой, кэш частых ответов, ранний выход.
Итог покажите как фронт Парето: кривая «качество против задержки», на которой вы выбираете точку под требования.
Где спотыкаются
Оптимизируют без замеров на целевом железе. Модель, быстрая на серверной GPU, может оказаться медленной на CPU в проде.
Путают размер и скорость. Неструктурный прунинг и некоторые схемы квантования уменьшают файл, но задержку почти не трогают.
Смотрят только на среднюю метрику качества. После квантования модель может заметно просесть на редких классах или длинных входах, это видно лишь на срезах данных.