Какие знаешь способы ускорения инференса?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Способы ускорения инференса
Инфернес (прогнозирование) часто становится бутылочным горлышком в 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")
Практический подход
- Профилировать — найти реальное узкое место
- Выбрать метрику — latency vs throughput vs cost
- Начать с батчинга и кэширования — самое простое
- Затем квантизацию — хороший ROI
- В последнюю очередь — дорогие решения (новое железо)
Комбинация методов часто даёт лучший результат, чем один подход.