De Google Coral USB-accelerator gebruiken met de reComputer RK3576

De Google Coral USB-accelerator voegt via USB een Edge TPU-coprocessor toe aan een host. Deze tutorial laat een geteste manier zien om hem op een reComputer RK3576 aan te sluiten, de USB-status te controleren, de Edge TPU-runtime te installeren, een voor de Edge TPU gecompileerd TensorFlow Lite-model uit te voeren en een latencybenchmark te reproduceren.

Benchmarkbereik: het resultaat op deze pagina vergelijkt de Coral Edge TPU met een TensorFlow Lite-baseline op de CPU met acht threads. De ingebouwde NPU van de RK3576 wordt niet getest. Om beide acceleratoren te vergelijken moet hetzelfde model met gelijkwaardige preprocessing via zowel de Edge TPU- als de RKNN-toolchain worden ingezet.

Testomgeving

OnderdeelGeteste configuratie
HostreComputer RK3576 Dev Kit
BesturingssysteemArmbian-unofficial 26.05.0-trunk, Debian 12 (bookworm)
Kernel6.1.115-vendor-seeed-rk3576
HostarchitectuurAArch64, 8 logische CPU's
AcceleratorGoogle Coral USB Accelerator
USB-verbindingUSB 3 SuperSpeed, gerapporteerd als 5000M door lsusb -t
Edge TPU-runtimeStandaard (verlaagde frequentie) runtime, libedgetpu.so.1.0

Dit is de configuratie die voor de onderstaande metingen is gebruikt, geen uitspraak over minimaal ondersteunde versies. De documentatie van de Coral USB Accelerator vermeldt dat van Debian afgeleid Armv8-Linux wordt ondersteund en raadt USB 3 aan voor de beste prestaties.

Hardwareaansluiting

Gebruik een USB 3-hostpoort en een kabel van goede kwaliteit. De volgende foto's tonen de geteste reComputer RK3576, Coral USB-accelerator en kabel.

reComputer RK3576, Coral USB-accelerator en USB-kabel

Sluit de Coral aan op een van de USB 3-poorten van de RK3576. Onderstaande close-up toont de daadwerkelijke testaansluiting.

Coral USB-accelerator aangesloten op de reComputer RK3576

De Coral vinden en verifiëren

Voer het volgende commando uit om naar een van de twee USB-ID's te zoeken die de accelerator gebruikt:

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

De ID's beschrijven twee normale toestanden van het apparaat:

USB-IDTypische lsusb-naamBetekenis
1a6e:089aGlobal Unichip Corp.Initiële DFU/bootloader-toestand
18d1:9302Google Inc.Edge TPU-runtime-toestand na laden van firmware

Controleer de onderhandelde USB-snelheid:

bash
lsusb -t

Bij een USB 3-verbinding moet de tak van de accelerator 5000M rapporteren. Een 480M-item duidt op USB 2.

Om recente enumeratie- en firmware-gebeurtenissen te bekijken, voer uit:

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

Onderstaande echte screenshot toont de geteste accelerator in runtime-modus als 18d1:9302, verbonden op 5000M, met de eerdere DFU-enumeratie en de daaropvolgende firmware-wijzigingsberichten zichtbaar in dmesg.

Terminalscreenshot met Coral USB-detectie, USB 3-snelheid en firmware-enumeratie

1a6e:089a direct na het aansluiten van de accelerator zien is normaal. Het laden van de Edge TPU-delegate kan de firmware van het apparaat laden en ervoor zorgen dat hij opnieuw enumerreert als 18d1:9302.

De Edge TPU-runtime installeren

Gebruik de Linux-repository van Coral en installeer de standaardruntime:

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

Als de accelerator al was aangesloten tijdens de installatie, koppel hem eenmalig los en sluit hem opnieuw aan, zodat de net geïnstalleerde udev-regel in werking treedt.

libedgetpu1-std gebruikt de verlaagde bedrijfsfrequentie. Coral biedt ook libedgetpu1-max aan als alternatieve runtime met maximale frequentie, maar die verhoogt het stroomverbruik en kan de metalen behuizing erg heet maken. De twee runtimepakketten kunnen niet tegelijk geïnstalleerd worden.

De Python-omgeving aanmaken

Het geteste board gebruikte Python 3.11 en de TensorFlow Lite Python-API direct in plaats van PyCoral. Maak een geïsoleerde omgeving aan en installeer de door de voorbeelden gebruikte pakketten:

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

Controleer of Python de Edge TPU-delegate kan laden:

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

Het commando zou een TensorFlow Lite-delegate-object moeten printen. Bij eerste toegang kan het ook de overgang van 1a6e:089a naar 18d1:9302 veroorzaken.

De testassets downloaden

Maak een werkmap aan en download Google's gepaarde Edge TPU- en CPU-modellen plus de voorbeeldafbeelding:

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 is de voorbeeldafbeelding uit Google's openbare google-coral/test_data-repository; het is geen foto die voor deze tutorial is gemaakt. Het Edge TPU-model is gecompileerd voor de accelerator, terwijl model_cpu.tflite het TensorFlow Lite-tegenhanger zonder Edge TPU is.

Een minimale Edge TPU-inferentie uitvoeren

Sla het volgende op 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")

Voer het uit vanuit de werkmap:

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

Optionele prestatieverificatie

De benchmark voert per pad 10 warm-up-aanroepen uit, gevolgd door 100 getimede aanroepen. Hij timet alleen Interpreter.invoke(), inclusief de uitvoering van de delegate en de bijbehorende host-apparaatcommunicatie. Initialisatie van model/delegate, het laden van de afbeelding en het schalen van de afbeelding zijn uitgesloten.

Het CPU-pad gebruikt de niet-Edge TPU-versie van het model met num_threads=8. De Edge TPU- en CPU-modellen komen uit dezelfde Google Coral MobileNet V2 iNaturalist vogel-testset en krijgen beiden dezelfde voorverwerkte invoertensor.

Het volledige optionele testscript is beschikbaar als benchmark.py. Sla het na het downloaden van de drie bovenstaande assets op als /tmp/coral-test/benchmark.py, of download het daarnaar.

Voer de benchmark uit:

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

Waargenomen resultaat

Eén run op de geteste RK3576 leverde op:

PadGemiddelde latencyMediaan-latencyP95-latencyAfgeleide doorvoer
Coral Edge TPU6.202 ms6.193 ms6.344 ms161.23 FPS
CPU, 8 threads20.700 ms20.610 ms21.196 ms48.31 FPS

In deze run was de gemiddelde latency van het Coral-pad 3.34x lager dan de gemiddelde latency van het acht-threads-CPU-pad. De FPS-waarden zijn 1000 / gemiddelde latency voor herhaalde inferentie van één afbeelding; het zijn geen metingen van een volledige pipeline voor camera, decodering, voorverwerking en weergave.

Terminalscreenshot met de Coral Edge TPU- en acht-threads-CPU-benchmark

Deze waarden zijn een meting van één apparaat en één softwareconfiguratie, geen gegarandeerde productspecificatie. Frequentieschaling, thermische toestand, achtergrondactiviteit, runtimekeuze, modelpartitionering en USB-topologie kunnen het resultaat veranderen.

Opmerking: Deze optionele controle vergelijkt alleen de Coral Edge TPU met het TensorFlow Lite-CPU-pad met acht threads. Coral wordt niet vergeleken met de RK3576-NPU, die in deze test niet wordt gebruikt. De piekcijfers van 4 TOPS voor Coral en 6 TOPS voor de RK3576-NPU beschrijven of voorspellen dit resultaat daarom niet.

Problemen oplossen

  • Geen Coral-item in lsusb: sluit het apparaat opnieuw aan, gebruik een kabel waarvan bekend is dat hij werkt, probeer een andere USB-hostpoort en bekijk dmesg.
  • Apparaat blijft op 1a6e:089a: verifieer eerst dat libedgetpu.so.1.0 succesvol laadt. Sluit vervolgens de accelerator opnieuw aan en bekijk de firmwareberichten in dmesg.
  • 480M in lsusb -t: de verbinding onderhandelde op USB 2-snelheid. Verplaats de accelerator naar een USB 3-poort en controleer de kabel.
  • Failed to load delegate: verifieer dat de Edge TPU-runtime is geïnstalleerd en dat de huidige gebruiker toegang heeft tot het USB-apparaat.
  • Hoge behuizingstemperatuur: gebruik de standaardruntime libedgetpu1-std en zorg voor luchtstroom. De runtime met maximale frequentie kan erg heet worden.

Referenties