Usar el acelerador USB Google Coral con reComputer RK3576

El acelerador USB Google Coral añade un coprocesador Edge TPU a un host mediante USB. Este tutorial muestra una forma probada de conectarlo a un reComputer RK3576, verificar el estado del USB, instalar el runtime de Edge TPU, ejecutar un modelo TensorFlow Lite compilado para Edge TPU y reproducir un benchmark de latencia.

Alcance del benchmark: el resultado de esta página compara el Edge TPU de Coral con una línea base de TensorFlow Lite en CPU de ocho hilos. No prueba la NPU integrada del RK3576. Comparar ambos aceleradores requiere desplegar el mismo modelo y un preprocesamiento equivalente a través de las cadenas de herramientas de Edge TPU y RKNN.

Entorno de prueba

ElementoConfiguración probada
HostreComputer RK3576 Dev Kit
Sistema operativoArmbian-unofficial 26.05.0-trunk, Debian 12 (bookworm)
Kernel6.1.115-vendor-seeed-rk3576
Arquitectura del hostAArch64, 8 CPU lógicos
AceleradorGoogle Coral USB Accelerator
Enlace USBUSB 3 SuperSpeed, reportado como 5000M por lsusb -t
Runtime de Edge TPURuntime estándar (frecuencia reducida), libedgetpu.so.1.0

Esta es la configuración usada para las mediciones siguientes, no una declaración de versiones mínimas compatibles. La documentación del USB Accelerator de Coral indica que Linux Armv8 derivado de Debian es compatible y recomienda USB 3 para el mejor rendimiento.

Conexión del hardware

Usa un puerto host USB 3 y un cable de buena calidad. Las siguientes fotografías muestran el reComputer RK3576, el acelerador USB Coral y el cable probados.

reComputer RK3576, acelerador USB Coral y cable USB

Conecta el Coral a uno de los puertos USB 3 del RK3576. La siguiente imagen de cerca muestra la conexión real de la prueba.

Acelerador USB Coral conectado al reComputer RK3576

Buscar y verificar el Coral

Ejecuta el siguiente comando para buscar cualquiera de los dos USB ID que usa el acelerador:

bash
lsusb | grep -Ei '1a6e:089a|18d1:9302|Google|Global Unichip'

Los IDs describen dos estados normales del dispositivo:

USB IDNombre típico en lsusbSignificado
1a6e:089aGlobal Unichip Corp.Estado inicial DFU/bootloader
18d1:9302Google Inc.Estado del runtime Edge TPU tras cargar el firmware

Comprueba la velocidad USB negociada:

bash
lsusb -t

Para una conexión USB 3, la rama del acelerador debería reportar 5000M. Una entrada 480M indica USB 2.

Para inspeccionar eventos recientes de enumeración y firmware, ejecuta:

bash
sudo dmesg | grep -E 'device firmware changed|New USB device found' | tail -n 10

La siguiente captura muestra el acelerador en modo runtime como 18d1:9302, conectado a 5000M, con la enumeración DFU previa y los mensajes posteriores de cambio de firmware visibles en dmesg.

Captura del terminal con la detección del Coral USB, la velocidad USB 3 y la enumeración del firmware

Ver 1a6e:089a justo después de conectar el acelerador es normal. Cargar el delegado de Edge TPU puede cargar el firmware del dispositivo y hacer que se reenumere como 18d1:9302.

Instalar el runtime de Edge TPU

Usa el repositorio Linux de Coral e instala el runtime estándar:

bash
echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install libedgetpu1-std

Si el acelerador ya estaba conectado durante la instalación, desconéctalo y vuelve a conectarlo una vez para que la regla udev recién instalada surta efecto.

libedgetpu1-std usa la frecuencia de operación reducida. Coral también ofrece libedgetpu1-max como runtime alternativo de frecuencia máxima, pero aumenta el consumo de energía y puede hacer que la carcasa metálica se caliente mucho. No se pueden instalar los dos paquetes de runtime al mismo tiempo.

Crear el entorno de Python

La placa probada usó Python 3.11 y la API de Python de TensorFlow Lite directamente en lugar de PyCoral. Crea un entorno aislado e instala los paquetes usados por los ejemplos:

bash
sudo apt-get install python3-venv
python3 -m venv /tmp/coral-venv
/tmp/coral-venv/bin/pip install --upgrade pip
/tmp/coral-venv/bin/pip install tflite-runtime opencv-python-headless

Verifica que Python pueda cargar el delegado de Edge TPU:

bash
/tmp/coral-venv/bin/python -c "from tflite_runtime.interpreter import load_delegate; print(load_delegate('libedgetpu.so.1.0'))"

El comando debería imprimir un objeto delegado de TensorFlow Lite. También puede provocar el cambio de 1a6e:089a a 18d1:9302 en el primer acceso.

Descargar los recursos de prueba

Crea un directorio de trabajo y descarga los modelos emparejados de Edge TPU y CPU de Google junto con la imagen de ejemplo:

bash
mkdir -p /tmp/coral-test
cd /tmp/coral-test

curl -fL -o model.tflite \
  https://raw.githubusercontent.com/google-coral/test_data/master/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite
curl -fL -o model_cpu.tflite \
  https://raw.githubusercontent.com/google-coral/test_data/master/mobilenet_v2_1.0_224_inat_bird_quant.tflite
curl -fL -o labels.txt \
  https://raw.githubusercontent.com/google-coral/test_data/master/inat_bird_labels.txt
curl -fL -o parrot.jpg \
  https://raw.githubusercontent.com/google-coral/test_data/master/parrot.jpg

parrot.jpg es la imagen de ejemplo del repositorio público google-coral/test_data de Google; no es una fotografía creada para este tutorial. El modelo de Edge TPU está compilado para el acelerador, mientras que model_cpu.tflite es su contraparte de TensorFlow Lite sin Edge TPU.

Ejecutar una inferencia mínima en Edge TPU

Guarda lo siguiente como /tmp/coral-test/inference.py:

python
import cv2
from tflite_runtime.interpreter import Interpreter, load_delegate

delegate = load_delegate("libedgetpu.so.1.0")
interpreter = Interpreter(
    model_path="model.tflite",
    experimental_delegates=[delegate],
)
interpreter.allocate_tensors()

input_info = interpreter.get_input_details()[0]
image = cv2.cvtColor(cv2.imread("parrot.jpg"), cv2.COLOR_BGR2RGB)
height, width = input_info["shape"][1:3]
tensor = cv2.resize(image, (int(width), int(height))).astype(input_info["dtype"])

interpreter.set_tensor(input_info["index"], tensor[None, ...])
interpreter.invoke()
print("Edge TPU inference completed")

Ejecútalo desde el directorio de trabajo:

bash
cd /tmp/coral-test
/tmp/coral-venv/bin/python inference.py

Verificación opcional del rendimiento

El benchmark realiza 10 invocaciones de calentamiento seguidas de 100 invocaciones cronometradas para cada ruta. Cronometra únicamente Interpreter.invoke(), incluida la ejecución del delegado y la comunicación host-dispositivo asociada. Excluye la inicialización del modelo/delegado, la carga de la imagen y el redimensionado.

La ruta de CPU usa la versión sin Edge TPU del modelo con num_threads=8. Los modelos de Edge TPU y de CPU provienen del mismo conjunto de pruebas de Google Coral MobileNet V2 iNaturalist de aves, y ambos reciben el mismo tensor de entrada preprocesado.

El script completo de prueba opcional está disponible como benchmark.py. Después de descargar los tres recursos anteriores, guárdalo o descárgalo como /tmp/coral-test/benchmark.py.

Ejecuta el benchmark:

bash
cd /tmp/coral-test
/tmp/coral-venv/bin/python benchmark.py

Resultado observado

Una ejecución en el RK3576 probado produjo:

RutaLatencia mediaLatencia medianaLatencia P95Rendimiento derivado
Coral Edge TPU6.202 ms6.193 ms6.344 ms161.23 FPS
CPU, 8 hilos20.700 ms20.610 ms21.196 ms48.31 FPS

En esta ejecución, la latencia media de la ruta Coral fue 3.34x menor que la latencia media de la ruta de CPU de ocho hilos. Los valores de FPS son 1000 / latencia media para inferencias repetidas de una sola imagen; no son mediciones de un pipeline completo de cámara, decodificación, preprocesamiento y visualización.

Captura del terminal con el benchmark del Edge TPU de Coral y la CPU de ocho hilos

Estos valores son una medición de un dispositivo y una configuración de software concretos, no una especificación de producto garantizada. El escalado de frecuencia, el estado térmico, la actividad en segundo plano, la elección del runtime, el particionado del modelo y la topología USB pueden cambiar el resultado.

Nota: Esta comprobación opcional compara únicamente el Coral Edge TPU con la ruta de TensorFlow Lite en CPU con ocho hilos. No compara Coral con la NPU del RK3576, que no se usa en esta prueba. Por tanto, las cifras máximas de 4 TOPS de Coral y 6 TOPS de la NPU del RK3576 no describen ni predicen este resultado.

Solución de problemas

  • No hay entrada de Coral en lsusb: reconecta el dispositivo, usa un cable que se sepa que funciona, prueba otro puerto host USB e inspecciona dmesg.
  • El dispositivo permanece en 1a6e:089a: primero verifica que libedgetpu.so.1.0 carga correctamente. Luego reconecta el acelerador e inspecciona los mensajes de firmware en dmesg.
  • 480M en lsusb -t: la conexión negoció a velocidad USB 2. Mueve el acelerador a un puerto USB 3 y comprueba el cable.
  • Failed to load delegate: verifica que el runtime de Edge TPU está instalado y que el usuario actual puede acceder al dispositivo USB.
  • Temperatura de la carcasa alta: usa el runtime estándar libedgetpu1-std y mantén el flujo de aire. El runtime de frecuencia máxima puede calentarse mucho.

Referencias