conda Numpyのようにscikit-learnも高速化する方法

最近、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命令で複数の演算を実行できる機能です」**

https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0SIMD%E6%8B%A1%E5%BC%B5%E5%91%BD%E4%BB%A4

この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テクノロジー部開発チームではメンバを募集中です。興味がある方はこちらからお願い致します](https://www.isidgroup.com/u/job.phtml?job_code=430)


【免責】本記事の内容そのものは著者の意見/発信であり、著者が属する企業等の公式見解ではございません

---