Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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環境がよごれてしまった。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした