こんにちは、モリカトロンでプログラマおじさんをやってる岡島です。
pip install で導入した NumPy と conda install で導入した NumPy とでは内部で使われているライブラリが違い、後者の方が高速だという記事を見つけました。
要約すると
- Anaconda と pip では NumPy に使われている数値計算ライブラリが違っている
- pip が提供する Numpy は OpenBLAS を使っている
- Anaconda が提供する NumPy は Intel MKL (Math Kernel Library) を使っている
- 両者を比較すると、Anaconda が提供する NumPy のほうが速い
という事みたいです。
今まで僕は Python のパッケージ管理を pip で行ってきましたが、Anaconda を導入して conda によるパッケージ管理に移行するだけでプログラムが高速になるのなら 導入したいところです。
ということで、実際に両者の速度を比較してみました。
- 速度比較に用いたプログラム
- 比較に使用した Python 環境
- 実験1: Intel CPU を搭載した PC の場合
- 実験2: AMD CPU を搭載した PC の場合
- Numpy だけ速いの?
- まとめ
速度比較に用いたプログラム
Intel Developer Zone に Intel MKL を使った NumPy が高速だという記事があり、そこで検証用の Python プログラムが掲載されていたので、それを使いました。
比較に使用した Python 環境
比較をするのに必要なので、Anaconda を導入し、新規に作成した Conda 環境で比較を行いました。
- Conda: 4.7.12
- pip: 19.3.1
- Python: Python 3.6.10
- NumPy: 1.18.1
Numpy は conda と pip という異なるパッケージ管理ツールのものに差し替える必要があるので、以下のような手順で入れ替えを行っています。
- conda -> pip
- conda uninstall numpy
- pip install numpy==1.18.1
- pip -> conda
- pip uninstall numpy
- conda install numpy==1.18.1
[注意] conda と pip は混ぜるな危険
比較実験をした後に指摘されて知ったのですが、conda と pip は個別にパッケージ管理をしており、基本的には pip を使わずに conda を使ってパッケージをインストールするべきだそうです。
conda にないパッケージのインストールなど、限られた場合に限り pip を使うのが良いとのことなので 皆さん気を付けましょう。
実験1: Intel CPU を搭載した PC の場合
Intel が提供するライブラリなので、Intel の CPU を使って比較するのが一番だろうと思い、まずは以下のようなスペックのノート PC で実験してみました。
- CPU: Intel Core i7-9750H
- Memory: 64GB
- OS: Ubuntu 18.4.4 LTS
結果
かかった時間を比較したのが以下のグラフです。 縦軸の単位は秒なので、短いほうが高速です。
確かに Anaconda 版 Numpy は高速です。
Intel の記事ほどの差はない (Intel の記事では比較対象が違うため当然) ようですが、それでも今すぐ Anaconda を導入したくなるような速度差です。
実験2: AMD CPU を搭載した PC の場合
「Intel の CPU に最適化されたライブラリを使ってるから Intel の CPU だと速い」ということはわかりましたが、弊社最速マシンの CPU は AMD Ryzen Threadripper (第三世代) 。
仮に AMD の CPU だと思ったほど高速化されないなんてことがあると「やっぱり Intel CPU にしておけばよかった…」なんてことになりかねません。
ということで、以下の AMD CPU の PC でも速度比較をしてみました。
- CPU: AMD Ryzen Threadripper 3970X
- Memory: 128GB
- OS: Ubuntu 18.4.4 LTS
結果
かかった時間を比較したのが以下のグラフです。 縦軸の単位は秒で、短いほうが高速です。
こっちも高速でした。良かった…
Intel MKL は AMD の CPU でもちゃんと高速に動作するし、結果のグラフを見る感じでは 先ほどの Intel CPU 以上に速度差があるようです。
Numpy だけ速いの?
Intel MKL を採用した Anaconda 版 Numpy はめちゃくちゃ速いことがわかりました。 こんなに Numpy が速くなるなら、他のモジュールでも Intel MKL を使ってくれればいいのに…
と思って調べてみたら、他にも色々なモジュールが Intel MKL を採用してました。素晴らしい!
- NumPy
- NumExpr
- SciPy
- Scikit-Learn
- Tensorflow … Windows だと tensorflow-mkl という別パッケージになっている
- PyTorch … こちらは pip 経由でも Intel MKL を採用しているそうです
ついでに Intel® Distribution for Python という Python そのものも Intel が最適化したディストリビューションもあるようです。
まとめ
- NumPy などの数値計算モジュールは、Conda のパッケージのほうが高速
- Intel MKL を採用したモジュールは AMD の CPU でも同等に高速に実行される
- conda 環境での pip の使い方には注意が必要。詳しくはこちらを参照
この記事を執筆している現在、僕はもう Anaconda を導入し conda でパッケージ管理をするようになりました。
何もしないでプログラムがより高速に動くのは本当に素晴らしいです。 まだ Anaconda を導入されていない方はぜひ一度お試しください。