📖 Teoría

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.

🎯 Objetivo fundamental: Llevar la inteligencia al lugar donde se generan los datos, eliminando la dependencia de la nube y habilitando aplicaciones en tiempo real, privadas y autónomas.

☁️ → 📱 El espectro Cloud-Edge

No es binario. Existe un continuo entre la nube y el dispositivo:

☁️ Cloud GPU clusters Alta potencia Alta latencia 🏢 Edge Server On-premises GPU Media potencia Baja latencia 🔌 Gateway Jetson, Hailo, FPGA Potencia limitada Latencia mínima 📱 Endpoint MCU, móvil, sensor Muy limitada Latencia cero Entrenamiento Inferencia

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:

⏱️
Latencia
Un round-trip cloud típico toma 50-200ms. Un coche autónomo a 120 km/h recorre 3.3 metros en 100ms. ¡Inaceptable! Edge: <5ms.
📡
Ancho de banda
Una cámara 4K genera ~12 Mbps. 1000 cámaras = 12 Gbps. Enviar todo a la nube es prohibitivo. Edge procesa in-situ.
🔒
Privacidad
Datos médicos, biométricos o industriales no pueden salir del edificio. Edge cumple GDPR, HIPAA por diseño: el dato no viaja.
🌐
Conectividad
Drones, satélites, zonas rurales, minas subterráneas: sin conexión. Edge funciona offline, de forma autónoma.
💰
Coste
Cloud compute es caro a escala: una GPU A100 cuesta ~$3/hora. Un acelerador edge cuesta $50-300 una vez y funciona años.
Aspecto ☁️ Cloud 📱 Edge
Latencia50-200ms<1-10ms
ThroughputAlto (GPUs potentes)Limitado (aceleradores pequeños)
PrivacidadDatos salen del dispositivoDatos se quedan locales
ConectividadRequiere internet estableFunciona offline
Coste unitarioBajo (pago por uso)Bajo (CAPEX fijo)
Coste a escalaAlto (OPEX creciente)Bajo (sin costes recurrentes)
Energía100-700W por GPU0.5-30W por dispositivo
ModelosSin restricción de tamañoModelos optimizados/comprimidos
ActualizaciónInmediata (servidor)OTA o manual

¿Por qué Edge AI ahora?

Edge computing para ML no es nuevo, pero tres factores han convergido para hacerlo viable y explosivo:

1
Hardware dedicado barato: NPUs como Hailo-8 (26 TOPS por $70), Google Coral ($60), Jetson Orin Nano ($200). Hace 5 años, estas capacidades costaban miles de dólares.
2
Técnicas de compresión maduras: Quantización INT8/INT4, pruning estructurado, knowledge distillation y NAS permiten reducir modelos 10-100× sin perder precisión significativa.
3
Frameworks de despliegue: TensorRT, TFLite, ONNX Runtime, OpenVINO, VitisAI, HLS4ML — el ecosistema de herramientas es ahora maduro y estable.

Métricas clave en Edge AI

En edge computing, la accuracy no es la única métrica. Hay que optimizar un multi-objetivo:

MétricaUnidadDescripciónObjetivo
TOPSTera-Ops/s Operaciones por segundo del acelerador (INT8 o FP16) ↑ Mayor
TOPS/WTera-Ops/s/Watt Eficiencia energética: rendimiento por vatio consumido ↑ Mayor
Latenciams Tiempo de inferencia extremo-a-extremo ↓ Menor
FPSframes/s Frames procesados por segundo (visión) ↑ Mayor
Potencia (TDP)Watts Consumo energético del sistema ↓ Menor
Tamaño modeloMB Huella en memoria del modelo desplegado ↓ Menor
Accuracy drop% Pérdida de precisión tras optimización ↓ Menor
⚡ La métrica más importante: TOPS/W (eficiencia energética). Un dispositivo alimentado por batería necesita máximo rendimiento con mínimo consumo. Hailo-8: ~3 TOPS/W. Jetson Orin Nano: ~1.3 TOPS/W. Una A100: ~0.4 TOPS/W.

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

2014
Primeros modelos embebidos: SqueezeNet y MobileNet demuestran que se pueden ejecutar CNNs en dispositivos con recursos limitados.
2017
Google Edge TPU / Coral: Primer acelerador de IA dedicado para edge. Apple lanza el Neural Engine en el iPhone X.
2018
NVIDIA Jetson Nano: GPU completa para edge a $99. Intel lanza OpenVINO. TensorFlow Lite se consolida.
2019
Hailo-8 anunciado: NPU de 26 TOPS a 2.5W. Xilinx lanza Vitis AI. ARM introduce NPUs en sus diseños de SoC.
2020
TinyML: Modelos en microcontroladores con TFLite Micro. Xilinx Kria KV260 para visión en edge. NVIDIA Jetson Xavier NX.
2022
NVIDIA Jetson Orin: Hasta 275 TOPS. Hailo-8L para Raspberry Pi. AMD adquiere Xilinx. Qualcomm Cloud AI 100 para inferencia edge.
2024+
NPUs en todas partes: Intel Meteor Lake, Qualcomm Snapdragon X, Apple M4 con 38 TOPS. LLMs pequeños (Phi, Gemma) en edge. Hailo-10H con 40 TOPS.

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:

Flexibilidad → Eficiencia (TOPS/W) → NPU Hailo, Coral FPGA Xilinx Kria GPU Jetson Orin DPU Vitis AI MCU TinyML CPU x86/ARM

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.

🧠 ¿Cómo funciona una NPU?

  1. Compilación offline: La red neuronal se compila a un grafo optimizado para la NPU (fusión de operadores, tiling, scheduling).
  2. Ejecución dataflow: Los datos fluyen por una pipeline de unidades de cálculo especializadas (MAC arrays) sin necesidad de fetch/decode de instrucciones.
  3. 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.

ModeloTOPS (INT8)PotenciaTOPS/WInterfazUso típico
Hailo-826~2.5W~10.4 M.2, PCIeVisión multi-cámara, industria
Hailo-8L13~1.5W~8.7 M.2 (RPi 5)Raspberry Pi AI Kit, IoT
Hailo-10H40~3.5W~11.4 M.2, PCIeMulti-stream, LLMs compactos
Hailo-1520 + ISP~3W~6.7 SoC integradoCámaras inteligentes all-in-one
1
Entrenar en cloud con PyTorch/TensorFlow (modelo FP32 normal).
2
Exportar a ONNX (formato estándar de intercambio).
3
Hailo Dataflow Compiler (DFC): Parsea el ONNX, cuantiza a INT8 con calibración, optimiza el grafo, genera un archivo .hef (Hailo Executable Format).
4
Desplegar con HailoRT: SDK de runtime que carga el .hef en el chip y ejecuta inferencia. APIs en C++, Python.

Otras NPUs relevantes

NPUFabricanteTOPSNotas
Edge TPUGoogle4 Coral Dev Board, USB Accelerator. Solo modelos TFLite cuantizados.
Neural EngineApple38 (M4) Integrado en SoC. CoreML. No accesible como acelerador externo.
NPU Meteor LakeIntel11 Integrado en CPU. OpenVINO. Primera NPU en portátiles x86.
Hexagon NPUQualcomm45 (X Elite) En Snapdragon. Qualcomm AI Engine. Domina en móviles Android.
Ethos-U85ARM4 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.

🎮 La ventaja de Jetson: Si tu modelo funciona en una GPU de escritorio con PyTorch/TensorFlow, funciona en Jetson (con ajustes de optimización). No necesitas herramientas especiales de compilación. Es la opción más flexible.
ModeloGPUTOPS (INT8)RAMTDPPrecio
Jetson Nano (legacy)128-core Maxwell 0.54 GB5-10W~$99
Jetson Orin Nano1024-core Ampere 404/8 GB7-15W~$199
Jetson Orin NX1024-core Ampere 1008/16 GB10-25W~$399
Jetson AGX Orin2048-core Ampere 27532/64 GB15-60W~$999
Jetson Thor (2025)Blackwell 800+Hasta 128 GB~100WTBD

🛠️ 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ético7-60W1.5-3.5W
Caso idealRobótica, multimodeloVisió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.

🔧 ¿Cómo ejecuta una FPGA un modelo de ML?

Hay dos enfoques principales:

  1. 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.
  2. 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:

ModeloFPGACPUAI Perf.InterfazUso típico
Kria KV260Zynq UltraScale+ ZU5EV 4× ARM A53~4.1 TOPS (DPU B4096) MIPI, HDMI, GbEVisión, smart city
Kria KR260Zynq UltraScale+ ZU5EV 4× ARM A53~4.1 TOPS SFP28, TSN GbERobótica, industrial
Kria K24Zynq UltraScale+ ZU3/5 2-4× ARM A53~1-4 TOPS CompactoIoT, 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:

1
Configuras la DPU al diseñar el hardware: número de engines (B512, B1024, B2048, B4096), frecuencia, interfaz de memoria.
2
Sintetizas el diseño con Vivado y generas el bitstream que programa la FPGA.
3
Compilas el modelo con Vitis AI: cuantización INT8 + compilación al instruction set de la DPU → archivo .xmodel.
4
Ejecutas en la DPU con el runtime VART (Vitis AI Runtime). La CPU ARM maneja I/O; la DPU ejecuta las capas del modelo.
⚡ Ventaja clave de las FPGAs: Determinismo temporal. A diferencia de GPUs, una FPGA ejecuta siempre en el mismo tiempo (sin jitter). Crítico para aplicaciones de seguridad funcional: automoción (ISO 26262), aviación (DO-254), sistemas médicos.

Otros aceleradores edge

🐚
Google Coral
Edge TPU de Google: 4 TOPS a 2W. Solo TFLite INT8. Dev Board, USB Accelerator, módulos M.2 y SoM. Muy fácil de usar con Python.
📱
Qualcomm AI Hub
Snapdragon con Hexagon NPU + Adreno GPU + Kryo CPU. Qualcomm AI Engine. Domina en smartphones (>3B dispositivos).
🍓
Raspberry Pi + AI
RPi 5 + Hailo-8L AI Kit = 13 TOPS por ~$100 total. La plataforma edge más accesible para prototipado y educación.
Microcontroladores (TinyML)
ARM Cortex-M, ESP32, Arduino Nicla: modelos <1MB. TFLite Micro. Detección de keywords, anomalías, gestos. <100mW.

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.

Modelo FP32 ~100 MB Pruning ~60 MB Quantize ~25 MB (INT8) Compile Optimizado 📱 Deploy Edge <5ms latencia

Pruning (poda de redes)

Pruning elimina parámetros o estructuras redundantes de una red neuronal. La idea: muchos pesos son cercanos a cero y contribuyen poco a la salida.

✂️
Pruning no-estructurado
Elimina pesos individuales (los pone a cero). Resultado: matrices dispersas (sparse). Problema: la mayoría del hardware no aprovecha sparsity → no hay speedup real sin hardware específico.
🔪
Pruning estructurado
Elimina estructuras completas: filtros de convolución, cabezas de atención, capas enteras. Resultado: modelo más pequeño que se ejecuta rápido en cualquier hardware.
$$\text{Sparsity} = \frac{\text{Nº pesos} = 0}{\text{Nº pesos total}} \times 100\%$$
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.

$$x_q = \text{round}\left(\frac{x}{s}\right) + z \qquad x \approx s \cdot (x_q - z)$$

Donde \(s\) es el scale (factor de escala) y \(z\) es el zero point (offset para mapear el rango).

TipoBitsReducciónAccuracy dropNotas
FP3232 Baseline. Entrenamiento estándar.
FP1616~0% Mixed precision. GPUs modernas (Tensor Cores).
INT88<1% Estándar para edge. Soportado por NPUs, TensorRT, TFLite.
INT441-3% LLMs (GPTQ, AWQ). Requiere calibración cuidadosa.
Binary/Ternary1-216-32×5-15% Investigación. XNOR-Net. Uso en MCUs extremos.

Tipos de cuantización

📸
Post-Training (PTQ)
Cuantiza un modelo ya entrenado. Solo necesita un dataset de calibración (~100-1000 muestras). Rápido, pero puede perder más accuracy.
🏋️
Quantization-Aware Training (QAT)
Simula cuantización durante el entrenamiento. El modelo aprende a ser robusto a la pérdida de precisión. Mejor accuracy, pero requiere reentrenamiento.
🎯
Dynamic Quantization
Pesos cuantizados offline, activaciones cuantizadas en runtime. Sin dataset de calibración. Ideal para modelos NLP (LSTMs, Transformers).
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 sobre qué clases son similares.

$$\mathcal{L} = \alpha \cdot \mathcal{L}_{CE}(y, \hat{y}_s) + (1-\alpha) \cdot T^2 \cdot D_{KL}\!\left( \sigma\!\left(\frac{z_t}{T}\right) \;\|\; \sigma\!\left(\frac{z_s}{T}\right) \right)$$

\(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). Las familias de modelos más usadas en edge fueron diseñadas con NAS:

FamiliaMétodo NASParamsTop-1 ImageNetMFLOPs
MobileNetV3NetAdapt + NAS 2.5-5.4M72-75%56-219
EfficientNet-LiteNAS (compound scaling) 4.7-13M75-80%400-1800
FBNetDifferentiable NAS (DNAS) 4.5M74.9%295
Once-for-All (OFA)Progressive shrinking Variable76-80%Variable
MCUNetTinyNAS + TinyEngine 0.7-1M70.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:

ToolTargetInputOutputOptimizaciones
TensorRTNVIDIA GPU (Jetson) ONNX, PyTorch, TF.engine / .plan Fusión de capas, FP16/INT8, kernel autotuning
TFLiteARM CPU, Edge TPU, NPUs TF SavedModel.tflite Cuantización, delegados HW, XNNPack
ONNX RuntimeMulti-plataforma ONNXRuntime exec Graph optimization, EPs (CUDA, TensorRT, OpenVINO)
OpenVINOIntel CPU/GPU/NPU ONNX, TF, PyTorch.xml + .bin Fusión, cuantización, INT8 NNCF
Hailo DFCHailo NPU ONNX, TF.hef Cuantización INT8, dataflow mapping
Vitis AIAMD/Xilinx DPU PyTorch, TF, Caffe.xmodel Cuantización INT8, compilación a DPU ISA
CoreMLApple 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.

Entrenamiento PyTorch · TF · JAX FP32 model Intercambio ONNX · SavedModel Formato estándar Optimización Quantize + Compile TensorRT · TFLite · VitisAI Hailo DFC · OpenVINO Deploy en Edge Runtime + Hardware Jetson · Hailo · Kria · Coral ⚡ Camino directo: HLS4ML Modelo → RTL → FPGA (sin DPU, HW puro)

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:

1
Importa el modelo: Desde ONNX, PyTorch (torch2trt), TensorFlow (TF-TRT), o la API de builder de TensorRT.
2
Optimiza el grafo: Fusión de capas (Conv+BN+ReLU → 1 kernel), eliminación de operaciones innecesarias, selección de kernels óptimos.
3
Cuantiza (opcional): FP16 (casi sin pérdida), INT8 (con calibración). Usa Tensor Cores cuando están disponibles.
4
Genera engine: Un archivo binario (.engine) optimizado para la GPU específica. No es portable entre diferentes GPUs.
🚀 Speedup típico: TensorRT acelera modelos 2-6× vs PyTorch nativo en la misma GPU. En Jetson, combinar FP16 + fusión de capas puede pasar de 15 FPS a 60+ FPS en YOLOv8.

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).

📱
Android / iOS
Delegado GPU (OpenGL/Metal), NNAPI para NPUs Android.
🐚
Edge TPU (Coral)
Delegado Edge TPU. Solo modelos full INT8. libedgetpu.
🐧
Linux / RPi
XNNPack (SIMD optimizado). Hailo delegado experimental.
TFLite Micro
Microcontroladores: ARM Cortex-M, ESP32. <100KB RAM.

ONNX y ONNX Runtime

ONNX (Open Neural Network Exchange) es el formato estándar de intercambio de modelos. ONNX Runtime es el motor de inferencia de Microsoft que ejecuta modelos ONNX con Execution Providers (EP) para diferentes hardware:

Execution ProviderHardwareVentaja
CPUExecutionProviderCualquier CPUSiempre disponible, baseline
CUDAExecutionProviderNVIDIA GPUAceleración CUDA directa
TensorrtExecutionProviderNVIDIA GPUOptimización TensorRT automática
OpenVINOExecutionProviderIntel CPU/GPU/NPUMejor rendimiento en Intel
QNNExecutionProviderQualcomm NPUSnapdragon, aceleración Hexagon
CoreMLExecutionProviderApple ANENeural 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

  1. Importar modelo desde PyTorch, TF, ONNX (mo Model Optimizer o openvino.convert_model())
  2. Cuantización INT8 con NNCF (Neural Network Compression Framework)
  3. 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:

📊
Quantizer
Cuantización INT8 post-training y QAT. Soporta PyTorch y TensorFlow. Calibración con dataset representativo.
⚙️
Compiler (vai_c)
Compila el modelo cuantizado al instruction set de la DPU objetivo. Genera .xmodel.
🏃
VART Runtime
Vitis AI Runtime: ejecuta .xmodel en la DPU. APIs en C++ y Python. Gestión de buffers DMA.
📚
Model Zoo
~150 modelos pre-optimizados: ResNet, YOLO, EfficientDet, PointPillars, BERT, etc. Listos para desplegar.
# ═══════════════════════════════════════════════
# 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.

🔬 Caso de uso estrella: Física de partículas en el LHC (CERN). El trigger del detector necesita decidir en <1 microsegundo si un evento es interesante. Solo hardware puro en FPGA puede lograr esa latencia. hls4ml nació para este caso de uso.
1
Define el modelo en Keras/PyTorch/ONNX (modelos pequeños: ~10-100 capas).
2
hls4ml convierte cada capa a código HLS (C++ de alto nivel que describe hardware). Configura: paralelismo, precisión de bits (ap_fixed), reuse factor.
3
Vivado HLS sintetiza el código C++ a RTL (Verilog/VHDL). Genera un IP core que se instancia en el diseño FPGA.
4
Resultado: Latencia de nanosegundos a microsegundos (100-1000× más rápido que una GPU). Throughput de ~200 MHz pipeline.
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
ModelosPequeños (< ~1M params)Cualquier tamaño
FlexibilidadPrecisión configurable (ap_fixed)INT8 fijo
ComplejidadAlta (necesitas saber de FPGA)Media (similar a TensorRT)
Caso de usoUltra-baja latencia, cienciaVisió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

  1. Data ingestion: Conecta sensores (acelerómetro, micrófono, cámara) directamente desde el dispositivo.
  2. Signal processing: Bloques de preprocesado (FFT, MFCCs, spectrograms) configurables visualmente.
  3. Training: Modelos pre-configurados (clasificación, detección, anomalías) o custom con Keras.
  4. Deployment: Exportar como librería C++ para Arduino, RPi, STM32, Nordic, o como firmware completo.
PlataformaEnfoqueTargets
Edge ImpulseNo-code/low-code, sensores IoT MCUs (ARM, ESP32), Linux, móvil
Nota AIAutoML para edge, labeling Jetson, Coral, RPi
RoboflowComputer vision end-to-end Jetson, Coral, Luxonis, web
Ultralytics HUBYOLO training + deploy TensorRT, TFLite, ONNX, CoreML

Aplicaciones de Edge AI por sector

🚗
Automoción
ADAS y conducción autónoma: detección de peatones, señales, carriles. Hardware: NVIDIA Drive Orin (254 TOPS), Hailo, Mobileye EyeQ. Requisito: latencia <10ms, seguridad funcional ISO 26262.
🏭
Industria 4.0
Inspección visual de defectos, mantenimiento predictivo, control de calidad. Hardware: Kria KV260, Jetson, cámaras con NPU integrada. Determinismo temporal con FPGAs.
🏥
Salud / Wearables
ECG en smartwatch, detección de caídas, análisis de retina portátil. Hardware: MCUs con TinyML, NPUs en SoCs móviles. Privacidad HIPAA por diseño.
🌾
Agricultura
Detección de plagas con drones, riego inteligente, clasificación de frutos. Hardware: Jetson Nano en drones, Coral en trampas de insectos. Funciona sin conectividad.
🛡️
Seguridad / Smart City
Videovigilancia inteligente: detección de intrusiones, conteo de personas, reconocimiento de matrículas. Procesado local (privacidad). Hardware: Hailo-8, DeepStream en Jetson.
🔬
Ciencia / HEP
Trigger de partículas en el LHC (CERN) con FPGAs + hls4ml. Clasificación en <1µs. También: telescopios, satélites de observación.

Proyectos de Edge AI: clásicos y modernos

🏛️ Proyectos clásicos y fundacionales

ProyectoAñoHardwareLogro
MobileNet (Google)2017Móviles ARM Primera CNN diseñada para edge: depthwise separable convs. 4.2M params, 569 MFLOPs.
SqueezeNet2016CPU embebida Accuracy de AlexNet con 50× menos parámetros (1.2M). Fire modules.
Keyword Spotting (Google)2017Smartphones "OK Google" con modelo de 14KB en DSP dedicado. <1ms latencia, always-on.
hls4ml + LHC Trigger2018Xilinx Virtex-7 Clasificación de jets de partículas en ~75ns en FPGA. Paper en Nature MI.
MCUNet (MIT)2020ARM Cortex-M7 ImageNet en microcontrolador (256KB SRAM). TinyNAS + TinyEngine.

🚀 Proyectos modernos y de referencia

ProyectoAñoHardwareLogro
Llama.cpp2023CPU + GPU edge LLMs (Llama 2/3, Phi) en laptops y RPi. Cuantización GGUF (Q4_K_M).
Whisper on Coral2023Edge TPU Speech-to-text offline en Edge TPU. Modelo whisper-tiny cuantizado.
YOLOv8 on Hailo-82023Hailo-8 (RPi 5) Detección de objetos a 30+ FPS en Raspberry Pi 5 con AI Kit.
NVIDIA Isaac + Jetson2024Jetson Orin Stack de robótica completo: percepción 3D, SLAM, manipulación con GPU edge.
MediaPipe (Google)2019-24Móvil/web Pose estimation, hand tracking, face mesh en tiempo real. Modelos <5MB.
Phi-3 mini on NPU2024Intel/Qualcomm NPU LLM de 3.8B params en NPU de laptop con INT4. ~15 tokens/s local.
Stable Diffusion on Jetson2024Jetson Orin Generación de imágenes en edge: ~5s/imagen en Orin Nano con TensorRT.

Limitaciones y retos del Edge AI

🧩
Fragmentación
Cada hardware tiene su propio toolchain: TensorRT, TFLite, Vitis AI, HailoRT, CoreML... No hay un estándar universal. ONNX ayuda pero no resuelve todo.
📉
Accuracy gap
Cuantización + pruning puede degradar accuracy en modelos complejos. Validación exhaustiva es obligatoria. Especialmente crítico en medicina y automoción.
🔄
Actualización OTA
Actualizar modelos en miles de dispositivos desplegados es complejo: versionado, rollback, A/B testing, validación post-deploy.
🔥
Gestión térmica
Dispositivos edge operan sin ventiladores activos. Throttling térmico puede reducir rendimiento sostenido. Diseño de disipación crítico.
🔒
Seguridad del modelo
El modelo vive en el dispositivo → vulnerable a reverse engineering, model stealing, adversarial attacks físicos. Encriptación y secure boot necesarios.
📊
Monitoring
Sin acceso fácil a métricas en producción. Data drift, model drift, degradación de accuracy. Necesitas telemetría ligera.

Papers y recursos fundamentales

Paper / RecursoAñoContribuciónLink
MobileNets2017 Depthwise separable convolutions arXiv
SqueezeNet2016 AlexNet accuracy with 50× fewer parameters arXiv
EfficientNet2019 Compound scaling (depth × width × resolution) arXiv
MCUNet2020 TinyNAS + TinyEngine for microcontrollers arXiv
hls4ml2018 Fast ML inference on FPGA arXiv · GitHub
Distilling Knowledge2015 Knowledge distillation (Hinton et al.) arXiv
Lottery Ticket Hypothesis2019 Sparse subnetworks match dense accuracy arXiv
GPTQ2022 Post-training quantization for LLMs arXiv
AWQ2023 Activation-aware weight quantization arXiv
TinyML Book2022 Referencia completa de ML en microcontroladores O'Reilly

📚 Recursos adicionales

Widget: selector de hardware edge

Responde unas preguntas sobre tu proyecto y te recomendaremos el hardware edge más adecuado.

🎯 ¿Qué hardware edge necesitas?