Edge Computing para IA
Ejecuta modelos de inteligencia artificial en el borde: NPUs (Hailo), GPUs (Jetson), FPGAs (Xilinx Kria) y DPUs. Técnicas de optimización: pruning, cuantización, knowledge distillation. Frameworks: TensorRT, TFLite, VitisAI, HLS4ML, OpenVINO. Aplicaciones reales, proyectos de referencia y el futuro del Edge AI.
¿Qué es Edge Computing?
Edge Computing es el paradigma de ejecutar modelos de inteligencia artificial directamente en dispositivos cercanos a la fuente de datos — en el "borde" (edge) de la red — en lugar de enviar los datos a un servidor remoto en la nube. Esto incluye dispositivos embebidos, móviles, cámaras inteligentes, drones, robots, wearables, y aceleradores dedicados.
En los últimos años, el auge del deep learning ha producido modelos cada vez más potentes (como los vistos en la sección de Transformers o LLMs), pero también más pesados. Esto ha creado una tensión fundamental: la inteligencia se genera en la nube, pero los datos y las acciones ocurren en el mundo real. Edge AI resuelve esta tensión llevando la inferencia al dispositivo, más cerca de donde se origina la información y donde se necesita la respuesta.
Es importante distinguir entre entrenamiento e inferencia. El entrenamiento de modelos de deep learning (como se explica en Entrenamiento de redes neuronales) requiere grandes cantidades de cómputo y se realiza típicamente en la nube, con GPUs como A100 o H100. La inferencia, en cambio, consiste en aplicar un modelo ya entrenado a nuevos datos, y es esta operación la que puede ejecutarse eficientemente en el edge con hardware especializado y modelos optimizados.
☁️ → 📱 El espectro Cloud-Edge
No es binario. Existe un continuo entre la nube y el dispositivo, y dependiendo de la aplicación, la inferencia puede ejecutarse en distintos puntos de ese espectro. Cada nivel ofrece un equilibrio diferente entre potencia de cálculo, latencia, privacidad y coste. A continuación se presentan los cuatro niveles más habituales:
Latencia: 50–200 ms (round-trip)
Uso: Entrenamiento, inferencia a gran escala, modelos grandes (LLMs)
Latencia: 5–20 ms
Uso: Multi-cámara en fábricas, hospital local, procesado en planta
Latencia: 1–10 ms
Uso: Pasarela inteligente para sensores/cámaras, preprocesado local
Latencia: <1 ms
Uso: Keyword spotting, detección de anomalías, TinyML, always-on
Cloud vs Edge: los retos de la nube
Enviar todos los datos a la nube parece la solución obvia (GPUs potentes, escalabilidad infinita), pero en la práctica hay 5 problemas críticos que hacen inviable este enfoque para muchas aplicaciones:
Pensemos en un ejemplo concreto: una flota de 100 cámaras de seguridad 4K en una fábrica. Si cada cámara envía su stream a la nube para procesamiento con un modelo de detección de objetos (como los que se estudian en Detección de objetos), estaremos generando ~1.2 Gbps de datos de subida, con una latencia de ida y vuelta de 100–200 ms, y un coste mensual de miles de dólares en ancho de banda y computación cloud. Si en lugar de eso procesamos cada cámara localmente con una NPU de $70, la latencia baja a <5 ms, no necesitamos ancho de banda y el coste total es fijo.
| Aspecto | ☁️ Cloud | 📱 Edge |
|---|---|---|
| Latencia | 50-200ms | <1-10ms |
| Throughput | Alto (GPUs potentes) | Limitado (aceleradores pequeños) |
| Privacidad | Datos salen del dispositivo | Datos se quedan locales |
| Conectividad | Requiere internet estable | Funciona offline |
| Coste unitario | Bajo (pago por uso) | Bajo (CAPEX fijo) |
| Coste a escala | Alto (OPEX creciente) | Bajo (sin costes recurrentes) |
| Energía | 100-700W por GPU | 0.5-30W por dispositivo |
| Modelos | Sin restricción de tamaño | Modelos optimizados/comprimidos |
| Actualización | Inmediata (servidor) | OTA o manual |
¿Por qué Edge AI ahora?
Edge computing para ML no es nuevo — la investigación en redes neuronales compactas existe desde los años 90 — pero tres factores han convergido en la última década para hacerlo viable, accesible y explosivamente demandado:
A estos tres factores se suma un cuarto: la demanda regulatoria y social de privacidad. Regulaciones como el GDPR (Europa), HIPAA (salud en EE.UU.) y la creciente preocupación por la soberanía de los datos han hecho que procesar la información in situ, sin que salga del dispositivo, sea no solo una ventaja técnica sino un requisito legal en muchos dominios.
Métricas clave en Edge AI
En edge computing, la accuracy no es la única métrica (a diferencia de lo habitual en entrenamiento, donde se optimiza principalmente la precisión del modelo — ver Machine Learning Clásico para una revisión de métricas de evaluación). En el edge hay que optimizar un multi-objetivo que equilibra rendimiento, consumo, tamaño y coste:
Para comprender estas métricas, es útil pensar en un ejemplo: si desplegamos un modelo de detección de objetos en un dron agrícola alimentado por batería, nos importa que el modelo sea preciso, pero también que consuma poca energía (para maximizar el tiempo de vuelo), que sea rápido (para procesar cada frame en tiempo real), y que quepa en la memoria del acelerador embebido (típicamente 1–8 GB).
| Métrica | Unidad | Descripción | Objetivo |
|---|---|---|---|
| TOPS | Tera-Ops/s | Operaciones por segundo del acelerador (INT8 o FP16) | ↑ Mayor |
| TOPS/W | Tera-Ops/s/Watt | Eficiencia energética: rendimiento por vatio consumido | ↑ Mayor |
| Latencia | ms | Tiempo de inferencia extremo-a-extremo | ↓ Menor |
| FPS | frames/s | Frames procesados por segundo (visión) | ↑ Mayor |
| Potencia (TDP) | Watts | Consumo energético del sistema | ↓ Menor |
| Tamaño modelo | MB | Huella en memoria del modelo desplegado | ↓ Menor |
| Accuracy drop | % | Pérdida de precisión tras optimización | ↓ Menor |
Widget: calculadora Cloud vs Edge
Compara el coste total de propiedad (TCO) de desplegar inferencia en la nube vs en dispositivos edge durante un período determinado.
💰 Calculadora TCO: Cloud vs Edge
Historia del Edge AI
Panorama del hardware para Edge AI
No todos los aceleradores son iguales. Cada tipo de hardware tiene un perfil diferente de rendimiento, consumo, flexibilidad y coste. Elegir el correcto depende de la aplicación. A continuación se resumen los seis tipos principales de aceleradores para edge AI, ordenados de mayor eficiencia energética (TOPS/W) a mayor flexibilidad de programación:
Eficiencia: ★★★★★ (~8–11 TOPS/W)
Flexibilidad: ★★☆☆☆
ASIC especializado en inferencia. Máxima eficiencia energética, pero solo ejecuta modelos soportados por su compilador.
Eficiencia: ★★★★☆ (~3–6 TOPS/W)
Flexibilidad: ★★★☆☆
IP core instanciado dentro de una FPGA. Combina eficiencia con la reconfigurabilidad del hardware.
Eficiencia: ★★★☆☆ (~2–5 TOPS/W)
Flexibilidad: ★★★★☆
Lógica reconfigurable: puedes diseñar circuitos a medida. Determinismo temporal garantizado.
Eficiencia: ★★☆☆☆ (~1–4 TOPS/W)
Flexibilidad: ★★★★★
CUDA completo. Ejecuta cualquier modelo y framework. La opción más versátil para prototipado.
Eficiencia: ★★★☆☆ (mW-scale)
Flexibilidad: ★★★☆☆
Microcontroladores con TFLite Micro. Modelos <1 MB. Ideal para always-on con batería.
Eficiencia: ★☆☆☆☆ (~0.1–0.5 TOPS/W)
Flexibilidad: ★★★★★
Siempre disponible, ejecuta todo. Baseline de referencia. Útil para modelos pequeños o con SIMD (XNNPack).
NPUs: Neural Processing Units
Una NPU (Neural Processing Unit) es un circuito integrado (ASIC) diseñado exclusivamente para ejecutar operaciones de redes neuronales: convoluciones, multiplicaciones de matrices, activaciones. No puede correr código arbitrario como una GPU — pero al estar especializado, alcanza una eficiencia energética extraordinaria.
Para entender por qué las NPUs son tan eficientes, hay que recordar qué operaciones dominan en una red neuronal. Como se explica en MLP y Convolución y fundamentos, las redes neuronales consisten fundamentalmente en multiplicaciones de matrices (operaciones MAC: Multiply-ACcumulate) seguidas de funciones de activación. Una GPU de propósito general dedica una parte significativa de su silicio a control de flujo, cachés y unidades de punto flotante de alta precisión (FP32/FP64). Una NPU, en cambio, elimina todo lo innecesario y dedica prácticamente todo su silicio a arrays masivos de unidades MAC en aritmética entera (INT8), con un flujo de datos tipo dataflow que minimiza el movimiento de datos — la operación más costosa energéticamente en un chip (consultar Sze et al., 2020 para una revisión completa de arquitecturas de hardware para DNN).
🧠 ¿Cómo funciona una NPU?
- Compilación offline: La red neuronal se compila a un grafo optimizado para la NPU (fusión de operadores, tiling, scheduling).
- Ejecución dataflow: Los datos fluyen por una pipeline de unidades de cálculo especializadas (MAC arrays) sin necesidad de fetch/decode de instrucciones.
- Cuantización nativa: Las NPUs operan en INT8 o INT4, no FP32. Esto reduce el ancho de banda de memoria y el consumo energético.
Hailo
Hailo es el fabricante de NPUs más relevante en edge AI. Su chip Hailo-8 ha sido adoptado por Raspberry Pi, drones, cámaras de seguridad y vehículos autónomos.
| Modelo | TOPS (INT8) | Potencia | TOPS/W | Interfaz | Uso típico |
|---|---|---|---|---|---|
| Hailo-8 | 26 | ~2.5W | ~10.4 | M.2, PCIe | Visión multi-cámara, industria |
| Hailo-8L | 13 | ~1.5W | ~8.7 | M.2 (RPi 5) | Raspberry Pi AI Kit, IoT |
| Hailo-10H | 40 | ~3.5W | ~11.4 | M.2, PCIe | Multi-stream, LLMs compactos |
| Hailo-15 | 20 + ISP | ~3W | ~6.7 | SoC integrado | Cámaras inteligentes all-in-one |
.hef
(Hailo Executable Format).
.hef
en el chip y ejecuta inferencia. APIs en C++, Python.
Otras NPUs relevantes
| NPU | Fabricante | TOPS | Notas |
|---|---|---|---|
| Edge TPU | 4 | Coral Dev Board, USB Accelerator. Solo modelos TFLite cuantizados. | |
| Neural Engine | Apple | 38 (M4) | Integrado en SoC. CoreML. No accesible como acelerador externo. |
| NPU Meteor Lake | Intel | 11 | Integrado en CPU. OpenVINO. Primera NPU en portátiles x86. |
| Hexagon NPU | Qualcomm | 45 (X Elite) | En Snapdragon. Qualcomm AI Engine. Domina en móviles Android. |
| Ethos-U85 | ARM | 4 | Diseño licenciable para SoCs. TinyML y microcontroladores. |
GPUs Edge: NVIDIA Jetson
La familia NVIDIA Jetson lleva GPUs CUDA completas al edge. A diferencia de las NPUs, las GPUs son programables: pueden ejecutar cualquier modelo, cualquier framework, con soporte completo de CUDA, cuDNN y TensorRT.
Esta flexibilidad es crucial en escenarios donde el modelo cambia frecuentemente, donde se necesitan operadores personalizados, o donde la aplicación combina múltiples modelos en un pipeline complejo (por ejemplo, detección + seguimiento + reconocimiento facial + análisis de comportamiento). Mientras que una NPU requiere recompilar y validar cada modelo contra su set de operadores soportados, en Jetson basta con exportar el modelo desde PyTorch y optimizarlo con TensorRT — el mismo workflow que en cualquier GPU de servidor, pero en un módulo que consume 7–60 W. La documentación oficial de NVIDIA para Jetson Developer Kits incluye guías detalladas de cómo comenzar.
| Modelo | GPU | TOPS (INT8) | RAM | TDP | Precio |
|---|---|---|---|---|---|
| Jetson Nano (legacy) | 128-core Maxwell | 0.5 | 4 GB | 5-10W | ~$99 |
| Jetson Orin Nano | 1024-core Ampere | 40 | 4/8 GB | 7-15W | ~$199 |
| Jetson Orin NX | 1024-core Ampere | 100 | 8/16 GB | 10-25W | ~$399 |
| Jetson AGX Orin | 2048-core Ampere | 275 | 32/64 GB | 15-60W | ~$999 |
| Jetson Thor (2025) | Blackwell | 800+ | Hasta 128 GB | ~100W | TBD |
🛠️ Stack de software Jetson
- JetPack SDK: Linux (L4T), CUDA, cuDNN, TensorRT, VPI, DeepStream
- TensorRT: Compilador que optimiza modelos para la GPU Jetson (fusión de capas, FP16/INT8, kernel autotuning)
- DeepStream: Pipeline de vídeo multi-stream para analítica
- Isaac ROS: Stack de robótica con aceleración GPU
- TAO Toolkit: Transfer learning y fine-tuning con GUI
| Aspecto | GPU (Jetson) | NPU (Hailo) |
|---|---|---|
| Flexibilidad | ✅ Cualquier modelo | ⚠️ Solo modelos soportados |
| Eficiencia | ~1-4 TOPS/W | ~8-11 TOPS/W |
| Prototipado | ✅ Rápido (CUDA directo) | ⚠️ Requiere compilación |
| Modelos custom | ✅ Operadores custom | ⚠️ Operadores limitados |
| Coste energético | 7-60W | 1.5-3.5W |
| Caso ideal | Robótica, multimodelo | Visión fija, IoT, batería |
FPGAs para Edge AI
Una FPGA (Field-Programmable Gate Array) es un chip de lógica reconfigurable: puedes diseñar circuitos digitales a medida sin fabricar un ASIC. Esto la sitúa entre la flexibilidad de una GPU y la eficiencia de una NPU.
Las FPGAs destacan en aplicaciones donde se necesita determinismo temporal estricto: cada inferencia tarda exactamente el mismo tiempo, sin variabilidad (jitter). Esto es un requisito en dominios de seguridad funcional como la automoción (ISO 26262), la aviación (DO-254) y los sistemas médicos. Además, las FPGAs permiten implementar pipelines de procesamiento completamente en hardware, lo que puede lograr latencias de microsegundos o incluso nanosegundos — ordenes de magnitud más bajas que cualquier GPU o NPU. Para una introducción más amplia a la aplicación de FPGAs en aprendizaje profundo, véase la revisión de Venieris et al. (2018).
🔧 ¿Cómo ejecuta una FPGA un modelo de ML?
Hay dos enfoques principales:
- DPU (Deep Processing Unit): Un acelerador de IA pre-diseñado que se instancia dentro de la FPGA. AMD/Xilinx proporciona IPs de DPU optimizadas. Similar a usar una NPU, pero dentro de la FPGA.
- HLS (High-Level Synthesis): Traducir el modelo directamente a circuitos RTL. Cada capa se convierte en hardware dedicado. Máxima eficiencia pero mayor complejidad de diseño.
Xilinx / AMD Kria
La familia Kria de AMD (antes Xilinx) son System-on-Modules (SoMs) con FPGA + CPU ARM diseñados específicamente para Edge AI:
| Modelo | FPGA | CPU | AI Perf. | Interfaz | Uso típico |
|---|---|---|---|---|---|
| Kria KV260 | Zynq UltraScale+ ZU5EV | 4× ARM A53 | ~4.1 TOPS (DPU B4096) | MIPI, HDMI, GbE | Visión, smart city |
| Kria KR260 | Zynq UltraScale+ ZU5EV | 4× ARM A53 | ~4.1 TOPS | SFP28, TSN GbE | Robótica, industrial |
| Kria K24 | Zynq UltraScale+ ZU3/5 | 2-4× ARM A53 | ~1-4 TOPS | Compacto | IoT, industrial |
¿Qué es una DPU (Deep Processing Unit)?
La DPU es un IP core (bloque de propiedad intelectual) que se sintetiza dentro de una FPGA para acelerar inferencia de redes neuronales. AMD/Xilinx proporciona DPUs configurables:
.xmodel.
Otros aceleradores edge
Widget: comparador de hardware edge
Selecciona dispositivos y compáralos en rendimiento, eficiencia y coste.
⚡ Comparador de aceleradores edge
¿Por qué optimizar modelos para edge?
Un modelo ResNet-50 en FP32 ocupa ~98 MB y necesita ~4 GFLOPs por inferencia. Una YOLOv8-L pesa ~84 MB y requiere ~165 GFLOPs. Estos modelos no caben, o son demasiado lentos, en dispositivos con 1-8 GB de RAM y aceleradores de 4-40 TOPS. La solución: comprimir sin destruir.
Pruning (poda de redes)
Pruning elimina parámetros o estructuras redundantes de una red neuronal. La idea fundamental, formalizada en la célebre Lottery Ticket Hypothesis (Frankle & Carlin, 2019), es que dentro de una red grande existe una subred más pequeña (el "billete ganador") que, entrenada aisladamente, alcanza la misma accuracy que la red completa. En la práctica, muchos pesos son cercanos a cero y contribuyen poco a la salida: pueden eliminarse sin degradar significativamente el rendimiento.
El pruning puede verse como el complemento del entrenamiento: mientras que técnicas como las descritas en Regularización (weight decay, dropout) fuerzan al modelo a no depender de parámetros individuales, el pruning materializa esa redundancia eliminándolos explícitamente. Es importante distinguir dos enfoques fundamentalmente diferentes:
import torch
import torch.nn.utils.prune as prune
model = torch.hub.load('pytorch/vision', 'resnet18', pretrained=True)
# Pruning no-estructurado: eliminar 40% de pesos por magnitud
for name, module in model.named_modules():
if isinstance(module, torch.nn.Conv2d):
prune.l1_unstructured(module, name='weight', amount=0.4)
# Hacer permanente (eliminar el hook de pruning)
for name, module in model.named_modules():
if isinstance(module, torch.nn.Conv2d):
prune.remove(module, 'weight')
# Verificar sparsity
total = sum(p.numel() for p in model.parameters())
zeros = sum((p == 0).sum().item() for p in model.parameters())
print(f"Sparsity: {zeros/total*100:.1f}%")
# Pruning ESTRUCTURADO: eliminar 30% de filtros por norma L2
for name, module in model.named_modules():
if isinstance(module, torch.nn.Conv2d):
prune.ln_structured(module, name='weight', amount=0.3, n=2, dim=0)
Cuantización
Cuantización reduce la precisión numérica de los pesos y activaciones: de FP32 (32 bits) a INT8 (8 bits), INT4, o incluso binario. Es la técnica más impactante para edge: reduce tamaño 4× y acelera inferencia 2-4× en hardware con soporte nativo INT8.
La intuición detrás de la cuantización es que las redes neuronales son sorprendentemente robustas a la reducción de precisión. Durante el entrenamiento (ver Entrenamiento de redes neuronales), se usan gradientes en FP32 para hacer ajustes finos. Pero una vez entrenado, el modelo no necesita tanta precisión para inferir: los pesos solo se leen, no se actualizan. Matemáticamente, cuantizar consiste en mapear un rango continuo de valores a un conjunto discreto de niveles. Para cuantización uniforme asimétrica, la transformación es:
Donde \(s\) es el scale (factor de escala) y \(z\) es el zero point (offset para mapear el rango).
| Tipo | Bits | Reducción | Accuracy drop | Notas |
|---|---|---|---|---|
| FP32 | 32 | 1× | — | Baseline. Entrenamiento estándar. |
| FP16 | 16 | 2× | ~0% | Mixed precision. GPUs modernas (Tensor Cores). |
| INT8 | 8 | 4× | <1% | Estándar para edge. Soportado por NPUs, TensorRT, TFLite. |
| INT4 | 4 | 8× | 1-3% | LLMs (GPTQ, AWQ). Requiere calibración cuidadosa. |
| Binary/Ternary | 1-2 | 16-32× | 5-15% | Investigación. XNOR-Net. Uso en MCUs extremos. |
Tipos de cuantización
import torch
from torch.quantization import quantize_dynamic, quantize
# ═══════════════════════════════════════════════
# 1. Dynamic Quantization (sin dataset de calibración)
# ═══════════════════════════════════════════════
model_fp32 = ... # tu modelo entrenado
model_int8 = quantize_dynamic(
model_fp32,
{torch.nn.Linear, torch.nn.LSTM}, # capas a cuantizar
dtype=torch.qint8
)
# Comparar tamaños
import os
torch.save(model_fp32.state_dict(), "model_fp32.pt")
torch.save(model_int8.state_dict(), "model_int8.pt")
print(f"FP32: {os.path.getsize('model_fp32.pt')/1e6:.1f} MB")
print(f"INT8: {os.path.getsize('model_int8.pt')/1e6:.1f} MB")
# ═══════════════════════════════════════════════
# 2. Static Quantization (con calibración)
# ═══════════════════════════════════════════════
model_fp32.eval()
model_fp32.qconfig = torch.quantization.get_default_qconfig('x86')
model_prepared = torch.quantization.prepare(model_fp32)
# Calibrar con datos representativos
with torch.no_grad():
for images, _ in calibration_loader: # ~100-1000 batches
model_prepared(images)
# Convertir a INT8
model_quantized = torch.quantization.convert(model_prepared)
import tensorflow as tf
# Cargar modelo entrenado
model = tf.keras.models.load_model('my_model.h5')
# ═══════════════════════════════════════════════
# 1. Post-Training INT8 Quantization
# ═══════════════════════════════════════════════
def representative_dataset():
"""Dataset de calibración (~100-1000 muestras)"""
for images, _ in calibration_ds.take(200):
yield [tf.cast(images, tf.float32)]
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8
tflite_quant_model = converter.convert()
# Guardar
with open('model_int8.tflite', 'wb') as f:
f.write(tflite_quant_model)
print(f"Tamaño: {len(tflite_quant_model) / 1e6:.1f} MB")
# ═══════════════════════════════════════════════
# 2. Quantization-Aware Training (QAT)
# ═══════════════════════════════════════════════
import tensorflow_model_optimization as tfmot
qat_model = tfmot.quantization.keras.quantize_model(model)
qat_model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
qat_model.fit(train_ds, epochs=3) # Fine-tune con QAT
# Convertir a TFLite INT8
converter = tf.lite.TFLiteConverter.from_keras_model(qat_model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_qat = converter.convert()
Knowledge Distillation
Knowledge Distillation (Hinton et al., 2015) entrena un modelo pequeño (student) para imitar las salidas de un modelo grande (teacher). El student aprende no solo las etiquetas correctas, sino la distribución de probabilidades del teacher — las "soft labels" contienen información valiosa sobre qué clases son similares entre sí.
La idea es elegante: un modelo grande aprende representaciones ricas del mundo; un modelo pequeño, entrenado solo con etiquetas duras (one-hot), no tiene acceso a esas relaciones. Al transferir el conocimiento mediante soft labels con temperatura, el student hereda parte de esa riqueza representacional. En el contexto de edge, la destilación es especialmente valiosa porque permite diseñar modelos pequeños que rinden como grandes, sin necesidad de ejecutar el modelo grande en el dispositivo. Variantes modernas como DistilBERT han demostrado que es posible comprimir un modelo de 110M parámetros (BERT-base) a 66M manteniendo el 97% de su rendimiento en tareas de NLP. Para modelos de visión, la técnica se combina frecuentemente con pruning y cuantización para lograr compresiones aún mayores.
\(T\) = temperatura (suaviza las distribuciones), \(\alpha\) = balance entre loss duro y soft, \(z_t, z_s\) = logits del teacher y student.
🎯 Ejemplo: ResNet-50 → MobileNetV3
- Teacher: ResNet-50 (25.6M params, 4.1 GFLOPs, 76.1% top-1)
- Student sin distillation: MobileNetV3-Small (2.5M params, 72.0%)
- Student con distillation: MobileNetV3-Small (2.5M params, 74.2%)
- Ganancia: +2.2% de accuracy sin añadir un solo parámetro
NAS: diseño automático de arquitecturas
Neural Architecture Search (NAS) busca automáticamente la arquitectura óptima dadas restricciones de hardware (latencia, FLOPs, tamaño). En lugar de diseñar manualmente la estructura de la red (número de capas, canales, tipo de operación en cada bloque), NAS explora un espacio de búsqueda enorme de posibles arquitecturas y selecciona la que mejor cumple los requisitos.
Las familias de modelos más usadas en edge fueron diseñadas con variantes de NAS. La idea clave es la búsqueda hardware-aware: en lugar de optimizar solo la accuracy, la función objetivo incluye la latencia real medida en el dispositivo target (Tan et al., "MnasNet", 2019). Esto produce arquitecturas que son inherentemente eficientes en el hardware de destino, a diferencia de comprimir un modelo grande a posteriori. Combinado con las técnicas de pruning, cuantización y destilación descritas anteriormente, NAS permite lograr puntos de operación accuracy/latencia que serían imposibles de alcanzar con diseño manual.
| Familia | Método NAS | Params | Top-1 ImageNet | MFLOPs |
|---|---|---|---|---|
| MobileNetV3 | NetAdapt + NAS | 2.5-5.4M | 72-75% | 56-219 |
| EfficientNet-Lite | NAS (compound scaling) | 4.7-13M | 75-80% | 400-1800 |
| FBNet | Differentiable NAS (DNAS) | 4.5M | 74.9% | 295 |
| Once-for-All (OFA) | Progressive shrinking | Variable | 76-80% | Variable |
| MCUNet | TinyNAS + TinyEngine | 0.7-1M | 70.7% | 81 |
Compilación y conversión de modelos
El paso final antes del despliegue es compilar el modelo para el hardware objetivo. Cada target tiene su propio compilador que optimiza el grafo computacional:
| Tool | Target | Input | Output | Optimizaciones |
|---|---|---|---|---|
| TensorRT | NVIDIA GPU (Jetson) | ONNX, PyTorch, TF | .engine / .plan | Fusión de capas, FP16/INT8, kernel autotuning |
| TFLite | ARM CPU, Edge TPU, NPUs | TF SavedModel | .tflite | Cuantización, delegados HW, XNNPack |
| ONNX Runtime | Multi-plataforma | ONNX | Runtime exec | Graph optimization, EPs (CUDA, TensorRT, OpenVINO) |
| OpenVINO | Intel CPU/GPU/NPU | ONNX, TF, PyTorch | .xml + .bin | Fusión, cuantización, INT8 NNCF |
| Hailo DFC | Hailo NPU | ONNX, TF | .hef | Cuantización INT8, dataflow mapping |
| Vitis AI | AMD/Xilinx DPU | PyTorch, TF, Caffe | .xmodel | Cuantización INT8, compilación a DPU ISA |
| CoreML | Apple Neural Engine | PyTorch, TF, ONNX | .mlmodel/.mlpackage | Optimización para ANE, GPU, CPU Apple |
import torch
import tensorrt as trt
# 1. Exportar a ONNX
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
model.eval()
dummy = torch.randn(1, 3, 640, 640)
torch.onnx.export(model, dummy, "yolov5s.onnx",
opset_version=13,
input_names=['images'],
output_names=['output'],
dynamic_axes={'images': {0: 'batch'}})
# 2. Compilar con TensorRT (trtexec CLI)
# $ trtexec --onnx=yolov5s.onnx \
# --saveEngine=yolov5s.engine \
# --fp16 \ # o --int8 --calib=calib.cache
# --workspace=1024 \
# --batch=1
# 3. Inferencia con TensorRT en Python
import pycuda.driver as cuda
import pycuda.autoinit
import numpy as np
logger = trt.Logger(trt.Logger.WARNING)
with open("yolov5s.engine", "rb") as f:
engine = trt.Runtime(logger).deserialize_cuda_engine(f.read())
context = engine.create_execution_context()
# ... allocate buffers, run inference, postprocess ...
Widget: simulador de cuantización
Visualiza cómo la cuantización reduce el tamaño del modelo y su impacto en accuracy. Ajusta el número de bits y el tipo de modelo para ver la compresión resultante.
🔢 Simulador de Cuantización
Ecosistema de herramientas para Edge AI
Llevar un modelo del entrenamiento al edge requiere una cadena de herramientas que conecta frameworks de ML con el hardware objetivo. El ecosistema ha madurado enormemente y hoy existen soluciones end-to-end para cada plataforma.
El diagrama siguiente muestra el flujo típico: el modelo se entrena en un framework estándar (PyTorch, TensorFlow, JAX), se exporta a un formato de intercambio (ONNX o SavedModel), se optimiza y compila para el hardware target, y finalmente se despliega con un runtime específico. Existe también un camino alternativo para FPGAs (hls4ml) que convierte el modelo directamente en hardware RTL, sin pasar por una DPU. Para quienes buscan profundizar en el despliegue en general, el submódulo de Puesta en Producción cubre Docker, Kubernetes y serving frameworks.
TensorRT (NVIDIA)
TensorRT es el compilador/runtime de NVIDIA para optimizar modelos en GPUs (desktop, server y Jetson). Es la herramienta más madura para Jetson y probablemente la más usada en producción para inferencia en GPUs NVIDIA.
TensorRT actúa como un compilador de grafos computacionales: toma un modelo entrenado (en formato ONNX, PyTorch o TensorFlow) y lo transforma en una representación altamente optimizada para la GPU específica donde se va a ejecutar. Las optimizaciones incluyen fusión de operaciones (por ejemplo, Conv + BatchNorm + ReLU se fusionan en un solo kernel CUDA), selección del kernel más rápido para cada operación mediante autotuning, y cuantización a FP16/INT8 con calibración automática. La documentación completa está disponible en la documentación oficial de TensorRT. El proceso de optimización se resume en cuatro pasos:
TensorFlow Lite
TFLite es el runtime de Google para inferencia en edge. Es el formato más universal: funciona en Android, iOS, Linux, microcontroladores (TFLite Micro), y soporta delegados hardware (GPU, NNAPI, Edge TPU, Hexagon).
La fuerza de TFLite está en su ecosistema de delegados
(delegates): plugins que permiten que las operaciones del modelo se ejecuten
en el acelerador disponible del dispositivo, sin cambiar el código. Por ejemplo, el
mismo archivo .tflite puede ejecutarse en una CPU ARM con
XNNPack
(SIMD optimizado), en un Edge TPU de Coral, o en una GPU móvil mediante OpenGL/Metal,
simplemente cambiando el delegado. Para desarrolladores que trabajan con modelos de
clasificación o detección (ver
Clasificación y Transfer Learning y
Detección de objetos),
TFLite ofrece una biblioteca de modelos pre-optimizados
listos para desplegar. Las principales plataformas soportadas son:
ONNX y ONNX Runtime
ONNX (Open Neural Network Exchange) es el formato estándar de intercambio de modelos, desarrollado originalmente por Microsoft y Facebook. ONNX Runtime es el motor de inferencia de Microsoft que ejecuta modelos ONNX con Execution Providers (EP) para diferentes hardware.
La propuesta de valor de ONNX es resolver la fragmentación del ecosistema: en lugar de que cada hardware requiera su propio formato (TensorRT para Jetson, TFLite para Coral, Vitis AI para FPGA...), ONNX ofrece un formato intermedio único desde el que se puede optimizar para cualquier target. En la práctica, la mayoría de compiladores de edge aceptan ONNX como formato de entrada. ONNX Runtime extiende esto proporcionando un motor de inferencia unificado con Execution Providers que abstraen el hardware subyacente:
| Execution Provider | Hardware | Ventaja |
|---|---|---|
| CPUExecutionProvider | Cualquier CPU | Siempre disponible, baseline |
| CUDAExecutionProvider | NVIDIA GPU | Aceleración CUDA directa |
| TensorrtExecutionProvider | NVIDIA GPU | Optimización TensorRT automática |
| OpenVINOExecutionProvider | Intel CPU/GPU/NPU | Mejor rendimiento en Intel |
| QNNExecutionProvider | Qualcomm NPU | Snapdragon, aceleración Hexagon |
| CoreMLExecutionProvider | Apple ANE | Neural Engine de Apple |
import onnxruntime as ort
import numpy as np
# Crear sesión con TensorRT EP (Jetson) o CPU fallback
providers = ['TensorrtExecutionProvider',
'CUDAExecutionProvider',
'CPUExecutionProvider']
session = ort.InferenceSession("model.onnx", providers=providers)
# Ver qué EP se está usando
print(f"Using: {session.get_providers()}")
# Inferencia
input_name = session.get_inputs()[0].name
result = session.run(None, {input_name: np.random.randn(1, 3, 224, 224).astype(np.float32)})
print(f"Output shape: {result[0].shape}")
OpenVINO (Intel)
OpenVINO (Open Visual Inference and Neural Network Optimization) es el toolkit de Intel para optimizar y desplegar modelos en hardware Intel: CPUs (con instrucciones AVX-512/AMX), GPUs integradas (Xe), VPUs (Myriad X) y las nuevas NPUs de Meteor Lake.
🔧 Pipeline OpenVINO
- Importar modelo desde PyTorch, TF, ONNX (
moModel Optimizer oopenvino.convert_model()) - Cuantización INT8 con NNCF (Neural Network Compression Framework)
- Inferencia con OpenVINO Runtime (selección automática de device: CPU, GPU, NPU)
Vitis AI y HLS4ML: frameworks para FPGA
Vitis AI
Vitis AI (AMD/Xilinx) es el framework completo para desplegar modelos en FPGAs con DPU. Incluye:
.xmodel.
.xmodel en la DPU.
APIs en C++ y Python. Gestión de buffers DMA.
# ═══════════════════════════════════════════════
# 1. Cuantización con Vitis AI (PyTorch)
# ═══════════════════════════════════════════════
from pytorch_nndct.apis import torch_quantizer
model = load_my_model() # Modelo PyTorch entrenado
model.eval()
# Crear quantizer
quantizer = torch_quantizer(
quant_mode='calib', # Modo calibración
module=model,
input_args=torch.randn(1, 3, 224, 224),
output_dir='quantized/',
bitwidth=8 # INT8
)
quant_model = quantizer.quant_model
# Calibrar con datos representativos
with torch.no_grad():
for images, _ in calib_loader:
quant_model(images)
quantizer.export_quant_config()
# ═══════════════════════════════════════════════
# 2. Compilar para DPU (terminal)
# ═══════════════════════════════════════════════
# $ vai_c_xir \
# -x quantized/model_int.xmodel \
# -a /opt/vitis_ai/compiler/arch/DPUCZDX8G/KV260/arch.json \
# -o compiled/ \
# -n my_model
# ═══════════════════════════════════════════════
# 3. Inferencia con VART en la FPGA
# ═══════════════════════════════════════════════
import xir
import vart
import numpy as np
# Cargar modelo compilado
graph = xir.Graph.deserialize("compiled/my_model.xmodel")
subgraphs = graph.get_root_subgraph().toposort_child_subgraph()
dpu_subgraph = [s for s in subgraphs if s.has_attr("device") and s.get_attr("device") == "DPU"]
runner = vart.Runner.create_runner(dpu_subgraph[0], "run")
# Preparar buffers
input_tensors = runner.get_input_tensors()
output_tensors = runner.get_output_tensors()
# Ejecutar inferencia
input_data = preprocess(image) # Preprocesado del input
job_id = runner.execute_async([input_data], [output_buffer])
runner.wait(job_id)
HLS4ML: Machine Learning en hardware puro
hls4ml (HLS for Machine Learning) es un framework open-source que traduce redes neuronales directamente a circuitos digitales (RTL) usando High-Level Synthesis. No usa DPU — cada capa se convierte en hardware dedicado. Desarrollado originalmente en el proyecto Fast Machine Learning del CERN, hls4ml ha demostrado que es posible ejecutar inferencia de redes neuronales en nanosegundos, algo imposible con cualquier solución basada en software. Modelos como las Spiking Neural Networks o las Graph Neural Networks, que tienen estructuras irregulares, son candidatos interesantes para aceleración en FPGA con enfoques de este tipo.
import hls4ml
import tensorflow as tf
from tensorflow import keras
# 1. Definir modelo pequeño (trigger LHC)
model = keras.Sequential([
keras.layers.Dense(64, activation='relu', input_shape=(16,)),
keras.layers.Dense(32, activation='relu'),
keras.layers.Dense(32, activation='relu'),
keras.layers.Dense(5, activation='softmax')
])
model.compile(optimizer='adam', loss='categorical_crossentropy')
model.fit(X_train, y_train, epochs=50)
# 2. Configurar hls4ml
config = hls4ml.utils.config_from_keras_model(model, granularity='name')
# Ajustar precisión por capa
for layer in config['LayerName']:
config['LayerName'][layer]['Precision']['weight'] = 'ap_fixed<16,6>'
config['LayerName'][layer]['Precision']['bias'] = 'ap_fixed<16,6>'
config['LayerName'][layer]['Precision']['result'] = 'ap_fixed<16,6>'
config['LayerName'][layer]['ReuseFactor'] = 1 # Full parallel
# 3. Convertir a HLS
hls_model = hls4ml.converters.convert_from_keras_model(
model, hls_config=config,
output_dir='hls_output/',
backend='VivadoAccelerator', # o 'Vitis'
board='kria-kv260'
)
# 4. Compilar y sintetizar
hls_model.compile()
hls_model.build(csim=True, synth=True) # Simular + sintetizar
# Ver recursos
hls4ml.report.read_vivado_report('hls_output/')
# → Latencia: ~50 ns, LUTs: 15%, DSPs: 8%, BRAMs: 3%
| Aspecto | hls4ml (HW puro) | Vitis AI (DPU) |
|---|---|---|
| Latencia | ~ns a µs | ~ms |
| Modelos | Pequeños (< ~1M params) | Cualquier tamaño |
| Flexibilidad | Precisión configurable (ap_fixed) | INT8 fijo |
| Complejidad | Alta (necesitas saber de FPGA) | Media (similar a TensorRT) |
| Caso de uso | Ultra-baja latencia, ciencia | Visión, inferencia estándar |
Edge Impulse y otras plataformas MLOps edge
Edge Impulse es una plataforma cloud para desarrollar modelos de ML para edge de forma visual (no-code/low-code). Cubre el pipeline completo: recoger datos → etiquetar → entrenar → optimizar → desplegar.
🛠️ Pipeline Edge Impulse
- Data ingestion: Conecta sensores (acelerómetro, micrófono, cámara) directamente desde el dispositivo.
- Signal processing: Bloques de preprocesado (FFT, MFCCs, spectrograms) configurables visualmente.
- Training: Modelos pre-configurados (clasificación, detección, anomalías) o custom con Keras.
- Deployment: Exportar como librería C++ para Arduino, RPi, STM32, Nordic, o como firmware completo.
| Plataforma | Enfoque | Targets |
|---|---|---|
| Edge Impulse | No-code/low-code, sensores IoT | MCUs (ARM, ESP32), Linux, móvil |
| Nota AI | AutoML para edge, labeling | Jetson, Coral, RPi |
| Roboflow | Computer vision end-to-end | Jetson, Coral, Luxonis, web |
| Ultralytics HUB | YOLO training + deploy | TensorRT, TFLite, ONNX, CoreML |
Aplicaciones de Edge AI por sector
Edge AI no es una tecnología que exista en el vacío: su valor emerge cuando se aplica a problemas reales donde la nube no es viable. A continuación se presentan los sectores más relevantes donde el despliegue en dispositivos edge está generando un impacto transformador. Muchas de estas aplicaciones combinan técnicas de detección de objetos, segmentación, modelos recurrentes para series temporales, y modelos de aprendizaje por refuerzo para control autónomo.
Proyectos de Edge AI: clásicos y modernos
🏛️ Proyectos clásicos y fundacionales
| Proyecto | Año | Hardware | Logro |
|---|---|---|---|
| MobileNet (Google) | 2017 | Móviles ARM | Primera CNN diseñada para edge: depthwise separable convs. 4.2M params, 569 MFLOPs. |
| SqueezeNet | 2016 | CPU embebida | Accuracy de AlexNet con 50× menos parámetros (1.2M). Fire modules. |
| Keyword Spotting (Google) | 2017 | Smartphones | "OK Google" con modelo de 14KB en DSP dedicado. <1ms latencia, always-on. |
| hls4ml + LHC Trigger | 2018 | Xilinx Virtex-7 | Clasificación de jets de partículas en ~75ns en FPGA. Paper en Nature MI. |
| MCUNet (MIT) | 2020 | ARM Cortex-M7 | ImageNet en microcontrolador (256KB SRAM). TinyNAS + TinyEngine. |
🚀 Proyectos modernos y de referencia
| Proyecto | Año | Hardware | Logro |
|---|---|---|---|
| Llama.cpp | 2023 | CPU + GPU edge | LLMs (Llama 2/3, Phi) en laptops y RPi. Cuantización GGUF (Q4_K_M). |
| Whisper on Coral | 2023 | Edge TPU | Speech-to-text offline en Edge TPU. Modelo whisper-tiny cuantizado. |
| YOLOv8 on Hailo-8 | 2023 | Hailo-8 (RPi 5) | Detección de objetos a 30+ FPS en Raspberry Pi 5 con AI Kit. |
| NVIDIA Isaac + Jetson | 2024 | Jetson Orin | Stack de robótica completo: percepción 3D, SLAM, manipulación con GPU edge. |
| MediaPipe (Google) | 2019-24 | Móvil/web | Pose estimation, hand tracking, face mesh en tiempo real. Modelos <5MB. |
| Phi-3 mini on NPU | 2024 | Intel/Qualcomm NPU | LLM de 3.8B params en NPU de laptop con INT4. ~15 tokens/s local. |
| Stable Diffusion on Jetson | 2024 | Jetson Orin | Generación de imágenes en edge: ~5s/imagen en Orin Nano con TensorRT. |
Limitaciones y retos del Edge AI
A pesar de sus ventajas, el despliegue de modelos en edge conlleva retos significativos que es importante comprender antes de comprometerse con esta aproximación. No todos los problemas se resuelven con edge — hay escenarios donde la nube sigue siendo la mejor opción (modelos muy grandes, cargas variables, prototipado rápido). Los principales retos se agrupan en seis categorías:
Papers y recursos fundamentales
Edge AI es un campo en rápida evolución. A continuación se recopilan los papers más influyentes, organizados por temática, junto con los recursos de documentación más útiles para comenzar a trabajar con hardware y frameworks edge. Para profundizar en los fundamentos teóricos, se recomienda consultar también los submódulos de Convolución y fundamentos (para entender las operaciones que se aceleran) y Regularización (técnicas relacionadas con la compresión de modelos).
| Paper / Recurso | Año | Contribución | Link |
|---|---|---|---|
| MobileNets | 2017 | Depthwise separable convolutions | arXiv |
| SqueezeNet | 2016 | AlexNet accuracy with 50× fewer parameters | arXiv |
| EfficientNet | 2019 | Compound scaling (depth × width × resolution) | arXiv |
| MCUNet | 2020 | TinyNAS + TinyEngine for microcontrollers | arXiv |
| hls4ml | 2018 | Fast ML inference on FPGA | arXiv · GitHub |
| Distilling Knowledge | 2015 | Knowledge distillation (Hinton et al.) | arXiv |
| Lottery Ticket Hypothesis | 2019 | Sparse subnetworks match dense accuracy | arXiv |
| GPTQ | 2022 | Post-training quantization for LLMs | arXiv |
| AWQ | 2023 | Activation-aware weight quantization | arXiv |
| Efficient DNN Survey (Sze et al.) | 2020 | Revisión completa de hardware y algoritmos eficientes para DNN | arXiv |
| MnasNet | 2019 | Platform-aware NAS para modelos móviles | arXiv |
| DistilBERT | 2019 | Destilación de BERT: 60% tamaño, 97% rendimiento | arXiv |
| TinyML Book | 2022 | Referencia completa de ML en microcontroladores | O'Reilly |
📚 Recursos adicionales
- NVIDIA Jetson Developer Kits — Documentación oficial y tutoriales
- Hailo Developer Zone — Model Zoo, SDK, tutoriales
- Vitis AI Documentation — Guía completa para FPGA
- hls4ml Documentation — Tutoriales y API reference
- Google Coral Docs — Edge TPU developer guide
- Edge Impulse Docs — Plataforma MLOps para edge
- llama.cpp — LLM inference on CPU/edge
- TensorRT Documentation — Guía completa de optimización para GPUs NVIDIA
- ONNX Runtime — Motor de inferencia multi-plataforma
- OpenVINO Documentation — Toolkit de Intel para optimización e inferencia
- MCUNet (GitHub) — TinyNAS + TinyEngine para microcontroladores
- MLCommons TinyML Benchmark — Benchmarks estándar para inferencia en edge
🔗 Submódulos relacionados en esta web
- Convolución y fundamentos — Las operaciones que dominan la inferencia en edge
- Detección de objetos — YOLO, SSD y modelos frecuentemente desplegados en edge
- Segmentación — Modelos de segmentación semántica para visión edge
- Transformers — Arquitectura dominante, cada vez más presente en edge
- LLMs — Large Language Models en edge: Phi, Gemma, llama.cpp
- Regularización — Técnicas relacionadas con compresión
- Entrenamiento de redes neuronales — Fundamentos del entrenamiento que se optimiza
- Puesta en Producción — Docker, Kubernetes, serving para despliegue cloud/híbrido
- Aprendizaje por refuerzo — RL en robots y sistemas autónomos edge
Widget: selector de hardware edge
Responde unas preguntas sobre tu proyecto y te recomendaremos el hardware edge más adecuado.