Action disabled: recent
[[NumPy]]

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が入る
programming/python/packages/numpy.txt · 最終更新: 2019/11/20 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0