Yoctoで生成した環境上で動かすことを目的としたTensorflowLite v2.4.0-rc4のスタンドアロン2MBインストーラとlibedgetpu.so.1のビルド


1. はじめに

超ライトな記事を書きます。 ことの発端は下記のやりとりでした。 YoctoEdgeTPU を動かしたいだって!? カオスさしか感じない問い合わせからスタートしたのでした。

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 上でビルドしてしまえばいいじゃん。となりました。

ビルドに使用するのは下記のリポジトリです。

  1. TensorFlow v2.4.0-rc4
  2. libedgetpu 2020.12.07時点のmasterブランチ

2-1. TensorFlow Lite v2.4.0-rc4 のWheelインストーラのビルド

下記の通りの手順を踏むだけで10分弱でビルドできます。 Dockerを使用してクロスコンパイルでビルドしたい環境に使用するOSを BASE_IMAGE に指定するだけです。 簡単ですね。

TensorFlowLiteのインストーラのビルド
$ 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ファイルが生成されます。

で、サポートをご依頼いただいた方へ上記の一式をご提供しました。

あ、私のお遊びモデルを動かすことが本来の目的だったのですね。。。 いずれにせよ、動作したようで何よりです。 それにしても 3ms/推論 ってめちゃくちゃ速いですね。


3. おわりに

ビルドジャンキーなんで、ビルドだけして楽しんで、作ったバイナリは一切使わないんですよね。 でも、アホみたいにビルドすればどんな環境でもだいたい動くんではないでしょうか?

対応開始序盤で @Nextremer_nb_o さん にヘルプを求めてしまいました。 そこから2人がかりで、あーでもないこーでもない、と議論し初めて、ちょっと楽しかったです。

Yocto で EdgeTPU、動くんすね。 ちょっと感動です。

Happy TensorFlow !!