{{b_center
{{ref_ex_image sklearn-intelex_top.png,,size:60%,nolink}}
}}
{{outline}}
!!!はじめに
筆者は、普段{{fn というほどPythonを常用していませんが。}}WSL2にインストールした[miniconda|https://docs.conda.io/en/latest/miniconda.html]環境を使用しています。割と頻繁にアップデートしているのですが、先日 ''conda update --all'' とすると、以下のメッセージが表示されました。
Installed package of scikit-learn can be accelerated using scikit-learn-intelex.
More details are available here: https://intel.github.io/scikit-learn-intelex
For example:
$ conda install scikit-learn-intelex
$ python -m sklearnex my_application.py
何やら、「'''scikit-learn-intelexライブラリを使うと、scikit-learnが速くなるよ'''」とあります。''conda'' コマンドで気軽にインストールできるようなので、試してみました。
そもそも、[scikit-learn-intelexライブラリ|https://intel.github.io/scikit-learn-intelex/] (以下、intelexライブラリ、と記述します) について、初めて知りましたが、Intelが開発した、scikit-learnの実行速度を加速するライブラリだそうです。
{{b_center
{{ref_ex_image sklearn-intelex_web.png,,size:30%,nolink}}
https://intel.github.io/scikit-learn-intelex/
}}
同じくIntelによる、[oneDAL|https://github.com/oneapi-src/oneDAL]という (C++言語の) ライブラリを使い、高速化するようです。そして、"seamless way to speed up your Scikit-learn application" とあるように、'''既存のscikit-learnプログラムに手を加えずに、高速化ができる'''ということです。Intelによるものですが、筆者はデスクトップPCでAMDのRyzen 9を使っていて、'''Ryzenでも高速化が確認できました。'''
'''なお、Google Colabでは、他のライブラリとの依存関係によりインストールできませんでした。'''依存関係を丹念に追っていけばインストールできるかもしれませんが、そこまではしていません。
!!!scikit-learn-intelexのインストール
それでは、intelexライブラリをインストールします。ライブラリは、''conda'' コマンドでも ''pip'' コマンドでもインストールできます。筆者は、上述のようにminicondaを使っているので、''conda'' コマンドを使いました。なお、上記のメッセージにあるように、ライブラリ自体はメインの ''anaconda'' チャネルに登録されていますが、筆者の環境では依存関係により、インストールできませんでした。一方、''conda-forge'' チャネルに登録されているものは、インストールできたので、ここでは、はじめに ''conda-forge'' からインストールし、''conda update'' コマンドで ''anaconda'' チャネルの最新版に更新する、ということをしました。このあたりは、筆者が他に導入しているライブラリや、タイミングによるものかもしれないので、参考として捉えてください。
{{tag ""}}
特に問題なく、インストールできると思います。
!!!ベンチマーク
さて、intelexライブラリの高速化の効果を確認してみます。といっても、筆者は (あらゆる分野に) 素人なので、ちゃんとしたベンチマークの条件や方法は知りません。[そもそも、そういうのはIntelが公表していますが。|https://intel.github.io/scikit-learn-intelex/#follow-us-on-medium]ですので、より簡易な「典型的な機械学習コードの実行時間を比較する」ということをしてみます。
検証用のコードは、scikit-learnの ''make_classification()'' 関数で生成した架空のデータを、''SVC()'' で各種パラメータをグリッドサーチしてモデリングする、というものです。以下に、プログラムの一部を示します。実際には、Jupyter Labで実行しましたが、そのノートブックは、もう少し下に示しています。
{{tag ""}}
デスクトップPCのRyzenに加え、ノートPCのIntel Core i5でも検証したので、''n_jobs'' はCore i5のスペックに合わせています。
'''intelexライブラリを使用するには、''sklearnex'' ライブラリの ''patch_sklearn()'' 関数を読み込み、実行します。'''ダイナミック・パッチということで、特別な作業など必要なく、intelex (oneDAL) ライブラリを読み込むように設定が変わるようです。また、'''intelexライブラリを使う場合にも、コードの変更は不要です。'''「ふつう」のscikit-learnのコードのまま、高速化の恩恵を受けることができます。ただし、各アルゴリズムごとに、一部のオプションをサポートしていないので、[ドキュメント|https://intel.github.io/scikit-learn-intelex/algorithms.html#sklearn-algorithms]を参照してください。
{{tag ""}}
{{tag ""}}
なお、intelexライブラリの使用を中止し、オリジナルのscikit-learnに切り替えるには、''unpatch_sklearn()'' 関数をインポートし、実行します。
一連のベンチマーク手順を記述したノートブック (をHTMLにエクスポートしたもの) を以下に示します。
{{b_center
{{tag "