2020年1月22日水曜日

ラズベリーPI4(raspbian Buster)にTensorFlowをインストールしてみる

 TensorFlow2.1.0のソースからビルドしてラズベリーPI4にインストールすることができたのでメモ代わりに記しておく。

必要なもの

TensorFlowをビルドする前に以下をインストールしておく。

その他の必要そうなパッケージをインストール

sudo apt-get install -y \
make cmake wget curl libhdf5-dev libc-ares-dev libeigen3-dev libatomic1 \
openmpi-bin libopenmpi-dev libatlas-base-dev zip unzip libffi-dev \
libprotobuf-dev


Swap領域の確保

 TensorFlowをコンパイルするときに1g超の資源を必要とするものが幾つかあり、そういったものが複数は走ってもいいように2g*(3+1)くらいのスワップ領域を確保してやる。これを行わないと処理が立ち往生してしまい終わらなくなってしまう。8gは大袈裟かもしれないがTOPコマンドで観ていると3g超消費することもあるようだから念のために確保しておく。

TensorFlowの取得/展開

wget https://github.com/tensorflow/tensorflow/archive/v2.1.0.tar.gz
tar -xvf v2.1.0
cd tensorflow-2.1.0



configure実行


 configureスクリプトを実行して/usr/bin/python3と/usr/local/lib/python3.7/dist-packagesを指定し、y/nの質問には全てNを指定する。
pythonのパッケージはapt-getでインストールした場合とpip(インストール先無指定)でインストールした場合とではインストール先が異なる事に注意。apt-getでインストールした場合は/usr/lib/python3/dist-packages以下に、pipの場合は/usr/local/lib/python3/dist-packagesに(または権限がなければ~/.local/lib/python3.7/site-packages)インストールされる。

C言語用ライブラリを作成

bazel --host_jvm_args=-Xmx2048m build \
--config=noaws \
--config=nohdfs \
--config=nonccl \
--config=v2 \
--local_resources=4096.0,3.0,1.0 \
--copt=-mfpu=neon-vfpv4 \
--copt=-ftree-vectorize \
--copt=-funsafe-math-optimizations \
--copt=-ftree-loop-vectorize \
--copt=-fomit-frame-pointer \
--copt=-DRASPBERRY_PI \
--host_copt=-DRASPBERRY_PI \
--linkopt=-Wl,-latomic \
--host_linkopt=-Wl,-latomic 
//tensorflow/tools/lib_package:libtensorflow

終了すると./bazel-bin/tensorflow/tools/lib_package/libtensorflow.tar.gzができるので、これを適当に展開する。

PIPパッケージを作成

 PIPパッケージを作成するには以下の様にするが、途中でprotobufのpythonモジュールがないとエラーになるので事前にpipでインストールしておく。
bazel --host_jvm_args=-Xmx2048m build \
--config=noaws \
--config=nohdfs \
--config=nonccl \
--config=v2 \
--local_resources=4096.0,3.0,1.0 \
--copt=-mfpu=neon-vfpv4 \
--copt=-ftree-vectorize \
--copt=-funsafe-math-optimizations \
--copt=-ftree-loop-vectorize \
--copt=-fomit-frame-pointer \
--copt=-DRASPBERRY_PI \
--host_copt=-DRASPBERRY_PI \
--linkopt=-Wl,-latomic \
--host_linkopt=-Wl,-latomic 
//tensorflow/tools/pip_package:build_pip_package

 bazelが終了したら./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkgを実行してwheelファイルを作成する。ここで/tmp/tensorflow_pkgはwheelファイルの出力先。
 出来たwheelファイルをpipでインストールすれば良いのだがscipy等々の再インストールが必要だったりするのでその都度インストールして行く。今回はTensorFlowの他にも色々インストールしたので純粋にTensorFlowの為に何のパッケージをインストールしたかは整理が出来ていない。
 近々にDockerコンテナ上でもう一度ビルドしようと思っているので、そのときに必要パッケージ等を追記したい。

 取り敢えず、今回はCPUのみのTensorFlow2.1.0がPI4でビルドできた!ということで。