2019年12月25日水曜日

Ryzen 9 + Anaconda + numpy

Windows用AnacondaのnumpyはIntel Math Kernel Library(MKL)という数学演算ライブラリを利用している。というか、MKL以外のOpenBLASなどを使おうとするとすごく大変らしい(MacOSX, Linuxでは可能)。Windows用Anacondaのnumpyを用いると、演算のタスクを複数のコアに勝手に分散して高速化してくれる。しかし、parallel pythonなどで関数単位のジョブを複数のコアに分散させて並列計算する場合、1ジョブの演算タスクは1コア内で完結してくれないと困る。

こういう場合はmkl-service パッケージを使う
> conda install -c anaconda mkl-service


として、各コアに分散する関数の最初のほうに

import mkl
mkl.set_num_threads(1)

として、mklに最小のスレッド数を1にせよと指令を出すと1コア内で完結するようになる。

さらに問題なのは、AMDのRyzen 9 3900xを積んだPCでWindows用Anaconda+numpyを利用するときである。PCを買ってから気づいたのだけど、Ryzen 9はIntelが開発しているMKLと大変相性が悪い。開発中のmfapyはnloptをソルバとして用いているので、

1.下記のように仮想環境mfapyを作成する。
> conda create -n mfapy -c conda-forge nlopt numpy scipy matplotlib

(現在python 3.8.0がインストールされます

2.この記事を参考にmklの機能を止める

> conda install mkl -c intel --no-update-deps
さらに環境変数MKL_DEBUG_CPU_TYPEを設定する。
MKL_DEBUG_CPU_TYPE=5

3.mkl-serviceモジュールを使用できるようにする。
> conda install -c anaconda mkl-service 

こうすると、上記のmkl.set_num_threads(1)を設定することで、演算タスクを
1コア内に完結できるようになる。
どうもRyzen上でも、mkl-serviceによるスレッド数制御は可能らしい。
一方、インテルcpuに特有の命令は2)の操作で殺すことができているようだ。





0 件のコメント:

コメントを投稿