Google Coral USB Accelerator mit dem reComputer RK3576 verwenden

Der Google Coral USB Accelerator fügt einem Host über USB einen Edge-TPU-Coprozessor hinzu. Dieses Tutorial zeigt einen getesteten Weg, ihn an einem reComputer RK3576 anzuschließen, den USB-Zustand zu prüfen, die Edge-TPU-Runtime zu installieren, ein für die Edge TPU kompiliertes TensorFlow-Lite-Modell auszuführen und einen Latenz-Benchmark zu reproduzieren.

Benchmark-Umfang: Das Ergebnis auf dieser Seite vergleicht die Coral Edge TPU mit einer Acht-Thread-CPU-TensorFlow-Lite-Baseline. Es testet nicht das integrierte NPU des RK3576. Ein Vergleich der beiden Beschleuniger erfordert dasselbe Modell und ein äquivalentes Preprocessing, das über beide Toolchains (Edge TPU und RKNN) deployed wird.

Testumgebung

PunktGetestete Konfiguration
HostreComputer RK3576 Dev Kit
BetriebssystemArmbian-unofficial 26.05.0-trunk, Debian 12 (bookworm)
Kernel6.1.115-vendor-seeed-rk3576
Host-ArchitekturAArch64, 8 logische CPUs
BeschleunigerGoogle Coral USB Accelerator
USB-VerbindungUSB 3 SuperSpeed, von lsusb -t als 5000M gemeldet
Edge-TPU-RuntimeStandard-Runtime (reduzierte Frequenz), libedgetpu.so.1.0

Dies ist die für die folgenden Messungen verwendete Konfiguration, keine Aussage über minimal unterstützte Versionen. Die Dokumentation des Coral USB Accelerator listet Debian-basiertes Armv8-Linux als unterstützt und empfiehlt USB 3 für beste Leistung.

Hardware-Anschluss

Verwenden Sie einen USB-3-Hostport und ein hochwertiges Kabel. Die folgenden Fotos zeigen den getesteten reComputer RK3576, den Coral USB Accelerator und das Kabel.

reComputer RK3576, Coral USB Accelerator und USB-Kabel

Schließen Sie den Coral an einen der USB-3-Ports des RK3576 an. Die Nahaufnahme unten zeigt die tatsächliche Testverbindung.

An den reComputer RK3576 angeschlossener Coral USB Accelerator

Coral finden und verifizieren

Führen Sie den folgenden Befehl aus, um nach einer der beiden vom Beschleuniger verwendeten USB-IDs zu suchen:

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

Die IDs beschreiben zwei normale Gerätezustände:

USB-IDTypischer lsusb-NameBedeutung
1a6e:089aGlobal Unichip Corp.Anfangszustand DFU/Bootloader
18d1:9302Google Inc.Edge-TPU-Runtime-Zustand nach dem Laden der Firmware

Prüfen Sie die ausgehandelte USB-Geschwindigkeit:

bash
lsusb -t

Bei einer USB-3-Verbindung sollte der Zweig des Beschleunigers 5000M melden. Ein Eintrag 480M deutet auf USB 2 hin.

Um aktuelle Enumerations- und Firmware-Ereignisse zu prüfen, führen Sie aus:

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

Der echte Screenshot unten zeigt den getesteten Beschleuniger im Runtime-Modus als 18d1:9302, verbunden mit 5000M, wobei die frühere DFU-Enumeration und die anschließenden Firmware-Wechsel-Meldungen in dmesg sichtbar sind.

Terminal-Screenshot mit Coral-USB-Erkennung, USB-3-Geschwindigkeit und Firmware-Enumeration

1a6e:089a direkt nach dem Anschließen des Beschleunigers zu sehen ist normal. Das Laden des Edge-TPU-Delegates kann die Geräte-Firmware laden und bewirken, dass er sich als 18d1:9302 neu enumeriert.

Die Edge-TPU-Runtime installieren

Verwenden Sie das Linux-Repository von Coral und installieren Sie die Standard-Runtime:

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

Wenn der Beschleuniger während der Installation bereits angeschlossen war, ziehen Sie ihn einmal ab und stecken ihn wieder ein, damit die neu installierte udev-Regel wirksam wird.

libedgetpu1-std verwendet die reduzierte Betriebsfrequenz. Coral bietet außerdem libedgetpu1-max als alternative Runtime mit maximaler Frequenz an, aber sie erhöht den Stromverbrauch und kann das Metallgehäuse sehr heiß machen. Die beiden Runtime-Pakete können nicht gleichzeitig installiert werden.

Die Python-Umgebung erstellen

Das getestete Board verwendete Python 3.11 und die TensorFlow-Lite-Python-API direkt statt PyCoral. Erstellen Sie eine isolierte Umgebung und installieren Sie die von den Beispielen verwendeten Pakete:

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

Prüfen Sie, ob Python das Edge-TPU-Delegate laden kann:

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

Der Befehl sollte ein TensorFlow-Lite-Delegate-Objekt ausgeben. Beim ersten Zugriff kann er auch den Wechsel von 1a6e:089a zu 18d1:9302 auslösen.

Die Test-Assets herunterladen

Erstellen Sie ein Arbeitsverzeichnis und laden Sie Googles gepaarte Edge-TPU- und CPU-Modelle sowie das Beispielbild herunter:

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 ist das Beispielbild aus Googles öffentlichem google-coral/test_data-Repository; es ist kein für dieses Tutorial aufgenommenes Foto. Das Edge-TPU-Modell wurde für den Beschleuniger kompiliert, während model_cpu.tflite das entsprechende TensorFlow-Lite-Gegenstück ohne Edge TPU ist.

Eine minimale Edge-TPU-Inferenz ausführen

Speichern Sie Folgendes als /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")

Führen Sie es im Arbeitsverzeichnis aus:

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

Optionale Leistungsüberprüfung

Der Benchmark führt für jeden Pfad 10 Warm-up-Aufrufe gefolgt von 100 zeitgemessenen Aufrufen aus. Er misst nur Interpreter.invoke(), einschließlich der Delegate-Ausführung und der zugehörigen Host-Gerät-Kommunikation. Initialisierung von Modell/Delegate, Bildladen und Bildskalierung sind ausgeschlossen.

Der CPU-Pfad verwendet die Nicht-Edge-TPU-Version des Modells mit num_threads=8. Die Edge-TPU- und CPU-Modelle stammen aus demselben Google-Coral-MobileNet-V2-iNaturalist-Vogel-Testset und erhalten beide denselben vorverarbeiteten Eingabetensor.

Das vollständige optionale Testskript ist als benchmark.py verfügbar. Speichern oder laden Sie es nach dem Herunterladen der drei oben genannten Ressourcen unter /tmp/coral-test/benchmark.py herunter.

Führen Sie den Benchmark aus:

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

Beobachtetes Ergebnis

Ein Durchlauf auf dem getesteten RK3576 ergab:

PfadMittlere LatenzMedian-LatenzP95-LatenzAbgeleiteter Durchsatz
Coral Edge TPU6.202 ms6.193 ms6.344 ms161.23 FPS
CPU, 8 Threads20.700 ms20.610 ms21.196 ms48.31 FPS

In diesem Durchlauf war die mittlere Latenz des Coral-Pfads 3.34x niedriger als die mittlere Latenz des Acht-Thread-CPU-Pfads. Die FPS-Werte sind 1000 / mittlere Latenz für wiederholte Einzelbild-Inferenz; sie sind keine Messungen einer vollständigen Kamera-, Dekodier-, Vorverarbeitungs- und Anzeige-Pipeline.

Terminal-Screenshot mit dem Coral-Edge-TPU- und Acht-Thread-CPU-Benchmark

Diese Werte sind eine Messung von einem Gerät und einer Softwarekonfiguration, keine garantierte Produktspezifikation. Frequenzskalierung, thermischer Zustand, Hintergrundaktivität, Runtime-Wahl, Modellpartitionierung und USB-Topologie können das Ergebnis verändern.

Hinweis: Diese optionale Prüfung vergleicht nur den Coral Edge TPU mit dem TensorFlow-Lite-CPU-Pfad mit acht Threads. Sie vergleicht Coral nicht mit der RK3576-NPU, die in diesem Test nicht verwendet wird. Die Spitzenwerte von 4 TOPS für Coral und 6 TOPS für die RK3576-NPU beschreiben oder prognostizieren dieses Ergebnis daher nicht.

Fehlerbehebung

  • Kein Coral-Eintrag in lsusb: Gerät neu anschließen, ein nachweislich funktionierendes Kabel verwenden, einen anderen USB-Hostport probieren und dmesg prüfen.
  • Gerät bleibt bei 1a6e:089a: zuerst verifizieren, dass libedgetpu.so.1.0 erfolgreich lädt. Dann den Beschleuniger neu anschließen und die Firmware-Meldungen in dmesg prüfen.
  • 480M in lsusb -t: Die Verbindung hat auf USB-2-Geschwindigkeit verhandelt. Den Beschleuniger an einen USB-3-Port verschieben und das Kabel prüfen.
  • Failed to load delegate: verifizieren, dass die Edge-TPU-Runtime installiert ist und der aktuelle Benutzer auf das USB-Gerät zugreifen kann.
  • Hohe Gehäusetemperatur: die Standard-Runtime libedgetpu1-std verwenden und für Luftzirkulation sorgen. Die Runtime mit maximaler Frequenz kann sehr heiß werden.

Referenzen