jarinosuke blog

about software engineering, mostly about iOS

MacOS で matplotlib を Python から使用するときのエラーを修正する

エラー詳細

Mac で pyenv でインストールした Python を使用している場合に、

pip でインストールした matplotlib をインポートしようとすると

以下のようなランタイムエラーが出てしまう

RuntimeError: Python is not installed as a framework. The
Mac OS X backend will not be able to function correctly if Python
is not installed as a framework. See the Python documentation for
more information on installing Python as a framework on Mac OS X.
Please either reinstall Python as a framework, or try one of the other
backends.

修正方法

以下のファイルを編集する

Python のバージョンは各環境に応じて変更する必要がある

/.pyenv/versions//3.4.3/lib/python3.4/site-packages/matplotlib/mpl-data/matplotlibrc

上記ファイルを以下のように修正する

backend : TkAgg

TensorFlow の iOS 向けビルド

手順

Xcode のセットアップ

$ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer

必要なパッケージのインストール

$ brew install automake
$ brew install libtool

TensorFlow

$ git clone https://github.com/tensorflow/tensorflow -b r1.0

Configure

$ cd tensorflow
$ ./configure

いくつか質問聞かれます

iOS 向けの静的ライブラリのビルド

tensorflow/contrib/makefile/build_all_ios.sh

以下のファイルが tensorflow/contrib/makefile/gen/lib/ あたりに作成されれば成功

libtensorflow-core.a, libprotobuf.a, libprotobuf-lite.a

その他ツールのインストール

Bazel を使って以下もインストール、時間かかる もしエラーが出てしまった場合は bazel version でバージョンが 0.1.4 以上か確認する (指定されているオプションがそれより前は存在しないため) 詳細

bazel build tensorflow/python/tools:freeze_graph
bazel build tensorflow/python/tools:optimize_for_inference

だいたいそれぞれかかった時間は以下の通りで、16GBのMacBook Proで50分くらいかかってしまった

Elapsed time: 541.116s, Critical Path: 0.17s
Elapsed time: 2329.343s, Critical Path: 2184.19s

iOS向けGraphファイルの作成

上記の freeze_graph を使って、以前に作った graph.rb ファイルと weight や bias を全て一つのファイルにまとめる

bazel-bin/tensorflow/python/tools/freeze_graph \
--input_graph=../tensorflow_try/tmp/graph.pb --input_checkpoint=../tensorflow_try/tmp/model \
--output_node_names=model/y_pred,inference/inference --input_binary \
--output_graph=/tmp/voice/frozen.pb

ここで中断した…

Overall

Python で作成した TensorFlow のモデルを iOS にインストールすることは可能 だがそこまでするメリットがあまりない 具体的には結構ビルドする手間もかかるし、何よりファイルサイズが大きく アプリのサイズとしては現実的ではない なので素直に全てサーバサイドで Web API として提供するのがストレートだと思う

zsh から fish に乗り換えた

Finally, a command line shell for the 90s

特に設定ファイルなどにこだわらずに、そこそこいい感じに動くシェル

自分にとても合っていた

インストール方法

以下でインストールできる

$ brew install fish
$ echo /usr/local/bin/fish | sudo tee -a /etc/shells
$ chsh -s /usr/local/bin/fish

いい感じのオートコンプリートも以下を叩くだけで man の情報などから組み立ててくれるらしい、素敵

$ fish_update_completions

git add がクラッシュした時の対処

エラー

git add -A を実行した時にクラッシュ

もう一度同じ操作をしようとしても index.lock がすでに存在するため 以下のようなメッセージが出てエラーを吐いてしまう

If no other git process is currently running, this probably means a
git process crashed in this repository earlier. Make sure no other git
process is running and remove the file manually to continue.

原因

git add しようとしている中に不正なファイルがありそう

対策

一時的に戻す方法としては以下

rm .git/index.lock
git reset

不必要なファイルは .gitignore で避ける

今回の場合は virtualenv で作成されたものを git add -A しようとして発生した のでこれを使った

virtualenv で TensorFlow をインストールする

virtualenv を使用して TensorFlow をインストールする

こちら で virtualenv を使用した方法が

推奨されていたのでそれに従い行った

1.install pip

$ easy_install pip

2.upgrade virtualenv if needed

$ pip install --upgrade virtualenv

3.create virtualenv environment

$ virtualenv --system-site-packages your_own_directory

4.activate

$ source your_own_directory/bin/activate

5.install tensorflow

$ pip install --upgrade tensorflow

6.validate

$ python try.py

try.py

import tensorflow as tf

a = tf.constant([1, 2, 3])
b = tf.constant([4, 5, 6])

session = tf.Session(config=tf.ConfigProto(log_device_placement=True))

print(session.run(a + b))

最後に上記のプログラムが正しく TensorFlow で実行されていれば環境は構築できている