32. Optimización de modelos de visión por computadora

32.1 Introducción

Hasta aquí aprendimos a construir modelos, entrenarlos, evaluarlos, reutilizar pesos preentrenados y hasta interpretar algunas de sus decisiones. Pero en un proyecto real aparece otra pregunta decisiva: ¿puede este modelo correr de forma útil en el entorno donde debe usarse?

Un modelo puede tener muy buena accuracy y, sin embargo, ser impracticable si consume demasiada memoria, si tarda demasiado en responder o si requiere hardware que no estará disponible en producción. Aquí entra el tema de la optimización de modelos.

En este tema veremos por qué optimizar es tan importante en visión por computadora, qué tipos de optimización existen y qué estrategias suelen usarse para mejorar velocidad, tamaño y eficiencia sin degradar demasiado el rendimiento.

32.2 ¿Qué significa optimizar un modelo?

Optimizar un modelo no significa necesariamente hacerlo “matemáticamente mejor” en sentido abstracto. En la práctica, suele significar hacerlo más adecuado para un contexto real de uso.

Eso puede implicar:

  • Reducir latencia.
  • Consumir menos memoria.
  • Disminuir el tamaño del archivo del modelo.
  • Mejorar throughput.
  • Facilitar despliegue en hardware restringido.

32.3 Precisión no es el único criterio

En investigación muchas veces se destaca sobre todo la métrica de desempeño. Pero en entornos reales también importan mucho:

  • Tiempo de respuesta.
  • Consumo energético.
  • Costo de hardware.
  • Estabilidad operacional.

Por eso un modelo ligeramente menos preciso puede ser, en la práctica, una mejor solución si logra operar de forma fluida y sostenible.

En un sistema real, el “mejor” modelo no siempre es el más preciso. Muchas veces es el que ofrece el mejor equilibrio entre calidad y viabilidad.

32.4 Latencia y throughput

Dos conceptos muy importantes en optimización son:

  • Latencia: cuánto tarda una inferencia individual.
  • Throughput: cuántas inferencias puede procesar el sistema en cierto tiempo.

Dependiendo de la aplicación, uno puede importar más que el otro. En tiempo real, la latencia suele ser crítica. En procesamiento por lotes, el throughput puede ser más importante.

32.5 FPS en visión por computadora

En aplicaciones de video, un indicador especialmente útil es FPS (frames per second). Este valor resume cuántos cuadros por segundo puede procesar el sistema.

Un detector que procesa 2 FPS puede ser suficiente para ciertos análisis offline, pero no para una cámara que debe reaccionar casi en tiempo real.

32.6 Tamaño del modelo

Otro aspecto importante es el tamaño del modelo en disco y en memoria. Modelos muy grandes pueden ser problemáticos para:

  • Dispositivos móviles.
  • Sistemas embebidos.
  • Aplicaciones donde la carga inicial debe ser rápida.
  • Entornos donde el ancho de banda de distribución es limitado.

32.7 Consumo de memoria

No solo importa cuánto pesa el archivo del modelo, sino también cuánta memoria requiere durante la inferencia. En visión por computadora esto puede crecer bastante debido a:

  • Tamaño de las imágenes.
  • Profundidad del modelo.
  • Mapas de activación intermedios.
  • Tamaño del batch.

Por eso, a veces reducir resolución de entrada o tamaño del batch tiene un gran impacto operativo.

32.8 Optimizar no es solo tocar el modelo

Un error común es pensar que la optimización depende únicamente de cambiar pesos o aplicar técnicas sofisticadas. En realidad, muchas mejoras prácticas vienen de decisiones de sistema, por ejemplo:

  • Elegir una arquitectura más adecuada.
  • Ajustar tamaño de entrada.
  • Usar el dispositivo correcto.
  • Preparar bien el pipeline de inferencia.

32.9 Elegir la arquitectura adecuada

La optimización empieza incluso antes del entrenamiento. Si sabemos que el modelo deberá correr en hardware modesto, quizá convenga usar MobileNet o una variante pequeña de YOLO en lugar de una red mucho más pesada.

Una buena elección arquitectónica inicial puede ahorrar muchísimo trabajo posterior.

32.10 Reducir resolución de entrada

En visión por computadora, el tamaño de la imagen de entrada influye mucho en el costo computacional. Reducir la resolución puede acelerar la inferencia y bajar consumo de memoria.

Claro que esto también puede afectar la calidad de la predicción, especialmente si los objetos son pequeños o si el detalle fino es importante.

32.11 Batch size en inferencia

Cuando trabajamos offline o en servidores, procesar varias imágenes juntas puede mejorar throughput. En cambio, para aplicaciones interactivas o en vivo, un batch demasiado grande puede empeorar la latencia percibida.

Por eso el tamaño del batch también es una decisión de optimización dependiente del contexto.

32.12 Cuantización

Una técnica muy conocida de optimización es la cuantización. La idea general es representar pesos y, a veces, activaciones con menor precisión numérica que la habitual en punto flotante.

Por ejemplo, pasar de 32 bits a 8 bits puede reducir tamaño y acelerar ciertas operaciones en hardware compatible.

32.13 Intuición de la cuantización

Muchos modelos no necesitan la máxima precisión numérica posible para funcionar razonablemente bien. Eso permite usar representaciones más compactas sin destruir completamente su capacidad predictiva.

El beneficio potencial es grande, aunque siempre hay que medir cuánto rendimiento se pierde.

32.14 Tipos de cuantización

De forma muy general, suelen distinguirse enfoques como:

  • Cuantización post-entrenamiento.
  • Entrenamiento consciente de cuantización.

La primera se aplica después de entrenar. La segunda intenta preparar al modelo durante el entrenamiento para tolerar mejor la representación reducida.

32.15 Pruning

Otra técnica importante es el pruning, que consiste en eliminar o anular conexiones, pesos o incluso canales poco relevantes.

La intuición es que muchos modelos terminan con cierta redundancia interna. Si identificamos partes que contribuyen poco, podemos reducir complejidad sin perder demasiado desempeño.

32.16 Compresión y sparsity

El pruning puede conducir a modelos más dispersos (sparse), pero eso no siempre implica automáticamente una aceleración real en cualquier hardware. La ganancia práctica depende mucho de cómo esté implementada la ejecución.

Por eso conviene distinguir entre una mejora teórica del número de parámetros y una mejora efectiva de latencia en producción.

32.17 Distillation

Una estrategia muy interesante es la knowledge distillation. En este enfoque, un modelo grande y potente actúa como “teacher” y ayuda a entrenar un modelo más pequeño “student”.

La idea es transferir parte del conocimiento del modelo grande para que el pequeño rinda mejor de lo que lograría entrenando solo de forma convencional.

32.18 Optimización del formato de ejecución

Además de cambiar el modelo, muchas veces conviene optimizar el formato en que se ejecuta. Herramientas como TorchScript, ONNX o motores especializados permiten mejorar portabilidad y, en algunos casos, rendimiento.

No entraremos aquí en todo el detalle técnico, pero sí es importante entender que la optimización también pasa por cómo empaquetamos y ejecutamos el modelo.

32.19 Uso correcto de model.eval() y torch.no_grad()

Incluso sin técnicas avanzadas, hay prácticas básicas que mejoran la inferencia:

  • Poner el modelo en modo evaluación.
  • Desactivar gradientes cuando no hacen falta.
model.eval()

with torch.no_grad():
    salida = model(x)

Esto reduce consumo de memoria y evita trabajo innecesario durante inferencia.

32.20 Perfilado y medición

No se puede optimizar bien lo que no se mide. Por eso conviene perfilar el sistema y registrar:

  • Tiempo por inferencia.
  • Uso de memoria.
  • FPS o throughput.
  • Tamaño del modelo.

La optimización seria se basa en datos concretos, no en intuiciones vagas.

32.21 Ejemplo simple de medición de tiempo

Un experimento básico de timing puede hacerse así:

import time
import torch

model.eval()
x = torch.randn(1, 3, 224, 224)

inicio = time.time()
with torch.no_grad():
    salida = model(x)
fin = time.time()

print("Tiempo de inferencia:", fin - inicio)

Este tipo de medición es muy simple, pero ya ayuda a comparar alternativas y detectar cuellos de botella evidentes.

32.22 CPU versus GPU

El dispositivo de ejecución influye enormemente en el rendimiento. Un modelo que funciona muy bien en GPU puede ser demasiado lento en CPU, y viceversa en algunos casos pequeños o livianos.

Además, no todo entorno productivo dispone de GPU. Por eso conviene optimizar pensando en el hardware real de despliegue, no solo en el de desarrollo.

32.23 Optimización para edge y móviles

Cuando el modelo debe correr en dispositivos embebidos o móviles, la optimización suele volverse todavía más importante. Allí pesan especialmente:

  • Tamaño del modelo.
  • Consumo de memoria.
  • Consumo energético.
  • Tiempo de inferencia.

En esos contextos, una solución menos precisa pero mucho más liviana puede ser claramente preferible.

32.24 Errores comunes al optimizar

Algunos errores frecuentes son:

  • Optimizar solo para accuracy e ignorar latencia.
  • Reducir resolución o cuantizar sin volver a medir desempeño real.
  • Suponer que menos parámetros implica automáticamente más velocidad.
  • Medir en hardware distinto al de producción.
  • Aplicar una técnica “de moda” sin analizar si realmente resuelve el cuello de botella principal.

32.25 Qué debes recordar de este tema

  • Optimizar un modelo significa hacerlo más viable para el contexto real de uso.
  • Latencia, throughput, memoria y tamaño importan tanto como la precisión.
  • Reducir resolución, elegir bien la arquitectura y medir correctamente ya son formas importantes de optimización.
  • Cuantización, pruning y distillation son estrategias clásicas para mejorar eficiencia.
  • La optimización debe guiarse por métricas reales y por el hardware de despliegue.

32.26 Conclusión

La optimización de modelos de visión por computadora es el puente entre un sistema que funciona en laboratorio y un sistema que realmente puede usarse en producción. No alcanza con que el modelo sea correcto o preciso: tiene que ser ejecutable con los recursos disponibles y responder en tiempos compatibles con la aplicación.

Comprender estos compromisos es fundamental para pasar de la teoría del Deep Learning a soluciones de ingeniería útiles. En muchos proyectos, la diferencia entre una demo y un sistema operativo real está justamente en esta etapa.

En el próximo tema estudiaremos el deployment de modelos de visión artificial, donde veremos cómo llevar estos modelos optimizados a entornos concretos de uso.