Python
iOS
機械学習
TensorFlow
coreML

"Symbol not found: _PyUnicodeUCS2_AsASCIIString"エラーの解決法

状況

TensorFlowの学習済みモデルをCoreML用のモデルに変換するツールtfcoremlをインストールし、実行しようとすると下記のようなエラーに遭遇しました。

(tensorflow_coreml) $ python converter.py 

ImportError: dlopen({path-to-tensorflow}/lib/python2.7/site-packages/tensorflow/python/pywrap_tensorflow_internal.so, 6): Symbol not found: _PyUnicodeUCS2AsASCIIString

tensorflowのimportに失敗してるようなので、確認してみます。

(tensorflow_coreml) $ python
>>> import tensorflow

結果は同様のエラー。

ちなみに上記環境でのpythonバージョンは2.7.11です。

python 3.5.xで同様の手順をやってみたところ、import tensorflowは動作しました。ただし、tf-coremlでは3.xはサポートされてないので、2.xで動かす必要があります。

解決法

"Symbol not found: _PyUnicodeUCS2_AsASCIIString"でググってみて出てくるラインナップを見ると、tf-coremlの問題というよりも、macOS 10.13 High Sierraの問題のようです。

この回答を見て、以下を実行しました。

$ CFLAGS="-I$(brew --prefix readline)/include -I$(brew --prefix openssl)/include" \
> LDFLAGS="-L$(brew --prefix readline)/lib -L$(brew --prefix openssl)/lib" \
> PYTHON_CONFIGURE_OPTS=--enable-unicode=ucs2 \
> pyenv install -v 2.7.11

あれやこれやオプションをつけてpyenvの2.7.11をインストールし直してるようです。

このpyenv環境下でもう一度TensorFlowのインストールからやり直すことで、先ほどのimportが通るようになり、tfcoremlも入れ直して動くようになりました。