RasPiでKeras/TensorFlowを動かすまでの試行錯誤をメモしておく。使った環境は以下の通り。
- RaspberryPi 3 Model B
- Raspbian August 2017
- 16GB SD card(いろいろツールを入れたので8GBでは足りなくなった)
まずはTensorFlowを入れる
TensorFlow公式RasPiサンプルはビルドおそい
最初にTensorFlow公式のRasPiサンプルを試したのだけど、C++のコードをゼロからビルドするので、非力なRasPiでは何時間待っても終わらない...ってグチをつぶやいたら、TensorFlowチームのPete Wardenが絶妙のタイミングでブログ記事Cross-compiling TensorFlow for the Raspberry Piを書いていて、リンクをシェアしてくれた。この記事では、あらかじめビルド済みのパッケージを以下のコマンドでインストールする方法を紹介している。
sudo apt-get install libblas-dev liblapack-dev python-dev \
libatlas-base-dev gfortran python-setuptools
sudo pip2 install \
http://ci.tensorflow.org/view/Nightly/job/nightly-pi/lastSuccessfulBuild/artifact/bazel-out/pi/tensorflow-1.3.0-cp27-none-any.whl
このインストール方法も1〜2時間はかかる(途中で寝ちゃったので正確な時間はわからない)けど、公式サンプルより全然マシだ。ありがとうPete!!
ヒートシンクは必須
しかし、このスクリプトでインストールを開始して数10分経ったところで毎回RasPiが固まってしまう。熱暴走っぽいので、RasPi3用のヒートシンクを付け、横に小さなファンを置いて空気を流してみた。
これでTensorFlowのインストールはうまくいった。
つづいてKerasを入れる
Kerasはドキュメント手順どおりのpipコマンドですんなり入った。Kerasが使うh5pyも、
sudo apt-get install python-h5py
として入れておく。
メモリが足りないのでスワップ領域を増やす
しかしここでKerasを動かすと、メモリ不足に起因するエラーが発生。以下のコマンドでスワップ領域のサイズを編集した。
sudo vi /etc/dphys-swapfile
デフォルトのサイズが100MBくらいなので、CONF_SWAPSIZE=1024
と編集して1GBくらい用意しておいた。
sudo /etc/init.d/dphys-swapfile restart
swapon -s
を実行して、スワップ領域が大きくなったことを確認。これでKerasが動いた。
GrovePi(オプション)
今回はDexter IndustriesのGrovePiというキットを組み合わせてRasPiにLEDや照度センサー等を付けた。
このキットにはi2cまわりのPythonドライバが付属するので、Arduinoっぽい簡単なPythonコードを2、3行書くだけで周辺デバイスを扱えてとても簡単。ただし、Raspbian August 2017との組み合わせではアナログI/Oがうまく動かない不具合に遭遇したので、このポストを参考に以下のパッチを当てる。
sudo rpi-update 52241088c1da59a359110d39c1875cda56496764
sudo reboot
以上。RasPi3でKeras/TensorFlowがうまく動いた。VGG16ベースのモデルで画像認識すると、1画像あたりおよそ2秒くらいかかる。
<9/22追記>
2秒という速さは素のARMより3倍くらい速い、って指摘をいただいたのでPeteに確認したら、デフォルトでNEONを使ってるとのことです。TensorFlowでGPU:0等の指定をしなくてもNEONが効く。NEON速い。
Disclaimer この記事は個人的なものです。ここで述べられていることは私の個人的な意見に基づくものであり、私の雇用者には関係はありません。