En Ultralytics, creamos modelos de visión artificial; básicamente, ¡enseñamos a los ordenadores a ver! Piensa en estos modelos como recetas matemáticas gigantes. Están compuestos por operaciones (que llamamos capas) y una enorme pila de números que llamamos pesos.
NuestrosYOLO Ultralytics YOLO procesan las imágenes tal y como son en realidad: ¡matrices de números! Cada píxel es en realidad solo valores de color, la cantidad de rojo, verde y azul (por lo tanto, RGB) para cada punto que compone la imagen. Llamamos a estas matrices de números «tensores» porque suena mucho mejor que «matrices multidimensionales», que a su vez suena mucho mejor que «números apilados sobre números apilados sobre números».
Cuando introduces una imagen en nuestro modelo, esta emprende un viaje épico a través de la red. Imagina tu tensor por capas y capas, transformándose, convolucionándose y manipulándose matemáticamente de la forma más hermosa posible. Piensa en ello como una fiesta de baile en la que los números se mezclan y se entremezclan, extrayendo la esencia de lo que hace que un gato sea un gato o un coche sea un coche. A este proceso lo llamamos extracción de características.
¿Qué sale por el otro extremo? ¡Más números! Números significativos. En las tareas de detección, te dicen exactamente dónde se encuentran los objetos en tu imagen y qué son probablemente. «¡Oye, hay un 95 % de posibilidades de que eso sea un perro en las coordenadas (x, y)!». A este proceso mágico lo llamamos inferencia.
Ahora bien, antes de que nuestros modelos puedan hacer su magia, necesitan ir a la escuela; necesitan recibir formación. La parte de la formación es donde las cosas se ponen intensas.
Durante el entrenamiento, cada vez que presentamos una imagen a la red, no solo obtenemos una respuesta. Hacemos dos cosas muy importantes. En primer lugar, calculamos el error de la red (lo llamamos pérdida, básicamente la distancia desde el centro). En segundo lugar, y esto es lo importante, actualizamos cada uno de los números (o pesos) de la red en función de esa pérdida. Piensa en ello como si estuvieras ajustando miles de pequeños botones a la vez, donde cada ajuste se calcula para que la red sea más precisa cada vez. Básicamente, estamos entrenando la red mediante correcciones: cada error le enseña lo que NO debe hacer, y ajustamos todos esos pesos para que, cuando vuelva a ver una imagen similar, se acerque más a la respuesta correcta. En esencia, la red aprende recibiendo empujones en la dirección correcta, error tras error, hasta que empieza a acertar en las predicciones.
¿De cuántos números estamos hablando? Bueno, nuestro pequeño y adorable YOLO11n tiene unos pocos millones de parámetros. ¿Pero YOLO11x? ¡Ese chico malo tiene más de 50 millones de parámetros! Más parámetros significan más detalles que se pueden codificar, como la diferencia entre dibujar con crayones y tener una paleta de artista completa.
Durante la inferencia, este recuento de parámetros se vuelve crucial. Ejecutar una red de 3 millones de parámetros es como correr alrededor de la manzana. ¿Ejecutar una red de 50 millones de parámetros? Eso es más como correr una maratón mientras se hacen malabares con antorchas encendidas.
Entonces, ¿qué es exactamente la computación? ¿Cómo se lleva a cabo realmente todo este procesamiento de números? ¿Cómo podemos acelerarlo? ¿Y qué significa «optimizar la computación»?
Cómo calculan realmente los chips
El cálculo se realiza con chips. Estos pequeños cuadrados de silicio son básicamente los castillos de arena más organizados del universo. Cada operación que realiza tu ordenador, cada suma, cada comparación, cada «si esto, entonces aquello», está físicamente grabada en el silicio. Hay circuitos físicos reales en áreas específicas del chip dedicados a sumar números y otros para operaciones lógicas. Es como tener una pequeña ciudad donde diferentes barrios se especializan en diferentes tipos de matemáticas.
Probablemente esto suene extraño, incluso si eres un informático. Eso se debe a que hemos pasado los últimos 40 años construyendo capa tras capa de abstracción, como una lasaña tecnológica que se ha vuelto tan alta que ya ni siquiera podemos ver la placa inferior. Hemos simplificado tanto las cosas que la mayoría de los programadores de hoy en día no tienen ni idea de cómo se produce realmente el cálculo en el silicio. No es culpa suya, ¡sino del diseño!
Vamos a desentrañar estas capas. Tomemos este Python sencillísimo:
x = 1
if x == 1:
y = x + 1
Estamos creando una variable x, estableciéndola en 1, y si x es igual a 1 (spoiler: lo es), creamos y con el valor de x más 1. Tres líneas. Fácil.
Pero aquí es donde se pone interesante. Entre esas tres líneas inocentes y los electrones reales que se mueven a través del silicio, hay AL MENOS cuatro capas masivas de traducción (en realidad hay más, pero nuestra gestora de contenidos digitales dice que mi recuento de palabras ya le está provocando ansiedad). Permítanme guiarlos a través de este alucinante viaje:
Capa 1: Python Código byte Primero, Python tu código y lo compila en algo llamado código byte, un lenguaje intermedio que es más fácil de digerir para las computadoras, pero que te haría sangrar los ojos si intentaras leerlo.
Capa 2: Código de bytes → Código máquina El Python (como CPython) toma ese código de bytes y lo traduce a código máquina, las instrucciones reales que entiende tu procesador. Aquí es donde tu elegante «if x == 1» se convierte en algo como «CARGAR registro, COMPARAR registro, SALTAR si se establece el indicador cero».
Capa 3: Código máquina → Microcódigo ¡Giro inesperado! Los procesadores modernos ni siquiera ejecutan el código máquina directamente. Lo descomponen aún más en microcódigo, operaciones aún más pequeñas que pueden manejar los componentes internos del chip. Una sola instrucción «ADD» puede convertirse en múltiples microoperaciones.
Capa 4: Microcódigo → Electrónica física Finalmente, llegamos al silicio. Esas microoperaciones activan señales eléctricas reales que fluyen a través de los transistores. Miles de millones de diminutos interruptores se activan y desactivan, los electrones bailan a través de vías cuidadosamente diseñadas y, de alguna manera, mágicamente, 1 + 1 se convierte en 2.
Cada capa existe para ocultar la increíble complejidad de la capa que hay debajo. Es como esas muñecas rusas, excepto que cada muñeca habla un idioma completamente diferente, y la muñeca más pequeña está literalmente hecha de rayos atrapados en arena.
¿La ironía? Esas tres líneas de Python activan MILLONES de interruptores de transistores. Pero gracias a estas abstracciones, no es necesario pensar en nada de eso. Simplemente escribes «y = x + 1» y confías en que, en algún lugar, en lo más profundo del silicio, ocurre la magia.
La arquitectura
Cada operación se implementa físicamente en el silicio, y el lugar donde se lleva a cabo en el chip depende totalmente de la topología del chip. Es como la planificación urbana, pero para electrones. El sumador está aquí, el multiplicador está allí, y todos ellos necesitan comunicarse entre sí de manera eficiente.
Tenemos cientos de chips diferentes en el mercado, cada uno diseñado para fines distintos. ¿Qué los diferencia? La topología, es decir, cómo se posicionan y se implementan las operaciones en el dominio físico. Esto es lo que llamamos arquitectura, y vaya si tenemos muchas:
- x86 (Intel AMD): el precursor de la informática de escritorio, complejo pero potente.
- ARM: impulsa tu teléfono y, cada vez más, tu ordenador portátil, diseñado para ofrecer eficiencia.
- RISC-V: el rebelde del código abierto que está ganando terreno en todas partes.
- PowerPC: la bestia de IBM, que sigue funcionando en consolas de videojuegos y servidores.
- MIPS: el favorito de los académicos, sencillo y elegante.
- SPARC: la contribución de Sun Microsystems (ahora Oracle) a la informática de alto rendimiento.
- GPU ( CUDA NVIDIA, RDNA de AMD): monstruos del procesamiento paralelo.
Cada arquitectura no solo organiza sus transistores de forma diferente, sino que también habla un idioma distinto. Las abstracciones que utilizamos para enviar instrucciones a estas máquinas son completamente diferentes. Es como tener que escribir indicaciones de viaje para alguien, pero dependiendo de su coche, es posible que tengas que escribir en francés, mandarín o danza interpretativa.
El latido del corazón de Silicon
El combustible de nuestros chips son los electrones, la electricidad que fluye hacia el chip y proporciona la energía necesaria para el cálculo. Pero la energía por sí sola no es suficiente. Para que un chip funcione realmente, para mover datos a través de su intrincada topología, todo depende de un componente crítico: el reloj. Este es el que hace que los electrones fluyan por rutas específicas en momentos específicos. Sin él, solo tendríamos silicio alimentado que no haría nada.
Imagina intentar coordinar una actuación a gran escala en la que miles de millones de componentes deben moverse en perfecta sincronía. Sin un ritmo, sería un caos. Eso es exactamente lo que hace el reloj para tu procesador. Es un cristal que vibra a una velocidad increíblemente constante, enviando impulsos eléctricos miles de millones de veces por segundo.
Cuando se oye «procesador de 3,5 GHz», ese GHz (gigahercio) es la velocidad del reloj, 3500 millones de pulsaciones por segundo. Cada pulsación se denomina ciclo de reloj y es la unidad de tiempo fundamental en informática.
No ocurre NADA entre los ciclos del reloj. Todo el ordenador se congela, esperando el siguiente latido. Es como el juego más extremo del universo de luz roja, luz verde. En cada «luz verde» (impulso del reloj):
- Los datos se mueven entre componentes.
- Ejecución de cálculos
- Se toman decisiones lógicas.
- La memoria se lee o se escribe.
Algunas operaciones requieren un ciclo (una simple suma), mientras que otras requieren muchos ciclos (una división o la recuperación de datos de la RAM). Se trata de una coreografía precisa, con miles de millones de componentes realizando sus operaciones específicas, todos sincronizados con este ritmo implacable.
Puedes overclockear tu procesador haciendo que el cristal vibre más rápido; todo ocurre más rápido, pero también genera más calor, volviéndose menos estable. Si lo llevas demasiado lejos, tu ordenador se colgará porque los electrones, literalmente, no pueden seguir el ritmo.
En el pasado, estas operaciones se realizaban con máquinas del tamaño de una habitación. Pero los componentes que realizan todos estos cálculos son muy sencillos: solo son interruptores. Interruptores de encendido y apagado.
Conecta suficientes interruptores de este tipo siguiendo el patrón adecuado y obtendrás un sistema informático. Toda la revolución digital se reduce a una sofisticada disposición de interruptores.
Esta simplicidad significa que si tienes interruptores, cualquier tipo de interruptores, puedes construir un ordenador. Hay gente que ha construido ordenadores funcionales con tuberías y válvulas de agua, fichas de dominó, bloques de LEGO, canicas e incluso con redstone en Minecraft.
Los principios no han cambiado desde la década de 1940. Simplemente nos hemos vuelto increíblemente buenos en fabricar interruptores extremadamente pequeños. Tu teléfono tiene más potencia computacional que todas las computadoras que llevaron al hombre a la luna, y cabe en tu bolsillo porque descubrimos cómo fabricar interruptores a escala atómica.
Cuando ejecutamos redes neuronales con millones de parámetros, estamos accionando estos diminutos interruptores miles de millones de veces por segundo, todos perfectamente sincronizados con ese latido cristalino. Cada actualización de peso, cada multiplicación matricial, cada función de activación, todas marchan al ritmo del reloj.
¡No es de extrañar que los modelos de entrenamiento hagan que tu ordenador suene como si estuviera intentando despegar!
Haciendo que las redes neuronales hagan BRRRRR
Muy bien, tenemos estos chips con miles de millones de interruptores que bailan al ritmo de un cristal, y queremos ejecutar redes neuronales con millones de parámetros en ellos. Debería ser fácil, ¿verdad? ¡Solo hay que introducir los números en el chip y dejarlo funcionar!
Ejecutar redes neuronales rápidamente es como intentar cocinar un menú de cinco platos en una cocina en la que la nevera está a tres manzanas, solo tienes una sartén y cada ingrediente pesa 500 libras. Las matemáticas en sí mismas no son el mayor problema, sino todo lo demás.
El desajuste arquitectónico
La mayoría de los chips se diseñaron para ejecutar Microsoft , no redes neuronales. Tu CPU construyó pensando que pasaría su vida ejecutando sentencias if, bucles y, ocasionalmente, calculando tus impuestos (el único cálculo que incluso a los superordenadores les resulta emocionalmente agotador). Está optimizada para operaciones secuenciales: haz esto, luego aquello, luego lo otro.
Pero las redes neuronales son completamente diferentes. Quieren hacer TODO A LA VEZ. Durante el entrenamiento, se actualizan millones de pesos en función de lo erróneas que fueron las predicciones. Durante la inferencia (el uso real del modelo entrenado), se procesan datos a través de millones de cálculos simultáneamente. Imagina que necesitas multiplicar un millón de números por otro millón de números. Tu CPU, bendita sea, quiere hacerlo de uno en uno, como un contable muy rápido pero muy metódico.
Por eso las GPU se convirtieron en la columna vertebral de la computación de IA. Las GPU se diseñaron para los videojuegos, donde es necesario calcular el color de millones de píxeles simultáneamente. Resulta que calcular los colores de los píxeles y realizar cálculos matemáticos en redes neuronales es sorprendentemente similar: ambos implican realizar la misma operación en cantidades masivas de datos en paralelo.
Pero ni siquiera las GPU son perfectas para las redes neuronales. Por eso, las empresas están creando chips especializados en IA (TPU, NPU y cualquier otra sigla que termine en «PU»). Estos chips están diseñados desde cero con un único objetivo: acelerar las redes neuronales. Es como contratar a un chef que solo sabe cocinar un plato, pero lo cocina a una velocidad sobrehumana. Mientras que tu CPU por realizar operaciones matriciales de forma secuencial y tu GPU las GPU bastante bien en paralelo, estos chips especializados se comen las matrices para desayunar, comer y cenar.
El muro de la memoria (o: por qué mover bits es más difícil que las matemáticas)
En los cálculos modernos de redes neuronales, dedicamos más tiempo y energía a MOVER datos que a CALCULAR con ellos.
Piensa en el chip de tu ordenador como un brillante matemático que trabaja a la velocidad del rayo, pero todos sus libros de referencia están almacenados en diferentes edificios repartidos por toda la ciudad. Puede resolver cualquier ecuación al instante, pero primero necesita obtener los números, y ese viaje le lleva una eternidad.
Tu chip puede multiplicar dos números en un ciclo de reloj (recuerda, eso es uno de esos miles de millones de latidos por segundo). ¡Rápido como un rayo! Pero, ¿cómo se transfieren esos números de la memoria al chip? Eso podría llevar CIENTOS de ciclos. Es como si tu matemático pudiera resolver un problema en un segundo, pero necesitara cinco minutos para ir a la biblioteca y volver.
La razón es la distancia (y el espacio). La electricidad se mueve rápido, pero no infinitamente rápido. Cuanto más lejos tienen que viajar los datos en el chip, más tiempo tardan. Los diseñadores de ordenadores resolvieron esto creando una jerarquía de memoria, como tener múltiples ubicaciones de almacenamiento a diferentes distancias:
- Registros (integrados directamente en las unidades de cálculo): el escritorio de tu matemático. ¡Acceso instantáneo! Pero es diminuto, solo puedes guardar unos 32 números aquí. Es como tener notas adhesivas justo delante de ti.
- Caché L1 (a micrómetros de distancia): la estantería de la oficina. Se necesitan entre 3 y 4 ciclos para coger algo. Aquí caben unos cuantos miles de números.
- Caché L2 (a milímetros de distancia): el archivador al final del pasillo. Tarda entre 10 y 15 ciclos y puede almacenar varios millones de números.
- Caché L3 (en todo el chip): El almacén de la planta baja. Tarda entre 30 y 50 ciclos y almacena decenas de millones de números.
- RAM (en un chip completamente diferente): El almacén al otro lado de la ciudad. Tarda entre 100 y 300 ciclos. Aquí es donde residen tus miles de millones de números.
- SSD/Disco duro (conectado por cables): Otro mundo completamente diferente. Tarda millones de ciclos. Gran capacidad de almacenamiento, velocidad glacial.
Las estructuras exactas varían, el chip de tu teléfono puede omitir la caché L3, mientras que CPU de un servidor CPU tener cantidades masivas de ella. Sin embargo, el principio sigue siendo el mismo: la memoria más cercana es más rápida, pero más pequeña.
Aquí es donde las redes neuronales empiezan a tener problemas. Imagina que tuYOLO Ultralytics tiene 50 millones de parámetros (por cierto,ChatGPT miles de millones). Son 50 millones de números que deben viajar desde la memoria a las unidades de cálculo y viceversa. Aunque cada número ocupe solo 4 bytes, son 200 megabytes de datos que deben moverse por tu sistema.
El chip puede procesar cada número en un solo ciclo, pero si se necesitan 100 ciclos para recuperar ese número de la RAM, se está dedicando el 99 % del tiempo a esperar la entrega. Es como tener un coche de Fórmula 1 en un atasco. Toda esa potencia computacional, ahí parada, esperando a que lleguen los datos.
Aquí está la idea clave: este es EL cuello de botella de la informática moderna. Se llama el cuello de botella de von Neumann. Hacer que los chips sean más rápidos en matemáticas es relativamente fácil. Hacer que la memoria sea más rápida está llegando a sus límites físicos. Por eso casi TODA la optimización del rendimiento en IA se produce a nivel de la memoria. Cuando los ingenieros aceleran las redes neuronales, rara vez hacen que las matemáticas sean más rápidas; buscan formas inteligentes de mover menos datos, almacenarlos mejor en la caché o acceder a ellos de forma más inteligente.
Los chips de IA modernos no solo se centran en la velocidad de cálculo, sino que también se obsesionan con el ancho de banda de la memoria y las estrategias de movimiento de datos. Prebajan datos, reutilizan valores que ya están en la caché y organizan los cálculos para minimizar los viajes a la memoria. Los ganadores en la carrera por el hardware de IA no son los que tienen las calculadoras más rápidas, sino los que han descubierto cómo mantener esas calculadoras alimentadas con datos. Todo el juego consiste en optimizar los patrones de acceso a la memoria.
Cada vez que se mueve un poco de datos, se consume energía. No mucha, estamos hablando de picojulios, pero cuando se mueven terabytes por segundo, se acumula RÁPIDAMENTE. De hecho, mover datos 1 mm a través de un chip consume más energía que realizar el cálculo en sí.
Por eso tu ordenador portátil suena como un motor a reacción cuando entrenas redes neuronales. No son las matemáticas las que generan calor, sino el movimiento de datos. Cada actualización de parámetros, cada cálculo de gradiente, cada paso hacia adelante está, literalmente, calentando tu habitación.
Los aceleradores de IA modernos son básicamente ejercicios de termodinámica. ¿Cuánta computación podemos meter antes de que el chip se derrita? ¿A qué velocidad podemos disipar el calor? Es como el overclocking, pero el reloj siempre está a 11 y solo intentamos no provocar un incendio.
¿La solución? Diseño consciente de la arquitectura.
Las redes neuronales más rápidas no son necesariamente las más inteligentes, sino aquellas diseñadas teniendo en cuenta los chips. Estas:
- Mantenga los datos locales tanto como sea posible.
- Reutiliza los cálculos de forma obsesiva.
- Alinearse perfectamente con las capacidades del hardware
- Minimizar el movimiento de memoria a toda costa.
Es como la diferencia entre una receta que dice «utiliza ingredientes de tu tienda de comestibles local» y otra que te obliga a importar especias del Tíbet, queso de Francia y agua de la Antártida. Ambas pueden estar buenas, pero una es sin duda más práctica.
Y por eso hacer que las redes neuronales funcionen rápido es todo un arte. No basta con tener buenos conocimientos matemáticos; hay que entender el hardware, respetar la jerarquía de la memoria y bailar a la perfección con la arquitectura.
Bienvenido al mundo donde la informática se une a la física, la ingeniería y la magia pura. Donde mover un número cuesta más que calcular con él. Donde lo paralelo es rápido, pero la sincronización es mortal. Donde tu mayor enemigo no es la complejidad, sino la distancia.
Cómo hacemos que YOLO
Cuando entrenas un YOLO , obtienes una red neuronal que funciona a la perfección en tu configuración de entrenamiento. Pero aquí está el problema: tu GPU para juegos, tu iPhone y ese pequeño chip de una cámara de seguridad hablan idiomas completamente diferentes. Tienen diferentes puntos fuertes, diferentes puntos débiles y ideas muy diferentes sobre cómo procesar los datos.
Piénsalo de esta manera: una GPU miles de núcleos que pueden funcionar simultáneamente, ya que está diseñada para el procesamiento paralelo. Por su parte, un chip móvil puede tener circuitos especiales diseñados específicamente para operaciones de IA, pero solo puede manejar ciertos tipos de cálculos matemáticos. ¿Y ese dispositivo periférico de la cámara de tu timbre? Intenta ejecutar IA con un consumo energético inferior al de una bombilla LED.
En Ultralytics, admitimos más de una docena de formatos de exportación diferentes, ya que cada uno está optimizado para un hardware distinto. No se trata de tener demasiadas opciones, sino de disponer de la opción adecuada para SUS necesidades específicas.
Operaciones de fusión: hacer más con menos
En el YOLO original, muchas operaciones se realizan en secuencia. Por ejemplo, podríamos hacer una convolución, luego normalizar los resultados y, a continuación, aplicar una función de activación. Son tres pasos independientes, cada uno de los cuales requiere sus propias lecturas y escrituras de memoria.
Pero aquí está lo ingenioso: podemos combinar estas operaciones en un solo paso. Cuando exportamos YOLO su implementación, fusionamos estas operaciones. En lugar de:
- Calcular convolución → Guardar en memoria
- Cargar desde la memoria → Normalizar → Guardar en la memoria
- Cargar desde la memoria → Aplicar activación → Guardar en la memoria
Nosotros hacemos:
- Calcular convolución + normalización + activación → Guardar en memoria
Para un YOLO típico que procesa una imagen de 640×640, este sencillo truco elimina gigabytes de transferencias de memoria innecesarias. En un teléfono móvil, esa es la diferencia entre una detección fluida en tiempo real y un retraso frustrante.
Usando números más pequeños: la magia de la cuantificación
YOLO necesita cifras extremadamente precisas para detect con exactitud. Durante el entrenamiento, utilizamos 32 bits para representar cada peso, lo que equivale a utilizar una calculadora científica para medir los ingredientes de un sándwich. ¿Para su implementación real? 8 bits funcionan perfectamente.
Esto se denomina cuantificación y es una de nuestras técnicas de optimización más potentes. Al utilizar números más pequeños:
- El modelo se reduce en un 75 % (de 200 MB a 50 MB para Ultrakytics YOLO11x).
- Funciona entre 2 y 4 veces más rápido en la mayoría de los dispositivos.
- Consume mucha menos energía (la batería de tu teléfono te lo agradecerá).
No todas las capas de YOLO igualmente sensibles a esta reducción. ¿Las primeras capas que detect bordes y formas detect ? Son robustas: podemos usar números de 8 bits sin ningún problema. Las capas de detección finales que determinan «¿es un gato o un perro?» necesitan un poco más de precisión. Por lo tanto, ajustamos la precisión capa por capa, utilizando solo los bits necesarios para mantener la precisión y maximizar la velocidad.
Hemos descubierto que, con una cuantificación cuidadosa, Ultralytics YOLO el 99,5 % de su precisión original y funciona tres veces más rápido en los teléfonos. Esa es la diferencia entre un modelo de investigación y algo que realmente se puede utilizar en el mundo real.
Elegir el mejor algoritmo
Hay docenas de formas diferentes de realizar la misma operación matemática. Una convolución simple (la operación central en YOLO) se puede calcular utilizando algoritmos completamente diferentes, y la mejor opción depende de su hardware específico y del tamaño de la entrada.
Cuando exportamos YOLO, nuestro marco de optimización prueba diferentes algoritmos y selecciona el más rápido para cada caso específico. Es como tener varias rutas para llegar al mismo destino y elegir la más adecuada en función de las condiciones del tráfico en ese momento. En una GPU, podríamos utilizar un algoritmo que procese muchos píxeles simultáneamente. En una CPU, podríamos utilizar uno optimizado para el procesamiento secuencial. Las matemáticas son las mismas, pero la estrategia de ejecución es completamente diferente.
Memoria: el cuello de botella oculto
¿Recuerdas que hablamos de que la memoria es el verdadero cuello de botella de la informática moderna? Esto es especialmente cierto en el caso de YOLO. El modelo puede tener 50 millones de parámetros y, durante la inferencia, genera gigabytes de resultados intermedios. Trasladar todos estos datos suele ser más lento que el propio cálculo.
Utilizamos varios trucos para minimizar el movimiento de la memoria:
Programación inteligente: organizamos las operaciones para que los datos se utilicen inmediatamente mientras aún se encuentran en la memoria caché rápida. En el caso de la red piramidal de características YOLO, esto reduce el tráfico de memoria en un 40 %.
División en mosaicos: en lugar de procesar una imagen completa de una sola vez, la dividimos en mosaicos más pequeños que caben en la caché. Esto significa que el procesador puede trabajar con una memoria local rápida en lugar de tener que recurrir constantemente a la memoria principal, que es más lenta.
Reutilización del búfer: en lugar de crear constantemente nueva memoria para los resultados intermedios, reutilizamos los mismos búferes de memoria. Es increíblemente eficiente: toda la columna vertebral YOLO puede funcionar con solo un puñado de búferes reutilizables.
Poda: menos es más
He aquí un dato sorprendente: YOLO suelen estar sobredimensionados. Podemos eliminar el 30 % de los canales en muchas capas sin que ello afecte prácticamente a la precisión. Esto no solo reduce el tamaño del modelo, sino que lo hace más rápido, ya que hay menos cálculos que realizar.
El proceso es elegante: analizamos qué partes de la red contribuyen menos a los resultados finales de detección, las eliminamos y luego ajustamos el modelo para compensar. Un modelo YOLO11m podado puede ser un 30 % más rápido y mantener el 99 % de su precisión original. En dispositivos que funcionan con batería, esta ganancia en eficiencia puede significar horas adicionales de funcionamiento.
Aceleración por hardware: aprovechando las ventajas de cada chip
Los diferentes procesadores son buenos en diferentes cosas, y las diferencias de rendimiento son asombrosas. El mismo modelo YOLO11n tarda:
- 45 milisegundos por fotograma en unaCPU Intel moderna.
- 4 milisegundos en una GPU NVIDIA
- 22 milisegundos en un procesador de teléfono de gama alta
- 15 milisegundos en una TPU Google Edge.
No se trata solo de diferencias de velocidad debidas a las frecuencias de reloj, sino que reflejan diferencias arquitectónicas fundamentales. Las GPU tienen miles de núcleos que funcionan en paralelo, lo que las hace perfectas para las convoluciones YOLO. Las NPU móviles tienen circuitos especializados diseñados específicamente para redes neuronales. Las CPU son todoterreno, flexibles pero no especializadas.
La clave para la optimización es adaptar las operaciones YOLO a lo que cada chip hace mejor. A una GPU realizar la misma operación en muchos datos simultáneamente. Una NPU móvil puede que solo admita determinadas operaciones, pero las ejecuta con una eficiencia increíble. Una TPU periférica TPU funciona con números enteros de 8 bits, pero alcanza una velocidad notable dentro de esa limitación.
La magia de la compilación
Cuando exportas un YOLO , ocurre algo extraordinario entre bastidores. No solo convertimos el formato del archivo, sino que compilamos el modelo específicamente para tu hardware de destino. Es como la diferencia entre Google y un hablante nativo. El proceso de compilación:
- Analiza tu modelo para comprender su estructura y requisitos.
- Tiene en cuenta las capacidades de tu hardware: en qué destaca y con qué tiene dificultades.
- Genera código optimizado que habla el lenguaje nativo de tu hardware.
El compilador puede reorganizar las operaciones para aprovechar mejor la caché del procesador, seleccionar instrucciones especializadas que admita el chip o incluso utilizar el aprendizaje automático para encontrar la mejor estrategia de optimización. Sí, estamos utilizando la IA para optimizar la IA: ¡el futuro ya está aquí!
Este paso de compilación puede multiplicar por diez el rendimiento. El mismo YOLO puede funcionar lentamente con código genérico, pero volar con instrucciones debidamente optimizadas.
Implementación en el mundo real
Hablemos de lo que ocurre cuando YOLO al mundo real, concretamente al desafiante mundo de los dispositivos periféricos. Imaginemos una cámara de seguridad que necesita ejecutar YOLO , para la detección de objetos. Se enfrenta a duras limitaciones:
- Memoria: Quizás solo entre 512 MB y 2 GB de RAM en total.
- Potencia: a menudo solo entre 2 y 5 vatios (menos que un cargador de teléfono).
- Refrigeración: Sin ventiladores, solo disipación pasiva del calor.
- Fiabilidad: Debe funcionar de forma continua sin fallos.
Esto es lo que se consigue con la optimización en la práctica. Una cámara de seguridad que ejecuta YOLO11s:
- Modelo original: 15 vatios, se calienta a 85 °C, alcanza 20 FPS.
- Optimizado con cuantificación y poda: 3 vatios, cómodos 45 °C, alcanza 25 FPS.
¡Hemos reducido el consumo energético en un 80 % y, al mismo tiempo, hemos mejorado el rendimiento! Esa es la diferencia entre un dispositivo que se sobrecalienta y agota las baterías y otro que funciona de forma fiable durante años.
La clave está en elegir las compensaciones adecuadas. En los dispositivos periféricos, a menudo:
- Utiliza cuantificación INT8 (menos precisión, mucho menos consumo).
- Procesar menos fotogramas cuando la actividad es baja.
- Distribuir el trabajo entre diferentes procesadores para gestionar el calor.
- Mantenga los modelos lo suficientemente pequeños como para que quepan por completo en la memoria rápida.
El proceso de optimización
En Ultralytics, seguimos un enfoque sistemático para la optimización. En primer lugar, perfilamos el modelo para comprender dónde se invierte realmente el tiempo. A menudo, los cuellos de botella no se encuentran donde uno esperaría. Quizás el 80 % del tiempo se invierte en unas pocas capas, o las transferencias de memoria dominan el tiempo de cálculo.
A continuación, aplicamos optimizaciones de forma iterativa:
- Empiece por los mayores cuellos de botella.
- Aplica una optimización cada vez.
- Mida tanto la mejora en la velocidad como el impacto en la precisión.
- Mantenga las optimizaciones que proporcionan buenas compensaciones.
- Repetir hasta alcanzar nuestros objetivos.
Por ejemplo, con la implementación de YOLO11m en un teléfono:
- Línea de base: 200 ms por fotograma, modelo de 200 MB.
- Después de la cuantificación: 80 ms por fotograma, modelo de 50 MB.
- Después de la poda: 60 ms por fotograma, modelo de 35 MB.
- Después de la operación de fusión: 45 ms por fotograma, modelo de 35 MB.
Cada paso mejora el rendimiento y mantiene más del 99 % de la precisión original. ¿El resultado? Detección de objetos en tiempo real en un dispositivo que cabe en tu bolsillo.
El futuro: computación heterogénea
Los dispositivos modernos son cada vez más inteligentes a la hora de utilizar varios procesadores a la vez. Tu teléfono no tiene un solo procesador, sino varios, cada uno especializado en diferentes tareas:
- El sensor de la cámara tiene un ISP (procesador de señal de imagen) para el preprocesamiento.
- La NPU (unidad de procesamiento neuronal) ejecuta YOLO .
- La CPU la lógica compleja y la coordinación.
- La GPU los resultados en pantalla.
El futuro de YOLO consiste en dividir de forma inteligente el modelo entre estos procesadores. Quizás la NPU se encargue de las convoluciones principales, la CPU la lógica de detección final y la GPU los resultados. Cada procesador hace lo que mejor sabe hacer, creando un canal más eficiente que el que podría lograr cualquier procesador por sí solo.
Estamos desarrollando algoritmos de partición inteligentes que determinan automáticamente la mejor manera de dividir YOLO los procesadores disponibles, teniendo en cuenta no solo sus capacidades, sino también el coste de mover datos entre ellos.
En resumen
Optimizar YOLO no consiste solo en convertir formatos de archivo, sino en transformar la IA de vanguardia en algo que realmente funcione en el mundo real. Mediante técnicas como la cuantificación (uso de números más pequeños), la poda (eliminación de partes innecesarias), la fusión de operaciones (combinación de pasos) y la gestión inteligente de la memoria, logramos mejoras de rendimiento de entre 10 y 100 veces, al tiempo que mantenemos la precisión.
¿Lo más sorprendente? No existe una optimización «óptima» universal. Un servidor en la nube con potencia ilimitada necesita optimizaciones diferentes a las de un dron alimentado por batería. Un teléfono con un chip de IA dedicado necesita un tratamiento diferente al de una Raspberry Pi. Por eso Ultralytics tantas opciones de exportación: cada una está optimizada para diferentes escenarios.
Todas las optimizaciones que hemos comentado tienen un único objetivo: hacer que la visión artificial sea accesible en cualquier lugar. Tanto si estás desarrollando un timbre inteligente, una aplicación para drones o un servicio en la nube a gran escala, te proporcionamos las herramientas necesarias para que YOLO dentro de tus limitaciones.
Cuando exportas un YOLO con Ultralytics, no solo estás guardando un archivo. Estás aprovechando años de investigación para hacer que las redes neuronales sean prácticas. Estás transformando un modelo de IA de última generación en algo que puede ejecutarse en hardware real, con restricciones reales, resolviendo problemas reales.
Eso es lo que hacemos en Ultralytics. Acortamos la distancia entre la investigación en IA y su implementación práctica. Hacemos que la visión artificial funcione en todas partes, porque el futuro de la IA no consiste solo en tener los mejores modelos, sino en hacer que esos modelos sean útiles en el mundo real.