Numpyに使われるBLASによって計算速度が変わるらしい【Python】
「numpy」の中では、BLASという数値演算ライブラリが実際の処理を担っています。
「conda install」と「pip install」のどちらでnumpyを入れるかによって使われるBLASが変わり、どのBLASを使うかでnumpyだけでなくこれに依存するライブラリ群においても処理速度に影響が出ます。
今回、BLASおよび実際の速度差と、どのBLASを使っているかの確認方法について簡単に調べましたので紹介いたします。
BLASとその種類
BLASとは
BLASについては以下のサイトの説明が非常にわかりやすかったので引用させていただきます。
BLASとは、Basic Linear Algebra Subprogramsの略です。難しく言うと、基本的な線形演算のライブラリ、簡単にいえば、行列やベクトルの基本的な計算をやってくれる関数群です。例えば、行列の積とか、ベクトルのノルムの計算、などです。これらの計算を実装すること(車輪の再開発)はやめて、ライブラリを使い、効率よく効率のよいコーディングを行いましょう、というのが趣旨です。
BLASの簡単な使い方
BLASはnumpyの裏でも使われているため、 どのBLASが numpy実行時に呼び出されるかによって計算時間に差が出ると言われています。
BLASの種類
BLASには様々な種類のものが開発されています。代表的なものを一部取り上げてみます。
OpenBLAS
BLASのオープンソース実装。pipでインストールしたnumpyでは、OpenBLASが内部で呼び出されて演算が行われる。
さまざまなCPUに対応しており、intelのSandy Bridge CPUに対してIntel MKLと同等の速度を出せる言われている。マルチスレッド機能でよく知られており、コアの数と高速化が良く比例するそう。
Intel MKL ( Intel Math Kernel Library )
Intel開発のBLAS。Intel製CPUのみサポートしており、他社製のCPUでは使えない。Xeon やCore iシリーズ、Atomなどの Intel製CPU に最適化されているため、これらがCPUに使われているパソコンではintel MKLを演算ライブラリとして利用した方が計算が高速になる。AnacondaやMinicondaで「conda install」でインストールしたnumpyはintel MKLが利用される。
ATLAS ( Automatically Tuned Linear Algebra Software )
フリーのBLASの1つ。名前の通り、チューニングすることによってインストールするハードウェアに最適なパラメータを設定し、高速な演算を実現する。
BLASの違いによる計算時間の差
numpyのうらで使われるBLASが処理速度に影響するということはnumpyに依存したライブラリの実行速度に関わることを意味します。つまり、scipy, pandas, scikit-learn, tensorflowにも影響します。
多くの技術者の間で、BLASの違い(conda installとpip installの違い)に対するベンチマークの比較が行われていまが、インテル® デベロッパー・ゾーンに公開されているものを例にとってみます。
scipyによる行列計算で、右に行くほど複雑な行列同士の掛け算にかかる時間を示しており、intel MKLがATLASより高速に処理できています。
以下はAnaconda公式によるものです。 conda installとpip installのいずれかでインストールしたtensorflowで、各ディープラーニングモデルにおける1秒あたりのトレーニングできた画像の枚数を比較していますが、最大8倍も差が出ています。
ほかにもpandasやscikit learnなども比較されています(The performance of Intel vs. Anaconda vs. vanilla Python – my personal benchmark)。condaは独自のライブラリインストール・管理をしているため、多くの場合に有利な結果になっているようです。
PythonでのBLASの確認方法
__config__.show()
を実行するだけです。
import numpy as np np.__config__.show()
>>
mkl_info: libraries = ['mkl_rt’] library_dirs = ['C:/Users/’] define_macros = [('SCIPY_MKL_H’, None), ('HAVE_CBLAS’, None)] include_dirs = ['C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2019.0.117\\windows\\mkl’, 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2019.0.117\\windows\\mkl\\include’, 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2019.0.117\\windows\\mkl\\lib’, 'C:/Users/programing/Miniconda3/envs/ML\\Library\\include’]
mkl_infoと表示されればintel MKLが使われています。
ディスカッション
コメント一覧
まだ、コメントがありません