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.
☁️ → 📱 El espectro Cloud-Edge
No es binario. Existe un continuo entre la nube y el dispositivo:
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:
| 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, pero tres factores han convergido para hacerlo viable y explosivo:
Métricas clave en Edge AI
En edge computing, la accuracy no es la única métrica. Hay que optimizar un multi-objetivo:
| 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:
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?
- 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.
| 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.
🔧 ¿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: muchos pesos son cercanos a cero y contribuyen poco a la salida.
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.
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 sobre qué clases son similares.
\(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:
| 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.
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:
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).
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 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.
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
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
Papers y recursos fundamentales
| 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 |
| 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
Widget: selector de hardware edge
Responde unas preguntas sobre tu proyecto y te recomendaremos el hardware edge más adecuado.