Qualcomm Dragonwing RB3 Gen 2(QCS6490)上で YOLOv11-N を測りました。測定は Qualcomm AI Hub の実機ワークベンチです。同じモデル・同じチップでも、通したランタイム経路によって 134.7 ms にも 5.03 ms にもなります。「動いた」だけでは何も分かりません。失敗した 4 経路を含む全 6 経路を公開します。
6 つの経路
| # | 経路 | 結果 | レイヤ配置 |
|---|---|---|---|
| 1 | TFLite(デフォルト) | 134.7 ms | 343 層中 NPU は 19 層のみ、GPU 168 層、CPU 156 層 |
| 2 | Precompiled QNN、FP32 | 拒否 | このデバイスは量子化 I/O が必須で、float モデルは入れない |
| 3 | Precompiled QNN、w8a16 QDQ | 変換失敗 | サーバは exit code 14 だけを返し、手がかりなし |
| 4 | QNN DLC、FP32 | コンパイル成功、実機で失敗 | QnnModel_composeGraphsFromDlc: MODEL_GRAPH_ERROR |
| 5 | Precompiled QNN、w8a8 QDQ | 5.03 ms | 341 層すべて NPU |
| 6 | Galaxy S25(対照)、TFLite と QNN | どちらも約 2.9 ms | すべて NPU |
失敗側の注記こそ本題です。
- 経路 1 が一番危ない。「動く」のです。ただ、ネットワークの大半を GPU と CPU で静かに実行しているだけ。レイヤ別プロファイルを見なければ、「RB3 Gen 2 の YOLOv11-N は 134.7 ms」と記録して終わっていたところでした。
- 経路 3 は道標のない行き止まりです。コンテキストバイナリ変換が終了コードだけを返します。上流に issue を立てました(qualcomm/ai-hub-models#364)。同じ壁に当たった方はそちらを。
- 経路 4 は古典です。「コンパイルできた」は「動く」ではありません。グラフ構成は実機側の別の関門で、そこで落ちます。
- 経路 6 が対照として効きます。フラッグシップスマホではデフォルトの TFLite デリゲートでも全層 NPU に落ちます。壊れているのはエッジ SoC 側のデフォルト経路であって、モデルでも TFLite 全般でもありません。
持ち帰るルール
経路の書かれていないレイテンシは計測ではありません。 ランタイム、精度、レイヤ配置は数字の一部です。「NPU が遅い」と「NPU に仕事が渡っていない」を区別できる証拠はレイヤ別プロファイルだけで、この二つでは結論(チップを変えるか、書き出し設定を変えるか)が真逆になります。
Rockchip のボードでも同じ病気を繰り返し見ています。RKNN モデルが演算子単位で静かに CPU へフォールバックするやつです。ベンダもツールチェーンも違うのに、失敗の形は同一——デフォルト経路は楽観的で、プロファイルは嘘をつきません。
エッジ AI のベンチマークを公開するなら、数字と一緒に経路を書いてください。書かれていないベンチマークを読むときは、何が隠れている可能性があるか、これで見当がつくはずです。