在 reComputer RK3576 上使用 Google Coral USB 加速器

Google Coral USB 加速器通过 USB 为主机添加一个 Edge TPU 协处理器。本教程介绍一种经过实测验证的方法,将其连接到 reComputer RK3576,检查 USB 状态,安装 Edge TPU 运行时,运行一个经 Edge TPU 编译的 TensorFlow Lite 模型,并复现一次延迟基准测试。

基准测试范围: 本页结果比较的是 Coral Edge TPU 与八线程 CPU TensorFlow Lite 基线,没有测试 RK3576 内置 NPU。要对比这两种加速器,需要将同一模型和等效的预处理分别通过 Edge TPU 和 RKNN 工具链部署。

测试环境

项目实测配置
主机reComputer RK3576 Dev Kit
操作系统Armbian-unofficial 26.05.0-trunk,Debian 12(bookworm)
内核6.1.115-vendor-seeed-rk3576
主机架构AArch64,8 个逻辑 CPU
加速器Google Coral USB Accelerator
USB 链路USB 3 SuperSpeed,lsusb -t 报告为 5000M
Edge TPU 运行时标准(降频)运行时,libedgetpu.so.1.0

这是进行下列测量时所用的配置,并非对最低支持版本的声明。Coral 的 USB Accelerator 文档将 Debian 系 Armv8 Linux 列为支持平台,并建议使用 USB 3 以获得最佳性能。

硬件连接

请使用 USB 3 主机端口和一条质量良好的线缆。下面的照片展示了实测所用的 reComputer RK3576、Coral USB 加速器和线缆。

reComputer RK3576、Coral USB 加速器和 USB 线缆

将 Coral 连接到 RK3576 的其中一个 USB 3 端口。下方特写展示了实际测试时的连接情况。

连接到 reComputer RK3576 的 Coral USB 加速器

查找并确认 Coral

运行以下命令查找加速器使用的任意一个 USB ID:

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

这些 ID 对应设备的两种正常状态:

USB IDlsusb 中的常见名称含义
1a6e:089aGlobal Unichip Corp.初始 DFU/引导加载程序状态
18d1:9302Google Inc.固件加载后的 Edge TPU 运行状态

检查协商出的 USB 速度:

bash
lsusb -t

对于 USB 3 连接,加速器所在分支应报告 5000M。出现 480M 表示 USB 2。

查看最近的枚举和固件事件:

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

下方截图显示了处于运行模式(18d1:9302)、以 5000M 连接的加速器,dmesg 中可见先前的 DFU 枚举和随后的固件变更消息。

终端截图:Coral USB 检测、USB 3 速度与固件枚举

连接加速器后立即看到 1a6e:089a 属于正常现象。加载 Edge TPU delegate 会加载设备固件,并使其重新枚举为 18d1:9302

安装 Edge TPU 运行时

使用 Coral 的 Linux 软件源并安装标准运行时:

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

如果安装期间加速器已经连接,请拔下并重新插入一次,使新安装的 udev 规则生效。

libedgetpu1-std 使用降低的工作频率。Coral 还提供 libedgetpu1-max 作为最大频率运行时的替代方案,但它会增加功耗,并可能使金属外壳非常烫。这两个运行时软件包不能同时安装。

创建 Python 环境

实测开发板使用 Python 3.11,并直接使用 TensorFlow Lite Python API 而非 PyCoral。创建一个隔离环境并安装示例所需的软件包:

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

验证 Python 能否加载 Edge TPU delegate:

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

该命令应打印一个 TensorFlow Lite delegate 对象。首次访问时它还可能触发设备从 1a6e:089a18d1:9302 的切换。

下载测试资源

创建一个工作目录,下载 Google 配套提供的 Edge TPU 与 CPU 模型以及示例图片:

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 是 Google 公开 google-coral/test_data 仓库中的示例图片,并非为本教程拍摄的照片。Edge TPU 模型已针对该加速器编译,而 model_cpu.tflite 是其不使用 Edge TPU 的 TensorFlow Lite 对应版本。

运行最小 Edge TPU 推理

将以下内容保存为 /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")

在工作目录中运行:

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

可选性能验证

该基准测试对每条路径先执行 10 次预热调用,再执行 100 次计时调用。它只对 Interpreter.invoke() 计时,包括 delegate 执行和相关的宿主-设备通信;不包括模型/delegate 初始化、图像加载和图像缩放。

CPU 路径使用该模型的不带 Edge TPU 的版本并设置 num_threads=8。Edge TPU 与 CPU 模型来自同一套 Google Coral MobileNet V2 iNaturalist 鸟类测试集,两者接收相同的预处理输入张量。

完整的可选测试脚本可通过 benchmark.py 获取。下载上面的三个资源后,将该文件保存或下载到 /tmp/coral-test/benchmark.py

运行基准测试:

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

实测结果

在实测的 RK3576 上的一次运行结果如下:

路径平均延迟中位延迟P95 延迟推算吞吐量
Coral Edge TPU6.202 ms6.193 ms6.344 ms161.23 FPS
CPU,8 线程20.700 ms20.610 ms21.196 ms48.31 FPS

在该次运行中,Coral 路径的平均延迟比八线程 CPU 路径的平均延迟低 3.34x。FPS 值为 1000 / 平均延迟(针对重复的单张图片推理),并不是对完整相机、解码、预处理和显示管线的测量。

终端截图:Coral Edge TPU 与八线程 CPU 基准测试

这些数值来自单台设备和一套软件配置的测量,并非保证的产品规格。频率调节、热状态、后台活动、运行时选择、模型分区和 USB 拓扑都可能改变结果。

注意: 此可选验证仅比较 Coral Edge TPU 与八线程 CPU TensorFlow Lite 路径。它不比较 Coral 与 RK3576 NPU,因为本测试未使用 RK3576 NPU。因此,Coral 的 4 TOPS 和 RK3576 NPU 的 6 TOPS 峰值指标不能说明或预测该结果。

故障排查

  • lsusb 中没有 Coral 条目:重新连接设备,使用确认完好的线缆,换一个 USB 主机端口,并检查 dmesg
  • 设备一直停留在 1a6e:089a:先确认 libedgetpu.so.1.0 能成功加载,然后重新连接加速器并检查 dmesg 中的固件消息。
  • lsusb -t 显示 480M:连接协商到了 USB 2 速度。将加速器移到 USB 3 端口并检查线缆。
  • Failed to load delegate:确认已安装 Edge TPU 运行时,且当前用户可以访问该 USB 设备。
  • 外壳温度过高:使用标准 libedgetpu1-std 运行时并保持通风。最大频率运行时可能变得非常烫。

参考资料