先にラズパイ上で
g++を使用してLiteRTをビルドする方法を解説しました。
この方法ならラズパイ5で320x320のint8モデルの推論を8msで実行できます。
しかし、g++でビルドする場合はコンピュータビジョンを高速化するライブラリ
Kleidiを利用できません。
そこでg++の代わりにClangを使用してLiteRTをビルドします。
Clangを用いてビルドすることでラズパイ4ならCPU使用率が10%程度低減する可能性があります。
ただし、libcameraの画像取得に遅延発生するなどその他影響も見れます(要確認)。
余談:Clangとは
ます、今まで使ってきたGCC(g++)とは何かという話になります。
LiteRTやOpenCVのプログラムはc++で記述されます。
実際にプログラムを実行するにはc++で書かれたプログラムを機械語に変換
(コンパイル)する必要があります。
C系言語を機械語に変換する機能(コンパイラ)が必要ですが、このコンパイラ
の一つがGCCで、GCCには C用のgcc と C++用のg++ が含まれます。
GCCの初版は1987年との事ですが、この時点ではマルチコアCPUは一般に
は出回っておらず、GCCも標準ではマルチコア向けの並列処理に対応
していません。
これに対して2007年に公開されたClangもC系言語向けのコンパイラの一つ
ですが、マルチコアCPUが出回りだした頃なのでマルチコア向けの処理に
しっかり対応しています。
すこし話が変わってAIについて。
最近急速に普及しているAIは内部で大量の計算を行っており、この計算は
並列で実行することが可能で並列化で大幅な高速化が行えます。
これに対して画像処理も画面のすべての画素に対して処理を行う必要が
あるので、映像を滑らかに表示するには並列処理が欠かせません。そこで
開発されてきたのがGPUで、並列処理に特化しているためAIの並列計算にも
多数利用されています。最近ではAI処理に特化したNPUも開発されています。
話をLiteRTに戻します。
LiteRT(TensorFlowLite)はAI向けのライブラリですがGPUだけでなくCPUでの
処理にもしっかり対応しています。LiteRTの内部処理はAIなので並列計算を
行うことで高速化できます。更に並列化を前提として作成された機能もあり、
この部分をコンパイルするためにはGCCではなく並列処理を前提として設計
されているClangを使用する必要があります。
Clangのインストール
今回はOSとしてbookwormを使用した場合を前提としますが、
bookwormにClangがインストールされているか分かりません。
Clangがインストールされているか確認
clang --versionclang++ --version↓
Debian clang version 14.0.6
今回使用した環境だとClang14.0.6がインストールされていましたが
LiteRT2.1.6のビルドに利用可能なClangのバージョンは18(以上)との事です。
とりあえずアップデートして
sudo apt updateOSにインストール可能なClangのバージョンを確認
apt-cache search '^clang-[0-9]+$'↓
clang-13 - C, C++ and Objective-C compiler
clang-14 - C, C++ and Objective-C compiler
clang-15 - C, C++ and Objective-C compiler
clang-16 - C, C++ and Objective-C compiler
clang-19 - C, C++ and Objective-C compiler
clang-22 - C, C++ and Objective-C compiler
等と表示されます。
clang-18以上で一番近いclang-19が利用可能らしいのでインストール
sudo apt install clang-19※750MBぐらい必要
バージョンの確認
clang-19 --versionclang++-19 --version↓
Debian clang version 19.1.7
これでClangがインストールされました
LiteRTのダウンロード
ここは
前回と同様です。
ソースコードのダウンロードしてフォルダ移動
git clone https://github.com/google-ai-edge/LiteRT.gitcd LiteRTステータス確認
git statusタグ一覧
git tag色んなバージョンがあるのでバージョンを指定します。
git checkout v2.1.6ステータス確認
git statusvendors の CmakeLists 修正
説明は
過去回を参照
CMakeの設定
cmakeでビルド項目を設定します。
ディレクトリ移動してビルドフォルダを作成
cd ~/LiteRTmkdir build_clangcd build_clang※g++用のbuildフォルダが無い場合はbuildフォルダでOK
cmake-guiで設定項目を確認しながら進めますが、
そのまま起動すると
CコンパイラがGCCに設定される様です。
cmake-guiでこの項目を変更できなかったので、
CC=/usr/bin/clang-19 CXX=/usr/bin/clang++-19 cmake-gui ..として強制的にコンパイラを指定して起動します。
clangはインストールしたバージョンを指定してください。
cmake-guiが起動したらソースとビルドの出力先を設定
ソース:LiteRT/litert
ビルド:LiteRT/build_clang
LiteRT直下にCMakeListsが無いので
litertまたは
tfliteのどちらかを指定します。
今回はLiteRTをビルドするのでソースに「LiteRT/litert」を設定します。
ソースフォルダとビルドフォルダを設定したら
ConfigureUnixMakefiles
Use default native cmopilers
を選択して
Finish必要なファイルをダウンロード&展開するので10分ぐらいかかります。
本来は時間がかかるのは初回だけのはずですが、vendorsを修正しておかないと
Configureするだけで毎回10分かかります
Clang向けの設定
ここからg++の場合と設定が変わります
といっても標準的な設定のままでOKというだけです。
MAKE_BUILD_TYPE:Release
標準だと何も表示されずRelease扱いっぽいが一応明示的に指定しておく
LITERT_DISABLE_KLEIDIAI:OFF
KLEIDIAIを使用するのでここはOFFのまま
LITERT_ENABLE_GPU:OFF
LITERT_ENABLE_NPU:OFF
LITERT_ENABLE_QUALCOMM:OFF
LITERT_ENABLE_SAMSUNG:OFF
この辺はラズパイと関係ないのでついでにOFFにしておく
※ただしCMakeListsを修正しないと強制的にONに戻される可能性あり
XNNPACK_ENABLE_KLEIDIAI:ON
ここもONのまま
もしCMAKE_C_COMPILERなどの設定項目がある場合は
CMAKE_CXX_COMPILER:/usr/bin/clang++-19
CMAKE_C_COMPILER:/usr/bin/clang-19
の様に設定されているか確認します。※cmake-gui起動時の設定値
ConfigureGenerateGenerateが完了したらcmake-guiを終了し、念のためフォルダ移動
cd ~/LiteRT/build_clangコンパイラの設定が反映されているか確認
grep -E 'CMAKE_(C|CXX)_COMPILER:' CMakeCache.txt↓
CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/clang++-19
CMAKE_C_COMPILER:FILEPATH=/usr/bin/clang-19
などと表示されていればClangでビルドできます。
make -j3OpenCVのビルドと同様に空きメモリや放熱には要注意。
ラズパイ5でj4(4並列)だと電流不足で落ちるかも
電力を潤沢に供給できている場合やラズパイ4ならj4でもOK。
これでビルド完了。
GCC用に作成した自前のプロジェクトをlitertのCMakeListsで指定しているとビルドに
失敗することがあります。自プロジェクトがエラーになる場合は一旦プロジェクトから
除外してビルドしてみてください。
Clangの影響
ラズパイ4の場合
・CPU使用率が10%ぐらい軽減
・推論時間が7%ぐらい増加?
・libcameraの画像取得が遅延?