Raspberry Pi3でTensorflowをビルドして動かした
こんばんは。相変わらず、長男は部屋の片付けが出来るものの、次男が台無しにするという事態が続いていますが、久しぶりに自宅で休日をのんびりと過ごせた@kjunichiです。
背景
tensorflowの公式のraspberry piのドキュメントに従った昨日からビルドを試みてるが、tensorflow本体のビルドでフリーズ?してるみたいで昨晩試しにそのまま寝たら、起きたら、sshで繋いでいたから、それが切れて、どうも中断してた模様
— kjunichi (@kjunichi) 2018年3月12日
コンパイルで、.oファイル作るだけで、殆どの処理を遅延させて、それが原因でsshを切断させてしまうみたい。本体のコンソールから試そうとしたが、流石に日中不在の部屋で熱暴走とかして、異常加熱とか怖そうなさだから、また、今晩チャレンジかな
— kjunichi (@kjunichi) 2018年3月12日
Raspberry Pi3でTensorflowをビルド
公式のGithubのドキュメントではgccの版が指定されてましたが、随分古い版で、 実際試していた際は、gccの内部エラーを連発されてStretch付属のgccでビルドしました。
メモリが足りない?!
壊れかけのSSDの120GBが余っていたので、これをスワップに割り当てて メモリを大幅に増やしてビルド。
Raspberry Pi 3 でのtensorflowのビルド、こないだSSDを128Gほどスワップに割り当てた作戦はどうもCPUの温度が高いまま続行してたのがよくなかった見たい、今朝は固まらずいい感じでドキュメント指定の版のg++だとダメだとコンパイラのバグを引く模様
— kjunichi (@kjunichi) 2018年3月16日
ビルド時は何らかの冷却が必要?!
メモリを増やしたところ、本体がフリーズすることは少なくなったものの、 今度は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/Makefileにnsync.aを追加することで、リンクエラーを回避できた。
- -lz + -lz ./tensorflow/contrib/makefile/downloads/nsync/builds/default.linux.c++11/nsync.a
動いた
ようやくRaspberry Pi3でtensorflowをビルドしてサンプルを動かせた。stretchだとデフォルトのgccでビルド出来た。冷やさないとgccが内部エラーになり落ちるし、メモリもスワップ追加してないときつそう。 https://t.co/Y9aEtMukpM pic.twitter.com/kEK2UZAcvH
— kjunichi (@kjunichi) 2018年3月18日