最近、condaで入れるNumpyの方が、pipで入れるNumpyより動作が早いことが少し話題になっています(元記事は最近ではないのですが)。本記事では、scikit-learnもインストールを工夫すれば、より高速に動作することを解説します。
はじめに
記事、「Anaconda の NumPy が高速みたいなので試してみた」
https://tech.morikatron.ai/entry/2020/03/27/100000
を最近Twitterのタイムラインで何度も見かけました(元記事は20年3月に記載されたものですが)。
condaでインストールするNumpyの方が、pipでインストールするNumpyより早い、というお話です。
なぜ早いの?
上記の記事では、CPUで「Intel Core i7-9750H」を使用しています。
このCPUの仕様は以下です。
https://www.intel.co.jp/content/www/jp/ja/products/processors/core/i7-processors/i7-9750h.html
この仕様の**「命令セット拡張」に「Intel® SSE4.1, Intel® SSE4.2, Intel® AVX2」**と記載さているのがミソです。
命令セット拡張にAVX2が搭載されています。
その他、割と新しい高性能のIntel CPUではAVX-512も搭載されています。
AVXについては、以下ページが詳しいですが、ストリーミングSIMD拡張命令の後継です。
「要は、1命令で複数の演算を実行できる機能です」
このAVXのAVX2以上を使用して、数学演算を高速化するインテルのCPUの機能が**Intel MKL(Math Kernel Library)**です。
https://www.xlsoft.com/jp/products/intel/perflib/mkl/index.html
種々計算をAVX2やAVX-512で実施することで、高速化してくれます。
condaでインストールするNumpyはCPUがAVX対応であれば、このIntel MKLを使用して計算するので、処理が早くなります。
Intelの頑張り
GPU時代のなか、Intelも頑張っていて、2017年あたり、
Intel MKL はじめ、Intel CPUでの高速化に対応した、Numpyやsckit-learnのライブラリを公開しました。
pip install intel-scikit-learn
https://pypi.org/project/intel-scikit-learn/
pip install intel-numpy
https://pypi.org/project/intel-numpy/
これらであれば、pipでインストールしても、はじめから高速バージョンを使えます。
こういうバージョンも昔Intelから出されたのですが、
本家のNumpyやsklearnにバージョンが追いついていない、保守されていないので、
これらの使用はおすすめはしないです。
scikit-learnの高速化
最初に紹介した記事、「Anaconda の NumPy が高速みたいなので試してみた」
https://tech.morikatron.ai/entry/2020/03/27/100000
の文中でも、
他にも色々なモジュールが Intel MKL を採用してました。素晴らしい!
NumPy
NumExpr
SciPy
Scikit-Learn
Tensorflow … Windows だと tensorflow-mkl という別パッケージになっている
PyTorch … こちらは pip 経由でも Intel MKL を採用しているそうです
とあるように、condaでインストールすると、Intel MKLを使用する高速なバージョンが勝手にインストールされます。
ただ、一番早く動作させたい場合は、scikit-learnのインストールのページの案内に沿いましょう。
https://scikit-learn.org/stable/install.html
こちらページの
「Third party distributions of scikit-learn」
に書かれている、
「Intel conda channel」
Intel conda channel
Intel maintains a dedicated conda channel that ships scikit-learn:
$ conda install -c intel scikit-learn
This version of scikit-learn comes with alternative solvers for some common estimators. Those solvers come from the DAAL C++ library and are optimized for multi-core Intel CPUs.
Note that those solvers are not enabled by default, please refer to the daal4py documentation for more details.
Compatibility with the standard scikit-learn solvers is checked by running the full scikit-learn test suite via automated continuous integration as reported on https://github.com/IntelPython/daal4py.
の、Intel conda channelでsckit-learnを入れれば、Intel MKLだけでなく、
scikit-learnのいくつかの処理が、Intel multi-coreに最適化された関数処理に置き換わります。
ですので、最速バージョンでのscikit-learnを使用したい場合は、
$ conda install scikit-learn
ではなく、
$ conda install -c intel scikit-learn
でのインストールをおすすめします(Intel AVX2以上対応CPU環境で)。
さいごに
AWSもDeepLearningイメージも、AzureのDSVM(Data Science Virtual Machines)もcondaをベースに管理されています。
そして、condaでscikit-learnがインストールされています。
それらがIntel最適化版かは私は知りません(誰かご存知であれば教えていただきたいです)。
自分で仮想環境をcondaで作り直した場合には、上記の高速版を入れれば良いのですが・・・
(IaaSのマシンのCPUを調べ、AVX2に対応しているかは調べる必要があります。やすいマシンだとAVXにしか対応していない場合がある)
以上、Conda Numpyのようにscikit-learnも高速化する方法でした。
(私はあまりCPU周り強くないので、勘違いしている点があればぜひコメントください)
備考
【情報発信】
最近私は、自分が面白いと思った記事やサイト、読んだ本の感想などのAIやビジネス、経営系の情報をTwitterで発信しています。
小川雄太郎@ISID_AI_team
https://twitter.com/ISID_AI_team
私が見ている情報、面白い、重要だ!と思った内容を共有しています。
【その他】私がリードする、AIテクノロジー部開発チームではメンバを募集中です。興味がある方はこちらからお願い致します
【免責】本記事の内容そのものは著者の意見/発信であり、著者が属する企業等の公式見解ではございません