トップ 履歴 一覧 ソース 検索 ヘルプ RSS ログイン

scikit-learn-intelexによる機械学習プログラムの高速化


キーワード

最終更新時間:2021年05月24日 15時11分11秒
アフィリエイト・広告について
プライバシーポリシー

はじめに

筆者は、普段[1]WSL2にインストールしたminiconda環境を使用しています。割と頻繁にアップデートしているのですが、先日 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ライブラリ (以下、intelexライブラリ、と記述します) について、初めて知りましたが、Intelが開発した、scikit-learnの実行速度を加速するライブラリだそうです。


https://intel.github.io/scikit-learn-intelex/

同じくIntelによる、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 チャネルの最新版に更新する、ということをしました。このあたりは、筆者が他に導入しているライブラリや、タイミングによるものかもしれないので、参考として捉えてください。

特に問題なく、インストールできると思います。

ベンチマーク

さて、intelexライブラリの高速化の効果を確認してみます。といっても、筆者は (あらゆる分野に) 素人なので、ちゃんとしたベンチマークの条件や方法は知りません。そもそも、そういうのはIntelが公表していますが。ですので、より簡易な「典型的な機械学習コードの実行時間を比較する」ということをしてみます。

検証用のコードは、scikit-learnの make_classification() 関数で生成した架空のデータを、SVC() で各種パラメータをグリッドサーチしてモデリングする、というものです。以下に、プログラムの一部を示します。実際には、Jupyter Labで実行しましたが、そのノートブックは、もう少し下に示しています。

デスクトップPCのRyzenに加え、ノートPCのIntel Core i5でも検証したので、n_jobs はCore i5のスペックに合わせています。

intelexライブラリを使用するには、sklearnex ライブラリの patch_sklearn() 関数を読み込み、実行します。ダイナミック・パッチということで、特別な作業など必要なく、intelex (oneDAL) ライブラリを読み込むように設定が変わるようです。また、intelexライブラリを使う場合にも、コードの変更は不要です。「ふつう」のscikit-learnのコードのまま、高速化の恩恵を受けることができます。ただし、各アルゴリズムごとに、一部のオプションをサポートしていないので、ドキュメントを参照してください。


なお、intelexライブラリの使用を中止し、オリジナルのscikit-learnに切り替えるには、unpatch_sklearn() 関数をインポートし、実行します。

一連のベンチマーク手順を記述したノートブック (をHTMLにエクスポートしたもの) を以下に示します。

Core i5のノートPC[2]で、実行に9.34秒かかるコードが、6.69秒で実行できるということで、全く同じコードで、14%程度の高速化が実現できました。なお、ずいぶん実行時間が短いコードを使うな、と思うかもしれませんが、もっとパラメータ数を増やしてグリッドサーチの範囲を広げたり、CVの数を増やしても、あまり速度向上の効果はありませんでした。[3]一方で、この15%程度の差は、計算が処理の大部分を占めるコードについて、何度計算を繰り返しても確実に得られるので、intelexライブラリを使うと、機械学習の計算処理が速くなると言えると思います。

特にデメリットもない[4]ので、とりあえずライブラリをインストールして、読み込むと良いのではないでしょうか。ということで、scikit-learn-intelexライブラリを使った機械学習プログラムの高速化について紹介しました。

  • [1]というほどPythonを常用していませんが。
  • [2]いちおう、メモリは20GB積んでありますが。
  • [3]ある程度速くはなりますが。グリッドサーチや交差検証では、モデルの計算以外の部分で時間がかかり、1回の計算が高速化する効果よりも、イテレーションの組み立てや並列処理の待ちのほうが影響が大きかったのかもしれません。
  • [4]サポートしていないオプションを使いたい、という時にはあるかもしれませんが。

カテゴリ: [Python,データサイエンス]