MacでCoral USB Acceleratorを動かす

Edge TPUで推論

## イントロ
[Coral USB Accelerator](https://coral.ai/products/accelerator/)はUSB 3.0のポートに挿す事で機械学習処理の推論処理をオフロードできるアクセラレーターです。

Google Reserachにより提供されており、[DesktopCPU比でも10倍程度の速度向上が見込める](https://coral.ai/docs/edgetpu/benchmarks/)のでM1 Macを持っていなくても機械学習の推論処理を高速化できます。

初期はDebian系のOSしかサポートしていなかったのですが、既存モデルを使うだけならMacやWindowsでも動くようになっており、手元のMacで動かしてみます。

![unnamed.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103496/e9020863-14d3-ed73-784d-3906d8116677.jpeg)


## 基本
公式docに従ってサンプルを動かしていきます。
https://coral.ai/docs/accelerator/get-started/

Edge TPU Runtimeのインストール

```bash
curl -O https://dl.google.com/coral/edgetpu_api/edgetpu_runtime_20201204.zip
unzip edgetpu_runtime_20201204.zip
cd edgetpu_runtime
sudo bash install.sh
cd ..
```

pathにEdge TPU Runtimeのlocationを追加。shellを再起動

```bash
# ~/.bashrcに追加
# libedgetpu.1.dylibの読み込み
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
```


アクセラレーターをUSBポートに挿します。

TnesorFlowのインストール

```bash
# virtualenvの作成. 3.8系はサポートしていない
pyenv local 3.7.4
python -m venv coral_accelerator
source coral_accelerator/bin/activate

pip install --upgrade pip
pip install tensorflow
pip install https://github.com/google-coral/pycoral/releases/download/release-frogfish/tflite_runtime-2.5.0-cp37-cp37m-macosx_10_15_x86_64.whl
```

分類のサンプルを動かします。

```
mkdir coral && cd coral
git clone https://github.com/google-coral/tflite.git
bash install_requirements.sh
python classify_image.py --model models/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite --labels models/inat_bird_labels.txt --input images/parrot.jpg
```

```
----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
14.4ms
4.4ms
4.3ms
4.7ms
4.4ms
-------RESULTS--------
Ara macao (Scarlet Macaw): 0.77734
```

無事インコをインコとして認識しました。

## PyCoralで推論
[2020/11の更新でPyCoral APIが発表されています](https://coral.ai/news/updates-11-2020/)。それに伴いEdge TPU Python libraryの使用は非推奨。

PyCoralも独立したrepositoryがあるのでそのサンプルも動かしてみます。

https://coral.ai/software/#pycoral-api

```bash
# macOS 10.15 Python 3.7
pip install https://github.com/google-coral/pycoral/releases/download/release-frogfish/pycoral-1.0.0-cp37-cp37m-macosx_10_15_x86_64.whl
git clone --recurse-submodules https://github.com/google-coral/pycoral
cd pycoral
git submodule init && git submodule update
```

```
$ python3 examples/detect_image.py   --model test_data/ssd_mobilenet_v2_coco_quant_postprocess_edgetpu.tflite   --labels test_data/coco_labels.txt   --input test_data/grace_hopper.bmp   --output ${HOME}/grace_hopper_processed.bmp
----INFERENCE TIME----
Note: The first inference is slow because it includes loading the model into Edge TPU memory.
32.00 ms
14.98 ms
15.08 ms
16.18 ms
16.02 ms
-------RESULTS--------
tie
  id:     31
  score:  0.83984375
  bbox:   BBox(xmin=227, ymin=419, xmax=292, ymax=541)
person
  id:     0
  score:  0.8046875
  bbox:   BBox(xmin=0, ymin=9, xmax=519, ymax=590)
```

![grace_hopper_processed.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103496/266db00b-7435-96b8-1012-aa5f883c75c8.jpeg)


```
$ python3 examples/semantic_segmentation.py \
>   --model test_data/deeplabv3_mnv2_pascal_quant_edgetpu.tflite \
>   --input test_data/bird.bmp \
>   --keep_aspect_ratio \
>   --output ${HOME}/segmentation_result.jpg
```

![segmentation_result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103496/fb466d28-d181-f524-2750-8956d9ead186.jpeg)

## 所感
似たようなアクセラレーターとしてIntelのNeural Compute Stick 2があります. そちらはラズパイのような組み込み用のCPU比だと十分速度向上が見込めるようなのですが、Desktop CPU比だと負けるという話もあります。またNCS2で使用するのはマイナーなOpenVINOというIntel製の機械学習ライブラリー(複数backend選択できるラッパー)です。

一方Coral USB AcceleratorはTFLiteベースなので慣れ親しんだTensorFlowですね。発熱の問題もあるので全ての場合にEdge TPUの方がいいというわけではないのですが、組み込みでない汎用PC向けのアクセラレーターとしてはCoralの方が向いている気はしました。