{{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 "
"}} }} Core i5のノートPC{{fn いちおう、メモリは20GB積んでありますが。}}で、実行に9.34秒かかるコードが、6.69秒で実行できるということで、全く同じコードで、14%程度の高速化が実現できました。なお、ずいぶん実行時間が短いコードを使うな、と思うかもしれませんが、もっとパラメータ数を増やしてグリッドサーチの範囲を広げたり、CVの数を増やしても、あまり速度向上の効果はありませんでした。{{fn ある程度速くはなりますが。グリッドサーチや交差検証では、モデルの計算以外の部分で時間がかかり、1回の計算が高速化する効果よりも、イテレーションの組み立てや並列処理の待ちのほうが影響が大きかったのかもしれません。}}一方で、'''この15%程度の差は、計算が処理の大部分を占めるコードについて、何度計算を繰り返しても確実に得られるので、intelexライブラリを使うと、機械学習の計算処理が速くなる'''と言えると思います。 特にデメリットもない{{fn サポートしていないオプションを使いたい、という時にはあるかもしれませんが。}}ので、とりあえずライブラリをインストールして、読み込むと良いのではないでしょうか。'''ということで、scikit-learn-intelexライブラリを使った機械学習プログラムの高速化について紹介しました。''' !!!注 {{footnote_list}} ---- カテゴリ: {{category Python,データサイエンス}}