CoreML Tools を使って、Kerasで作成した学習済みモデルをiOSにポーティングしています。
正解率が著しく悪くなってしまったので、PC上で確認したくて MLModel#predict()
をやろうとしたら High Sierraにアップデートしろと言われた。
仕方がないのでアップデートしたところ、状況が悪化したので備忘録。
前提
- macOS Sierra
- Python 2.7.13 (brew, /usr/local/bin/python)
- CoreML Tools 0.4.0
- モデルのコンバート(
coremltools.converters.keras.convert()
,MLModel#save()
)は正常動作 - モデルのロード(
coremltools.models.MLModel
) しよとするとOSバージョンエラーが出る
やったこと
1. macOS High Sierra beta4にアップデート
Appleのディベロッパーポータルからダウンロードしてインストール。40分くらい?
2. モデルのロードを試行
>>> model = coremltools.models.MLModel('HogeModel.mlmodel')
Fatal Python error: PyThreadState_Get: no current thread
Abort trap: 6
モデルのロード時にエラー
あわてて試すと、モデルのコンバート(正確には、保存処理の MLModel#save()
)も同様のエラー発生
エラーについて調べると、CoreML ToolsがmacOSバンドル版のPython向けになっているからのよう。
http://qiita.com/hatchinee/items/b16ee02b3c93603aee0c
エラーを吐いているオブジェクトの詳細がわかれば install_name_toolで対象できるようだったが、CoreML Toolsの内部がよくわからないので(時間もなかったので)とりあえずバンドル版のPython(/usr/bin/python) に切り替える
3. バンドル版のPython(/usr/bin/python)に切り替える(中途半端)
といいつつ、Pyenvの古い設定が残っていたせいでうまく行かなかったので、バンドル版はフルパス指定で呼び出しつつ、pipのみ再インストールした。
つらいのでこの辺りは近いうちに綺麗にしないと。
$ which python
/usr/local/bin/python
$ python --version
Python 2.7.13
$ /usr/bin/python --version
Python 2.7.10
$ which pip
/usr/local/bin/pip
$ pip --version
pip 9.0.1 from /Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg (python 2.7)
pyenv環境が汚れていなければ、systemにswitchするだけで済んだのだろうか・・・
4. SIPと向き合う
依存ライブラリ(coremltools, keras, tensorflow, numpy, h5py)の再インストールが必要だが、High SierraではSierraと同様SIP(rootless)のせいでpipでのインストールに失敗する。
それが嫌でHomebrew版とかに逃げるわけだが、今回はそうはいかないので、 --user
オプションでとりあえず逃げる。
$ pip install --user tensorflow coremltools
もし、Homebrew版とかの(普段使いの方の)Python2.7で /Users/username/Library/Python/2.7/lib/python/site-packages
を使っている場合は、インストール先が被るので、 --user
オプションの向き先を変える必要がある。
http://qiita.com/ronin_gw/items/cdf8112b61649ca455f5 とか、かしら?
自分の場合は、Homebrew版の方が /usr/local/lib/python2.7/site-packages
を向いていたので、ひとまず大丈夫なはず。。。
4. 失敗した処理の確認
- モデルのコンバート : OK
- モデルのロード : NG
ロード自体は成功したのだが、肝心の推論実行に失敗する。
>>> result = model.predict({'image': x})
〜中略〜
Exception: Unable to load CoreML.framework. Cannot make predictions.
結局ダメか。
感想
- OSの機能使うだろうから仕方ないなーと思いつつ、バンドルPython縛り&2.7縛りめんどい。。。
- CoreML Toolsは、公式のAPIレファレンス見てても、メンバーがメソッドになってたり、結構ドラスティックに変わってる部分もあるっぽいので注意。
- 早くフル機能ためしたーい。
- またPython環境がよごれてしまった。