MacOSでデフォルトのNumpyとChainerを使うと、精度が落ちる問題があり、Warningが発生します。OpenBLAS対応のNumpyを使うことで対処します。
Chainerを3にアップデートすると、以下のようなWarningが発生しました。
/path/to/chainer/_environment_check.py:38: UserWarning: Accelerate has been detected as a NumPy backend library. vecLib, which is a part of Accelerate, is known not to work correctly with Chainer. We recommend using other BLAS libraries such as OpenBLAS. For details of the issue, please see https://docs.chainer.org/en/stable/tips.html#mnist-example-does-not-converge-in-cpu-mode-on-mac-os-x. Also note that Chainer does not officially support Mac OS X. Please use it at your own risk. ''') # NOQA
Warningで言及されているドキュメントを読むと、BLASにvecLibが使われていると、MNISTのExampleの精度が落ちるそうです。vecLibはMacでデフォルトで使われており、OpenBLASに変更すると解決するそうです。
関連Issueを見る限り、Chainer 3から発生した問題というよりは、昔から発生していた問題で、3からWarningを出すようにしたのだと思います。
BLASは、NumPyのバックエンドで動き、行列計算などを行うライブラリです。なので、OpenBLASのインストールしてから、OpenBLAS対応のNumPyを再インストールすることで対処できます。
なお、用いた環境は以下のとおりです。
- MacOS: 10.13.1
- Chainer: 3.1.0
- NumPy: 1.13.3 with pip
OpenBLASのインストール
$ brew tap homebrew/science $ brew install openblas
OpenBLAS対応のNumPyを再インストール
brew
でNumpyをインストールしていると、以下でいけるそうですが、pipでNumpyをインストールしている場合は、ソースからインストールし直します。
$ brew install numpy --with-openblas
なお、上記コマンドを試してみましたが、--with-openblas
というオプションはないと言われました...
NumPyのアンインストール
$ pip uninstall numpy
NumPyをソースからインストール
GitHubからソースをダウンロードし、設定ファイルを書き換えます。
$ git clone https://github.com/numpy/numpy $ cd numpy $ git checkout refs/tags/v1.13.3 $ cp site.cfg.example site.cfg
site.cfg の128行目あたりのコメントアウトを外し、以下のように修正します。brew
でインストールすると、デフォルトでは /usr/local/opt/openblas/ にインストールされていると思います。
[openblas] libraries = openblas library_dirs = /usr/local/opt/openblas/lib include_dirs = /usr/local/opt/openblas/include runtime_library_dirs = /usr/local/opt/openblas/lib
書き換えた設定ファイルが正しいか確認します。
python setup.py config
以下のようなログが表示されれば大丈夫だと思います。
openblas_info: FOUND: libraries = ['openblas', 'openblas'] library_dirs = ['/usr/local/opt/openblas/lib'] language = c define_macros = [('HAVE_CBLAS', None)] runtime_library_dirs = ['/usr/local/opt/openblas/lib']
ビルドしてインストールします。ビルドは数分かかります。
python setup.py build python setup.py install
OpenBLAS対応のNumPyが使用されているか確認
import numpy print(numpy.show_config())
以下のようにOpenBLASの情報が表示されていればOKです。
blas_mkl_info: NOT AVAILABLE blis_info: NOT AVAILABLE openblas_info: libraries = ['openblas', 'openblas'] library_dirs = ['/usr/local/opt/openblas/lib'] language = c define_macros = [('HAVE_CBLAS', None)] runtime_library_dirs = ['/usr/local/opt/openblas/lib'] ...
ChainerをインポートしてもWarningは発生しません。
import chainer