reComputer RK3576 で Google Coral USB アクセラレータを使用する

Google Coral USB アクセラレータは、USB 経由でホストに Edge TPU コプロセッサを追加します。このチュートリアルでは、reComputer RK3576 に接続し、USB 状態を確認し、Edge TPU ランタイムをインストールし、Edge TPU 向けにコンパイルされた TensorFlow Lite モデルを実行し、レイテンシベンチマークを再現する、実測済みの手順を紹介します。

ベンチマークの範囲: このページの結果は、Coral Edge TPU と 8 スレッド CPU の TensorFlow Lite ベースラインを比較したものです。RK3576 の内蔵 NPU はテストしていません。2 つのアクセラレータを比較するには、同じモデルと同等の前処理を 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 -t5000M と報告
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 の検出と確認

次のコマンドを実行して、アクセラレータが使用する 2 つの USB ID のいずれかを探します:

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

これらの ID はデバイスの 2 つの通常状態を表します:

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 デリゲートをロードするとデバイスファームウェアがロードされ、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 も提供していますが、消費電力が増え、金属筐体が非常に熱くなることがあります。2 つのランタイムパッケージを同時にインストールすることはできません。

Python 環境の作成

テストしたボードでは Python 3.11 を使用し、PyCoral ではなく TensorFlow Lite Python API を直接使用しました。分離された環境を作成し、サンプルで使用するパッケージをインストールします:

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 デリゲートをロードできることを確認します:

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

このコマンドは TensorFlow Lite デリゲートオブジェクトを出力するはずです。初回アクセス時に 1a6e:089a から 18d1: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() のみで、デリゲートの実行と関連するホスト-デバイス間通信を含みます。モデル/デリゲートの初期化、画像の読み込み、リサイズは除外されます。

CPU パスは Edge TPU を使わないバージョンのモデルを num_threads=8 で使用します。Edge TPU モデルと CPU モデルは同じ Google Coral MobileNet V2 iNaturalist 鳥類テストセット由来で、どちらも同じ前処理済み入力テンソルを受け取ります。

完全な任意テストスクリプトは benchmark.py として利用できます。上記の 3 つのリソースをダウンロードした後、/tmp/coral-test/benchmark.py として保存またはダウンロードしてください。

ベンチマークを実行します:

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

観測された結果

テストした RK3576 での 1 回の実行結果:

パス平均レイテンシ中央値レイテンシP95 レイテンシ導出スループット
Coral Edge TPU6.202 ms6.193 ms6.344 ms161.23 FPS
CPU(8 スレッド)20.700 ms20.610 ms21.196 ms48.31 FPS

この実行では、Coral パスの平均レイテンシは 8 スレッド CPU パスの平均レイテンシより 3.34x 低かった。FPS 値は繰り返し行われる単一画像推論の 1000 / 平均レイテンシ であり、カメラ、デコード、前処理、表示を含む完全なパイプラインの測定値ではありません。

Coral Edge TPU と 8 スレッド CPU のベンチマークを示す端末スクリーンショット

これらの値は 1 台のデバイスと 1 つのソフトウェア構成からの測定値であり、保証された製品仕様ではありません。周波数スケーリング、熱状態、バックグラウンドアクティビティ、ランタイムの選択、モデルのパーティショニング、USB トポロジは結果を変える可能性があります。

注記: この任意の確認は、Coral Edge TPU と 8 スレッドの CPU TensorFlow Lite パスのみを比較します。このテストでは RK3576 NPU を使用していないため、Coral と RK3576 NPU の比較ではありません。したがって、Coral の 4 TOPS と RK3576 NPU の 6 TOPS というピーク値は、この結果を説明または予測するものではありません。

トラブルシューティング

  • lsusb に Coral のエントリがない:デバイスを再接続し、正常に動作するケーブルを使用し、別の USB ホストポートを試し、dmesg を確認します。
  • デバイスが 1a6e:089a のまま:まず libedgetpu.so.1.0 が正常にロードできることを確認します。次にアクセラレータを再接続し、dmesg のファームウェアメッセージを確認します。
  • lsusb -t480M:接続が USB 2 速度でネゴシエートされています。アクセラレータを USB 3 ポートに移動し、ケーブルを確認してください。
  • Failed to load delegate:Edge TPU ランタイムがインストールされており、現在のユーザーが USB デバイスにアクセスできることを確認します。
  • 筐体の温度が高い:標準の libedgetpu1-std ランタイムを使用し、通風を確保してください。最大周波数ランタイムは非常に熱くなることがあります。

参考資料