忍者ブログ

Fグループ電子工作講座

秋月電子SH7125ボードで始めるマイコン開発

LiteRTをClangでビルド

先にラズパイ上で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 --version
clang++ --version

Debian clang version 14.0.6

今回使用した環境だとClang14.0.6がインストールされていましたが
LiteRT2.1.6のビルドに利用可能なClangのバージョンは18(以上)との事です。

とりあえずアップデートして
sudo apt update

OSにインストール可能な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 --version
clang++-19 --version

Debian clang version 19.1.7

これでClangがインストールされました

LiteRTのダウンロード

ここは前回と同様です。

ソースコードのダウンロードしてフォルダ移動
git clone https://github.com/google-ai-edge/LiteRT.git
cd LiteRT

ステータス確認
git status

タグ一覧
git tag

色んなバージョンがあるのでバージョンを指定します。
git checkout v2.1.6

ステータス確認
git status

vendors の CmakeLists 修正

説明は過去回を参照

CMakeの設定

cmakeでビルド項目を設定します。
ディレクトリ移動してビルドフォルダを作成
cd ~/LiteRT
mkdir build_clang
cd 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」を設定します。
ソースフォルダとビルドフォルダを設定したら
Configure
UnixMakefiles
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起動時の設定値

Configure
Generate

Generateが完了したら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 -j3

OpenCVのビルドと同様に空きメモリや放熱には要注意。
ラズパイ5でj4(4並列)だと電流不足で落ちるかも
電力を潤沢に供給できている場合やラズパイ4ならj4でもOK。

これでビルド完了。

GCC用に作成した自前のプロジェクトをlitertのCMakeListsで指定しているとビルドに
失敗することがあります。自プロジェクトがエラーになる場合は一旦プロジェクトから
除外してビルドしてみてください。

Clangの影響

ラズパイ4の場合
・CPU使用率が10%ぐらい軽減
・推論時間が7%ぐらい増加?
・libcameraの画像取得が遅延?
PR

コメント

プロフィール

HN:
ぼんどF博士
性別:
男性
自己紹介:

最新コメント