non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

Raspberry Pi3でTensorflowをビルドして動かした

こんばんは。相変わらず、長男は部屋の片付けが出来るものの、次男が台無しにするという事態が続いていますが、久しぶりに自宅で休日をのんびりと過ごせた@kjunichiです。

背景

Raspberry Pi3でTensorflowをビルド

公式のGithubのドキュメントではgccの版が指定されてましたが、随分古い版で、 実際試していた際は、gccの内部エラーを連発されてStretch付属のgccでビルドしました。

github.com

github.com

メモリが足りない?!

壊れかけのSSDの120GBが余っていたので、これをスワップに割り当てて メモリを大幅に増やしてビルド。

ビルド時は何らかの冷却が必要?!

メモリを増やしたところ、本体がフリーズすることは少なくなったものの、 今度はgccの内部エラーが頻発するようになった。

どうもRaspberry Pi3はCPUの冷却に問題がありそうな気配をググって感じつつあったので、 冷却を考えた。

最終的に本体ケースの上に保冷剤を載っけて、本体を冷やしながらビルド作業しました。

リンクエラー

pi@raspberrypi:~/local/src/tensorflow $ make -f tensorflow/contrib/pi_examples/label_image/Makefile -j2
gcc --std=c++11 -O0 -I/usr/local/include -I. -I/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/downloads -I/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/downloads/eigen/ -I/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/proto/ -I/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/proto_text/ \
-o /home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/gen/bin//label_image /home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/gen/obj/tensorflow/contrib/pi_examples/label_image/label_image.o \
  -L/usr/local/lib -L/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib -Wl,--no-whole-archive -Wl,--allow-multiple-definition -Wl,--whole-archive -ltensorflow-core -Wl,--no-whole-archive -lstdc++ -lprotobuf -ldl -lpthread -lm -ljpeg -lz
/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::mutex::mutex()' 内:
mutex.cc:(.text+0x8): `nsync::nsync_mu_init(nsync::nsync_mu_s_*)' に対する定義されていない参照です
/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::mutex::lock()' 内:
mutex.cc:(.text+0x14): `nsync::nsync_mu_lock(nsync::nsync_mu_s_*)' に対する定義されていない参照です
/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::mutex::try_lock()' 内:
mutex.cc:(.text+0x1c): `nsync::nsync_mu_trylock(nsync::nsync_mu_s_*)' に対する定義されていない参照です
/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::mutex::unlock()' 内:
mutex.cc:(.text+0x2c): `nsync::nsync_mu_unlock(nsync::nsync_mu_s_*)' に対する定義されていない参照です
/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::mutex::lock_shared()' 内:
mutex.cc:(.text+0x30): `nsync::nsync_mu_rlock(nsync::nsync_mu_s_*)' に対する定義されていない参照です
/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::mutex::try_lock_shared()' 内:
mutex.cc:(.text+0x38): `nsync::nsync_mu_rtrylock(nsync::nsync_mu_s_*)' に対する定義されていない参照です
/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::mutex::unlock_shared()' 内:
mutex.cc:(.text+0x48): `nsync::nsync_mu_runlock(nsync::nsync_mu_s_*)' に対する定義されていない参照です
/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::condition_variable::condition_variable()' 内:
mutex.cc:(.text+0x54): `nsync::nsync_cv_init(nsync::nsync_cv_s_*)' に対する定義されていない参照です
/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::condition_variable::wait(tensorflow::mutex_lock&)' 内:
mutex.cc:(.text+0x64): `nsync::nsync_cv_wait(nsync::nsync_cv_s_*, nsync::nsync_mu_s_*)' に対する定義されていない参照です
/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::condition_variable::wait_until_system_clock(tensorflow::mutex_lock&, std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long long, std::ratio<1ll, 1000000000ll> > >)' 内:
mutex.cc:(.text+0x7c): `nsync::nsync_from_time_point_(std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long long, std::ratio<1ll, 1000000000ll> > >)' に対する定義されていない参照です
mutex.cc:(.text+0x94): `nsync::nsync_cv_wait_with_deadline(nsync::nsync_cv_s_*, nsync::nsync_mu_s_*, timespec, nsync::nsync_note_s_*)' に対する定義されていない参照です
/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::condition_variable::notify_one()' 内:
mutex.cc:(.text+0xa8): `nsync::nsync_cv_signal(nsync::nsync_cv_s_*)' に対する定義されていない参照です
/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::condition_variable::notify_all()' 内:
mutex.cc:(.text+0xac): `nsync::nsync_cv_broadcast(nsync::nsync_cv_s_*)' に対する定義されていない参照です
collect2: error: ld returned 1 exit status
tensorflow/contrib/pi_examples/label_image/Makefile:72: ターゲット '/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/gen/bin//label_image' のレシピで失敗しました

対応

tensorflow/contrib/pi_examples/label_image/Makefilensync.aを追加することで、リンクエラーを回避できた。

- -lz
+ -lz ./tensorflow/contrib/makefile/downloads/nsync/builds/default.linux.c++11/nsync.a

動いた

関連記事

Tensorflowつながり

Raspberry Piつながり