1. はじめに
超ライトな記事を書きます。 ことの発端は下記のやりとりでした。 Yocto
で EdgeTPU
を動かしたいだって!? カオスさしか感じない問い合わせからスタートしたのでした。
@PINTO03091
— かさた@幸せな世界を作る (@funny_man_daa) December 4, 2020
お世話になります。
TPUのチュートリアル(オウムの推論)がうまく動かせない状況がずっと続いており解決できず、もし、PINTOさんの方で何かお分かりになれば少しアドバイスいただけると嬉しいです。。。😭
現在TPUでオウムの推論チュートリアルをhttps://t.co/VJRPFZk15k(aarch64)上で動かそうとしているのですが、Yoctoで生成したlinux OSでapt-getが使えない環境なので、
— かさた@幸せな世界を作る (@funny_man_daa) December 4, 2020
他のlinux環境にて入手したedgetpuファイル(swig/edgetpu_cpp_wrapper.pyが含まれているファイル)を直接移植して、
パスなどを合わせてparrotチュートリアルが動くようになりましたが、推論速度が280ms/枚程度であり、実際にTPUが使われていない状況かと思います。
— かさた@幸せな世界を作る (@funny_man_daa) December 4, 2020
しかしTPUを抜くとhttps://t.co/Ga1hB4KUZnがないというエラーで動かなく、TPUを挿すことはアプリを動作させる条件となっているようなのです。
ls /sys/bus/usb/devices/で見るとTPUを挿すことでデバイスファイルもできています。
— かさた@幸せな世界を作る (@funny_man_daa) December 4, 2020
つまり「オウムの推論プログラムで、TPUを挿してもCPU推論しかできないが、TPUを挿していないとCPU推論も動かせない」状況となります。何か思い当たる原因や解決策などございませんでしょうか?😭
Yoctoで作った環境ですので制限がとても厳しく、 apt
コマンドすら使えないなど、とても苦労されているようでした。 で、やりとりを続けていくと、下記のコマンドで表示されるライブラリのバージョンと、EdgeTPUの公式が配布しているライブラリのバージョンがアンマッチであることが分かりました。
- お使いの環境のライブラリのバージョン
$ ldd --version
ldd (GNU libc) 2.27
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper
- 公式サイトの手順に従ってインストールした場合の libedgetpu.so.1 が要求するライブラリのバージョン
GLIBC 2.28
ということで、ライブラリのバージョンが一致しないなら自力でビルドして合わせてしまえばいいじゃん、とすぐに考えてしまうのがビルドジャンキーです。
2. 手順
利用中の環境のコンパイラのバージョンを使用して全ての依存ライブラリをビルドします。 今回は GLIBC 2.27
でしたので、 Ubuntu 18.04
が同じバージョンのコンパイラを保持していることを知っていました。 じゃあ、 Ubuntu 18.04
上でビルドしてしまえばいいじゃん。となりました。
ビルドに使用するのは下記のリポジトリです。
2-1. TensorFlow Lite v2.4.0-rc4 のWheelインストーラのビルド
下記の通りの手順を踏むだけで10分弱でビルドできます。 Dockerを使用してクロスコンパイルでビルドしたい環境に使用するOSを BASE_IMAGE
に指定するだけです。 簡単ですね。
$ cd ~
$ git clone -b v2.4.0-rc4 https://github.com/tensorflow/tensorflow.git
$ cd tensorflow/tensorflow/lite/tools/pip_package
$ make BASE_IMAGE=ubuntu:18.04 PYTHON=python3 TENSORFLOW_TARGET=aarch64 BUILD_DEB=y docker-build
tensorflow/tensorflow/lite/tools/pip_package/gen/tflite_pip/python3/dist/
にインストーラが生成されます。
2-2. libedgetpu.so.1 のビルド
特に難しいことはありませんが、公式のビルドシーケンスを一箇所だけ変更する必要があります。
$ cd ~
$ git clone https://github.com/google-coral/libedgetpu.git
$ cd libedgetpu
$ nano Makefile
### コレを
DOCKER_IMAGE ?= debian:stretch
↓
### このように修正します
DOCKER_IMAGE ?= ubuntu:18.04
レッツ、ビルド!!
$ DOCKER_CPUS="aarch64" DOCKER_TARGETS=libedgetpu make docker-build
5分ほどで終わりました。 libedgetpu/out/direct/aarch64/
あるいは libedgetpu/out/throttled/aarch64/
の配下に EdgeTPU をコントロールするために必要なデリゲート用.soファイルが生成されます。
で、サポートをご依頼いただいた方へ上記の一式をご提供しました。
!!!
— かさた@幸せな世界を作る (@funny_man_daa) December 7, 2020
(throttled) pic.twitter.com/J7eXXd0nsd
!!!
— かさた@幸せな世界を作る (@funny_man_daa) December 7, 2020
(direct、こちらの方が早い) pic.twitter.com/dNZSprW6ev
動きました!!!
— かさた@幸せな世界を作る (@funny_man_daa) December 7, 2020
PINTOさんのHeadPoseDetectionの方も試してみます!!
— かさた@幸せな世界を作る (@funny_man_daa) December 7, 2020
あ、私のお遊びモデルを動かすことが本来の目的だったのですね。。。 いずれにせよ、動作したようで何よりです。 それにしても 3ms/推論 ってめちゃくちゃ速いですね。
いまビルドした、できたてほやほや Ubuntu 18.04 aarch64 版の tflite_runtimeの.whl です。https://t.co/OM1gvtD8Wz
— Super PINTO (@PINTO03091) December 7, 2020
併せて GLIBC 2.27 でビルドした https://t.co/6wjeKQEq7P.1 を圧縮して下記に置いてみました。 私は、初心者なので動かしたことがありません。https://t.co/FIsy38PsuH
— Super PINTO (@PINTO03091) December 7, 2020
3. おわりに
ビルドジャンキーなんで、ビルドだけして楽しんで、作ったバイナリは一切使わないんですよね。 でも、アホみたいにビルドすればどんな環境でもだいたい動くんではないでしょうか?
対応開始序盤で @Nextremer_nb_o さん にヘルプを求めてしまいました。 そこから2人がかりで、あーでもないこーでもない、と議論し初めて、ちょっと楽しかったです。
Yocto で EdgeTPU、動くんすね。 ちょっと感動です。
Happy TensorFlow !!