Darknet YOLOv3で組込ベンチマーク環境構築

既に情報は多く、今更感もあるが、Darknet YOLO v3 で組込ベンチマーク環境を構築する手順をメモする。

目的:
AI処理を使っての、組込CPUでのオフロード(CPU負荷外出し)効果を検証するための環境構築手順を確立する。

オフロード先候補(興味無い順):
 ・GPU
 ・Neon 演算コプロセッサ
 ・RTプロセッサ(Xilinx MPSoC RPU)
 ・FPGAプロセッサ(Microbrase, Nios)
 ・FPGA

まずは、私のホビーマシン(Core i7-4790 @3.60GHz / 16GB MEM / ubuntu 5.0.0-36-lowlatency)で検証する。あっさり5行、3分で終わってしまう。

git clone https://github.com/pjreddie/darknet
cd darknet
git checkout <hash値> ## 特定のコミットを使う場合
make
wget https://pjreddie.com/media/files/yolov3.weights  ## 80の物体を識別する重みファイル
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

備考:重みファイルはCOCO という規格に基く80 thing classes の学習データと思われる。

結果:

Loading weights from yolov3.weights...Done!
data/dog.jpg: Predicted in 18.518765 seconds.
dog: 100%
truck: 92%
bicycle: 99%

f:id:t0a9n9a4k:20191104163729j:plain:w220:left
predictions.jpgが結果を示す画像。AI初心者向け資料では高確率で登場するワンちゃんのようです。名前は何かな?
犬・自転車・トラックを認識するまでの時間:
 18〜21秒 (dog: 100%)/ Darknet hash:61c9d02
 7〜9秒 (dog: 99%)/ Darknet hash:f6d8617
* Kernelのバージョンアップで数値が少し変わるケースがある。

考察:
sudo chrt -r 50 ./darknet detect ... (ラウンドロビンで優先度増)で実行すると、数値が悪化かつ不安定となるのは興味深い。AI処理が直線的なのか?今回使ったUbuntu StodioはLow Latency (CONFIG_PREEMPT)がデフォルトで、メディアのリアルタイム処理には向いているが、AIの推論処理とは相性が悪い可能性が高い。
また、Darknetのコミットによって結果が大きく変わる様子を見ると、これは、オフロード実装の工夫や調整を頑張った分だけ成果になる感じがする。つまり、純粋にオフロードのトレードオフ評価を行うのは困難であり、適用先・条件等を狭くを絞った上でトレードオフしないと、意味が無さそう。

感想:
やばい、やばすぎる。時代に乗り遅れた感MAX!! CPU負荷の動きを見ていると改善余地が有りそうにも見えたが、そのネタも既にMakefile冒頭に仕込まれていた。。。_| ̄|◯

フォロー:
ガートナーのハイプ・サイクルによれば、エッジAI、まだ黎明期を脱したばかり。AI処理のオフロード/HWアクセラレートは、今後、組込エンジニアのお仕事となっていくのは間違い無さそう。AIを深く知る必要は無いが、AI組込/最適化のテクニックは要チェック。YOLOv3デモ動画を見ていると、馬と牛とラクダを区別しろとか、carだけ認識させろとか、いろいろ面白そうな要求が出て来そうだが、組込エンジニアのお仕事の本質はそこではなさそう。

関連:
1) YouTube
2) YouTube
3) Darknet: Open Source Neural Networks in C