Что делать, если трансформер, выпущенный в production, не проходит нагрузочное тестирование?

«Что делать, если трансформер, выпущенный в production, не проходит нагрузочное тестирование?» — вопрос из категории MLOps и деплой моделей, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

1. Профилирование и поиск узких мест:

  • Использую torch.profiler или cProfile для анализа времени выполнения каждого слоя модели.
  • Мониторю метрики инфраструктуры: загрузку GPU/CPU, память, задержку (latency) и пропускную способность (throughput) под нагрузкой.
  • Смотрю, упираюсь ли я в вычисления (compute-bound) или в передачу данных (memory/IO-bound).

2. Оптимизация модели:

  • Квантование: Применяю динамическое или статическое квантование для уменьшения размера модели и ускорения вычислений.
    import torch
    # Динамическое квантование
    quantized_model = torch.quantization.quantize_dynamic(
        original_model, {torch.nn.Linear, torch.nn.LSTM}, dtype=torch.qint8
    )
  • Прунинг (обрезка): Удаляю малозначимые веса в модели.
  • Дистилляция знаний: Заменяю большую модель на меньшую, обученную повторно с учителем.
  • Использование более легких архитектур: Рассматриваю замену на DistilBERT, TinyBERT или MobileBERT.

3. Оптимизация пайплайна инференса:

  • Пакетная обработка (batching): Объединяю несколько запросов для более эффективного использования GPU.
  • Кеширование: Кеширую результаты для повторяющихся или похожих запросов.
  • Асинхронная обработка: Использую асинхронные веб-фреймворки (например, FastAPI) для неблокирующей обработки запросов.
  • Оптимизация пре-/постпроцессинга: Ускоряю токенизацию и другие этапы обработки данных.

4. Масштабирование инфраструктуры:

  • Горизонтальное масштабирование: Запускаю несколько реплик модели за балансировщиком нагрузки (например, в Kubernetes).
  • GPU-ускорение: Убеждаюсь, что инференс выполняется на GPU (использую model.to('cuda')).
  • Использование специализированных инференс-серверов: Внедряю NVIDIA Triton или TorchServe для эффективного обслуживания моделей.

5. Быстрые тактические меры (если нужно срочно):

  • Ограничиваю max_length токенизатора.
  • Ввожу rate limiting на уровне API-шлюза.
  • Реализую graceful degradation (например, возвращаю упрощенный ответ при высокой нагрузке).