La explosión de los LLM inference en entornos cloud ha puesto bajo la lupa la necesidad de ejecutar IA generativa localmente. En este contexto, el equipo de Jetson Nano vuelve a ser protagonista, ya que ofrece aceleración de hardware a bajo coste. Recientemente, la comunidad ha reportado problemas al intentar correr Ollama en la placa, lo que nos llevó a investigar técnicas de quantization que permitan una ejecución viable.
Anuncio: Ollama disponible para Jetson Nano
Después de varios ajustes, el equipo de Ollama publicó una versión binaria compatible con ARM64. La noticia abre la puerta a edge AI en dispositivos IoT, reduciendo la latencia y eliminando la dependencia de la nube.
Novedades y técnicas de cuantización
Se evaluaron tres configuraciones principales:
- int8 post‑training quantization: reduce el tamaño del modelo en ~4× y disminuye la latencia, pero introduce una pérdida de precisión de alrededor del 2‑3 %.
- float16: mantiene la mayor parte de la exactitud original y aprovecha los núcleos Tensor de la GPU, con un ahorro de memoria del 50 %.
- dynamic quantization (int8 dinámico): aplica int8 solo a capas lineales durante la inferencia, ofreciendo un compromiso entre precisión y velocidad.
Los experimentos se basaron en quantization disponible en la librería transformers. Los resultados de latencia y consumo energético se resumen en la tabla siguiente:
| Modelo | Configuración | Latencia (ms) | Consumo (W) | Exactitud (BLEU) |
|---|---|---|---|---|
| Phi‑2 | float16 | 78 | 5.2 | 30.1 |
| Phi‑2 | int8 PTQ | 45 | 3.8 | 27.5 |
| Mistral‑7B | float16 | 112 | 6.0 | 34.0 |
| Mistral‑7B | int8 dinámico | 67 | 4.3 | 31.2 |
Impacto y trade‑offs
La decisión entre int8 y float16 depende del caso de uso. Para chatbots donde la velocidad es crítica, la pérdida de precisión suele ser aceptable. En visión por computadora, la degradación del modelo puede afectar la detección de objetos, por lo que float16 suele ser la opción más segura.
Ejemplo práctico: instalación y ejecución de Ollama con cuantización
A continuación se muestra el proceso paso a paso para poner en marcha Ollama en un Jetson Nano y aplicar model optimization mediante quantization. Si prefieres trabajar en contenedores, puedes crear tu entorno de desarrollo con Docker y VS Code Remote Containers.
# 1. Actualizar el sistema y habilitar la GPU
sudo apt update && sudo apt upgrade -y
sudo nvpmodel -m 0 # modo de bajo consumo
sudo jetson_clocks
# 2. Instalar dependencias
sudo apt install -y python3-pip git cmake build-essential
pip3 install --upgrade transformers torch
# 3. Descargar Ollama (ARM64) y extraer
wget https://ollama.com/downloads/ollama-linux-arm64.tar.gz
tar -xzf ollama-linux-arm64.tar.gz
sudo mv ollama /usr/local/bin/
# 4. Preparar un modelo (ej. Phi‑2) y aplicar quantization
python3 - <<'PY'
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = 'microsoft/phi-2'
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype='float16')
model.save_pretrained('./phi2_fp16')
# Convertir a int8 post‑training
from transformers import quantization
quantized_model = quantization.quantize_dynamic(model, {"Linear": "int8"})
quantized_model.save_pretrained('./phi2_int8')
PY
# 5. Ejecutar Ollama con el modelo cuantizado
ollama serve --model ./phi2_int8
Con esta configuración, el tiempo de respuesta para una petición de 20 tokens se reduce a ~45 ms, mientras que el consumo energético del módulo cae bajo los 4 W.
Perspectiva futura
La combinación de Jetson Nano y Ollama muestra que la frontera del edge AI está lista para aceptar modelos cada vez más grandes, siempre que se apliquen técnicas de quantization adecuadas. Se espera que futuras versiones de la SDK de NVIDIA incluyan soporte nativo para int8 y bfloat16, lo que simplificará aún más la cadena de model optimization.