はじめに
現在(2020年2月時点)、公式にはTensorflow liteはAndroid(arm v7, aarch64), iOS, RaspberryPi(arm v7)にしか対応していません
https://www.tensorflow.org/lite/guide
いろいろ調べた結果うまくいったので備忘録としてまとめておきます
この記事のモチベーション
- Tensorflow lite用のUnity pluginを作りたいが、android向けだけ用意すると開発イテレーションが悪いためwindows editor(x64)向けにもpluginを作っておきたい
- Tensorflow lite delegateが盛り上がっており、GPUだけでなくNNAPI, hexagon(QualcommのDSP)にも対応してきているので追いかけていきたい
- Tensorflow v2に伴い、.tfliteへのモデル変換がある程度固まってきたのでそろそろどのモデルが使えそうか確認しておきたい
ビルド環境
- Windows10
- MSYS2 + Mingw64
- gcc 9.2.0
- tensorflow master: cbd6bb435d32473c3b65d43bcd1171b90bb91d46
ビルドコマンド
cd tensorflow/lite/tools/make
./download_dependencies.sh
./build_lib.sh
これで
tensorflow/lite/tools/make/gen/windows_x86_64/lib/libtensorflow-lite.a
ができるので静的リンクすれば使えます
tensorflow/lite/tools/make/gen/windows_x86_64/bin/minimal.exe
があるので.tfliteファイルを食わせると動作確認ができます
※こちらのビルドスクリプトがMingw対応されたのは https://github.com/tensorflow/tensorflow/pull/26040 のプルリクです
ハマりどこり
- byteswap.hが無くてコンパイルエラーが起こる
- 下記をダウンロードしてmsys64\mingw64\includeに入れておきます
- https://github.com/icecoobe/sbc-windows/blob/master/byteswap.h
-
Argument list too long でbenchmark-lib.aがビルドできない
- Makefile上では
all: $(LIB_PATH) $(MINIMAL_BINARY) $(BENCHMARK_BINARY) $(BENCHMARK_PERF_OPTIONS_BINARY)
となっているためLIB_PATHとMINIMAL_BINARYさえビルドできれば問題ないので無視すれば良さそうです
- Makefile上では
その他
- Bazelではうまくいかなかった
- Bazelは2.0.0を使用した
- 当初下記のコマンドで試していたがコンパイルは成功するもののリンクエラー
-
bazel build -c opt --cxxopt=--std=c++11 tensorflow/lite:tensorflowlite
- vc14でのビルド
- tensorflow/lite/BUILDがwindows向けDLL対応されていたので、今後はこちらでビルドされるようになるかと思います
-
- Mingwも試したもののMSVCのコンパイルオプションがgccで読めずコンパイルエラー
bazel build -c opt --cxxopt=--std=c++11 --compiler=mingw-gcc tensorflow/lite:tensorflowlite