LoginSignup
2
2

More than 5 years have passed since last update.

CoreML Tools + macOS High Sierra だと apple pythonでないと動かない?

Posted at

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環境がよごれてしまった。
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2