NumPy
Pythonで数値演算を高速化できる外部パッケージ。NumPyの無いPythonなんて夏休みの無い八月のようなもの。
使い方などは公式や数多のブログに敵うわけ無いので、ここではハマりやすい点についてメモ。
インストール
Windows, Anacondaでのインストールを想定。
意図的に除かない限り、普通はAnacondaでの環境作成時に同時にインストールされている。
一応個別にインストールする場合は
> conda install numpy
MKL
NumPyは、インテル製のライブラリ MKL を使うことができる。MKLを使うと、より行列演算などに関して高速に動作する。
MKLの使用有無は NumPyのビルドの時点で決定し、使いたければそれ用にビルドする必要がある。 ビルド済みのものを入れる場合、一般的なインストール方法と使用有無は以下の通り。
パッケージマネージャ | MKL |
---|---|
Anaconda | 使う |
pip | 使わない(使うよう自前ビルドすることは可) |
gohlke氏のwheel | 使う |
MKLを使いたくない場合というのも稀にある(例えばPyinstallerでバイナリ化する際など。最終的なバイナリのサイズがかなり違ってくる)。
その場合、Anacondaでは nomkl
パッケージをインストールすると、使わないNumPyとなるらしい。
しかし、Windowsではそのパッケージは無効であり、基本的にはMKL入りしか選択肢が無い状況となる。
AnacondaのMKLによるエラー
Anacondaではmklもパッケージ化されていて、NumPyはmklパッケージに依存する形となる。 基本的にはmklパッケージがライブラリのDLLを適切に配置・パス設定してくれる……が、何かよくわからない条件下でこれに起因するエラーが襲いかかることがある。
import numpy
> python sample.py Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll.
エラーが発生するタイミングは、import時だったり、実際に関数を呼び出した時だったり。 原因は、およそ以下のいずれかと推測される。
- NumPyの要求するMKLのバージョンと、実際に読み込まれているMKLのバージョンが食い違う
- そもそも特定バージョンのMKLが、特定のWindowsで上手く動かない?
mkl関連のライブラリがある代表的な場所は、
C:\Windows\System32
- Python以外のプログラムのインストール時に入ることがある?
(Anaconda)\Library\bin
- ルート環境のMKL
(Anaconda)\envs\(env_name)\Library\bin
- 各環境のMKL
condaでは、どのmklがインストールされているかは conda list mkl
などでバージョンとビルド番号で区別できる。
原因1:NumPyとmklのバージョン不整合
アップデートのし忘れなどで、いつの間にか両者のバージョンが食い違ってしまっていた場合、NumPyまたはMKLのアップデートで解消するはず。
> conda update numpy mkl
原因2:パス設定
System32は普通は環境変数のPathの上位の方に設定されている。ここにMKLのdllがあると、優先的に読まれることになる。これがNumPyの要求するバージョンが異なるとエラーとなる。
対策としては、System32のmklは削除してもあんまり問題になった経験が無いので、mkl_xxx.dll
を削除して様子を見る。(バックアップは取っておく)
また、(Anaconda)\Library\bin
をPathに入れてたりすると、envs内の環境を使っているつもりでもルート環境のmklが読まれてしまうというケースもある。
コマンドラインから activate
した時は仮想環境用のPathが本来のPathより優先されるため実行できるが、PyCharmなどIDEを使っていると、IDEが環境を再現しようと追加したPathより本来のPathが優先され、エラーとなり、コマンドライン上の実行とIDE上の実行で挙動が異なる、ということもある。
原因3:MKLの相性?
Windows10で、mklバージョン2019.0や2018.0.3が上手く動かずエラーとなる報告がある。この場合もエラー内容は「Cannot load mkl_intel_thread.dll.
」
これらのバージョンのmklを避ければよいが、(執筆時点の)最新版が2019.0なので、conda update
では解消しない。
上記の記事によると2018.0.2なら動くので、mklをバージョン指定で上書きインストールする。mklとNumPyに依存するパッケージが多く、それらは少しだけ最新版からはダウングレードされてしまうが、ひとまずエラーは解消される。
> conda install mkl=2018.0.2
この原因の場合、今後mklパッケージの問題が解消されるまで、conda update --all
は行わない方がよい。
なお、自分の環境では、Windows7の方ではMKLのバージョンが2019.0でも動いていて、Windows10の方では上記と同様の現象が発生、2018.0.2に落として動いた。各サンプル数1なので他の条件が影響していることは十分考えられるが。
- 2018/12/30になおった?という報告がある。自分の環境では最新版にすると未だエラーは出る。よくわからん。
- 2019/08メモ: 最新版(mkl 2019.4、numpy 1.16.4)ではやはりエラーが出るが、「mkl 2019.1」「numpy 1.11.3」の組み合わせで行けることを確認
conda install mkl=2019.1
でこのverのnumpyが入る