kumilog.net

データ分析やプログラミングの話などを書いています。

MacOSでChainerを使うときのWarningに対処する

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