← Назад к вопросам

Какие знаешь способы ускорения инференса?

1.7 Middle🔥 231 комментариев
#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Способы ускорения инференса

Инфернес (прогнозирование) часто становится бутылочным горлышком в production-системах. Вот основные техники для его ускорения:

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

Квантизация Снижение точности весов модели с float32 до int8, float16 или других форматов. Это может дать 4x ускорение с минимальной потерей качества:

# TensorFlow
quantized_model = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
quantized_model.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = quantized_model.convert()

# PyTorch
quantized_model = torch.quantization.quantize_dynamic(
    model, {torch.nn.Linear}, dtype=torch.qint8
)

Pruning (Обрезание) Удаление неиспользуемых весов и нейронов, которые мало влияют на предсказания. Может уменьшить размер модели на 50-90%:

# PyTorch
from torch.nn.utils.prune import l1_unstructured
for name, module in model.named_modules():
    if isinstance(module, torch.nn.Linear):
        l1_unstructured(module, name="weight", amount=0.3)

Knowledge Distillation Обучение меньшей модели повторять поведение большой. Малая модель может быть в 10-100x быстрее:

# Упрощённый пример
student_loss = F.kl_div(
    F.log_softmax(student_output / T, dim=1),
    F.softmax(teacher_output / T, dim=1)
)

Архитектурные оптимизации

MobileNet/EfficientNet вместо ResNet

  • MobileNet: 3.5М параметров vs ResNet50: 25М
  • EfficientNet: лучший баланс speed/accuracy

Уменьшение входных размеров

  • Изображения: 224x224 → 128x128 (может дать 2-3x ускорение)
  • Текст: усечение максимальной длины последовательности

Ранняя классификация (Early Exit) Позволить модели выходить после нескольких слоёв, если уверена в ответе

Инфраструктурные решения

Batch Processing Обрабатывать примеры пакетами вместо одного за раз:

# Хорошо: batch_size=32
predictions = model.predict(np.array(batch_data))

# Плохо: по одному
for item in data:
    prediction = model.predict(item)

Кэширование результатов

  • Redis для часто запрашиваемых данных
  • Локальный кэш для идентичных входов

Model Serving Frameworks

  • TensorFlow Serving: оптимизация для TF моделей
  • ONNX Runtime: универсальное ускорение
  • TorchServe: оптимизация для PyTorch
  • Triton Inference Server: мультимодельный сервер

Аппаратные оптимизации

GPU/TPU вместо CPU

  • NVIDIA T4: ~100x ускорение vs CPU
  • TPU: ещё быстрее для TensorFlow

Edge Computing

  • TensorFlow Lite для мобильных устройств
  • ONNX для браузера (ONNX.js)

Мониторинг производительности

import time

start = time.perf_counter()
predictions = model.predict(data)
latency_ms = (time.perf_counter() - start) * 1000

print(f"Latency: {latency_ms:.2f}ms, Throughput: {len(data)/latency_ms*1000:.0f} samples/sec")

Практический подход

  1. Профилировать — найти реальное узкое место
  2. Выбрать метрику — latency vs throughput vs cost
  3. Начать с батчинга и кэширования — самое простое
  4. Затем квантизацию — хороший ROI
  5. В последнюю очередь — дорогие решения (новое железо)

Комбинация методов часто даёт лучший результат, чем один подход.