scikit-learnをコード変更なしで最大100倍高速化!Intel製AIアクセラレータ「scikit-learn-intelex」を試す
bash ファイル名.sh を実行してください(中身を一度確認してから実行すると安心です)。
(macOS / Linux 環境が必要) scikit-learnをコード変更なしで最大100倍高速化!Intel製AIアクセラレータ「scikit-learn-intelex」を試す
ひとことでいうと
scikit-learn-intelex(scikit-learn 拡張)は、Intel が開発した機械学習の高速化ライブラリです。既存コードの冒頭にたった2行追加するだけで、機械学習の処理速度を 10〜100倍 に高速化できます。内部では Intel の高性能データ解析ライブラリ「oneDAL」を使い、CPU・GPU のハードウェア性能を最大限に引き出す設計になっています。無償で使えるオープンソースソフトウェアであり、pip や conda から簡単にインストール可能です。データ量が増えるほど効果が大きくなるため、大規模な機械学習プロジェクトに特に向いています。
こんな人におすすめ
-
大量データを扱うデータサイエンティスト — 数百万件規模のデータで scikit-learn の学習や推論が遅いと感じている方に最適です。コードをほぼ書き換えずに劇的なスピードアップが期待できます。
-
既存の scikit-learn コードを持つ機械学習エンジニア —
patch_sklearn()を2行追加するだけで移行が完了するため、これまで作ってきたモデル学習の仕組みをそのまま活かせます。書き直しの手間がほとんどかかりません。 -
Intel CPU・GPU を搭載したマシンを使っている開発者 — Intel ハードウェアの特性を最大限に活かす設計になっています。同じコードでも、Intel 環境ではより大きな高速化の恩恵を受けられます。
インストール・使い方
Step 1: パッケージをインストールする
ターミナル(文字を入力してパソコンに命令を送る画面)を開き、次のコマンドを入力してください。コピー&ペーストで大丈夫です。
pip install scikit-learn-intelex
pip(ピップ)とは Python のパッケージ管理ツールで、このコマンド一行でライブラリが自動でダウンロード・インストールされます。あらかじめコンパイル済みのファイルが配布されているため、C++ などの開発環境がなくても問題ありません。
conda(アナコンダ環境)を使っている場合は、以下のコマンドでもインストールできます。
conda install scikit-learn-intelex -c conda-forge
Python 3.10〜3.14、scikit-learn 1.0〜1.8 という幅広いバージョンに対応しています。
Step 2: scikit-learn にパッチを当てる(最も簡単な方法)
「パッチを当てる」とは、既存のソフトウェアを一時的に差し替えて機能を変える操作のことです。次の2行をスクリプトの冒頭に追加するだけで、scikit-learn の内部処理が自動的に高速版に切り替わります。
from sklearnex import patch_sklearn
patch_sklearn()
# これ以降は通常の scikit-learn を使うだけでよい
from sklearn.cluster import DBSCAN
import numpy as np
X = np.array([[1., 2.], [2., 2.], [2., 3.],
[8., 7.], [8., 8.], [25., 80.]], dtype=np.float32)
clustering = DBSCAN(eps=3, min_samples=2).fit(X)
print(clustering.labels_) # [ 0 0 0 1 1 -1]
patch_sklearn() を呼び出した後は、通常どおりの scikit-learn コードがそのまま動きます。API(ライブラリの使い方のルール)を覚え直す必要はありません。
Step 3: パッチなしでモジュールを直接使う
sklearnex モジュールから直接クラスをインポートする方法もあります。パッチを当てたくない場面や、ファイルごとに使い分けたい場合に便利です。
from sklearnex.cluster import DBSCAN # sklearnex から直接インポート
import numpy as np
X = np.array([[1., 2.], [2., 2.], [2., 3.],
[8., 7.], [8., 8.], [25., 80.]], dtype=np.float32)
clustering = DBSCAN(eps=3, min_samples=2).fit(X)
print(clustering.labels_)
この方法では、パッチなしでも高速化された DBSCAN を使えます。既存コードと共存させながら、高速化したい部分だけを選んで差し替えることも可能です。
Step 4: Intel GPU で実行する(オプション)
Intel GPU を搭載している環境では、処理を GPU にオフロード(転送して実行)することができます。GPU 実行には別途 Intel oneAPI ツールキットのインストールが必要です。
from sklearnex import patch_sklearn, config_context
patch_sklearn()
from sklearn.cluster import DBSCAN
import numpy as np
X = np.array([[1., 2.], [2., 2.], [2., 3.],
[8., 7.], [8., 8.], [25., 80.]], dtype=np.float32)
with config_context(target_offload="gpu:0"):
clustering = DBSCAN(eps=3, min_samples=2).fit(X)
config_context を使って target_offload="gpu:0" を指定すると、with ブロックの中だけ処理が GPU に切り替わります。GPU の準備が整っていれば、CPU 実行よりもさらに高速な処理が期待できます。
ブラウザで試す(デモ)
ブラウザ上でインタラクティブに sklearnex の動作を確認できるデモが用意されています。サンプルデータのサイズや DBSCAN のパラメータ(eps:データ点を同じグループとみなす距離の閾値、min_samples:グループを形成するのに必要な最小点数)を変えながら、クラスタリング結果を可視化して体験できます。インストール不要で scikit-learn-intelex の API を試せるため、「まず動きを見てみたい」という方の入り口として最適です。
動かしてみた
Python 3.12 環境でリポジトリの構成を確認しました。ソースコードは onedal/ ディレクトリに Python と C++ が混在する形で整理されており、内部の仕組みがしっかり作り込まれていることがわかります。
generator/ ディレクトリにはコードジェネレータが用意されており、oneDAL の C++ バインディング(Python から C++ のコードを呼び出すための橋渡し)を自動生成する仕組みが確認できました。手作業で書くと膨大になる連携コードを自動化することで、保守性を高めています。
CI/CD(継続的インテグレーション:コードの変更を自動でテスト・確認する仕組み)は CircleCI と Azure Pipelines で運用されており、GPU 向けテストの自動実行スクリプトも整備されています。アップデートのたびに幅広い環境での動作が確認される体制が整っています。
PyPI 配布版では事前コンパイル済みのホイール(インストール用パッケージ)が提供されているため、pip install scikit-learn-intelex 一行で即座に使い始められます。Intel 以外の CPU 環境でも動作しますが、Intel 環境ではより大きな高速化の恩恵を受けられます。
実践のコツ — はじめの一歩
- まず最小コードで動作を確認する: 次のコードでパッチあり・なしの処理時間を比べてみましょう。データ件数(
n_samples)を増やすほど差が大きくなります。
from sklearnex import patch_sklearn
patch_sklearn()
from sklearn.svm import SVC
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
import time
X, y = make_classification(n_samples=50000, n_features=20, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
start = time.time()
clf = SVC(kernel='rbf')
clf.fit(X_train, y_train)
elapsed = time.time() - start
print(f"Accuracy: {clf.score(X_test, y_test):.4f}")
print(f"Training time: {elapsed:.2f}s")
-
patch_sklearn()は Python ファイルの一番上に書く: 他の sklearn インポートより前に呼び出すことで、パッチが確実に適用されます。順番を間違えると効果が出ないことがあります。 -
対応アルゴリズムを事前に確認する: すべての sklearn アルゴリズムが高速化されるわけではありません。DBSCAN・SVM・PCA・Random Forest など主要なものが対応しています。公式ドキュメントでサポート一覧を確認してから使うと安心です。
-
データ型は
float32を優先する:float64よりfloat32のほうが SIMD 命令(後述)の恩恵を受けやすく、さらなる高速化が期待できます。配列を作る際にdtype=np.float32を指定するだけで対応できます。 -
まず CPU で試してから GPU に移行する: GPU オフロードには追加の環境構築が必要です。最初に CPU で動作確認してから、必要に応じて GPU を試す順序がスムーズです。
活用アイデア
-
金融データの異常検知: 大量の取引データに対して Isolation Forest や One-Class SVM を使った不正検出を高速化できます。学習コストが下がることで再学習のサイクルを短縮し、よりリアルタイムに近い不正検出パイプラインを構築できます。
-
医療・バイオインフォマティクス: 高次元の遺伝子発現データに対して PCA(主成分分析)や Random Forest を高速実行できます。研究の試行錯誤サイクルを大幅に短縮し、より多くの仮説を素早く検証できます。
-
産業 IoT・エッジ AI: Intel CPU を搭載した産業用エッジデバイスで、センサーデータの機械学習推論を高速処理するシステムを構築できます。消費電力を抑えながらスループットを向上させられるため、工場の品質管理や設備監視への活用に向いています。
-
夜間バッチ処理の高速化: 大量のデータを定期的に処理するバッチ処理に組み込むことで、実行時間を大幅に短縮できます。夜間バッチが朝までに終わらないといった問題の解消にも役立ちます。
-
機械学習コンペティション(Kaggle など): 大規模なデータセットを使ったコンペで、素早くモデルを試行錯誤したいときに重宝します。ベースラインモデルの学習時間を短縮することで、特徴量エンジニアリングやハイパーパラメータ調整に使える時間が増えます。
-
機械学習の学習・教育目的: scikit-learn を勉強中の方が、高速化の仕組みを体感しながら機械学習の基礎を習得するのに役立ちます。同じコードでパフォーマンスが変わる経験が、ハードウェアとアルゴリズムの関係を直感的に理解する助けになります。
用語とポイント解説
scikit-learn(サイキット・ラーン) 機械学習の定番 Python ライブラリです。かんたんに言うと、「分類・回帰・クラスタリングなど多様な機械学習アルゴリズムを Python から手軽に使えるツール集」です。世界中のデータサイエンティストや研究者に広く使われており、scikit-learn-intelex はこのライブラリの処理を高速化するために開発されました。
oneDAL(ワン・ダル) Intel が開発した高性能データ解析ライブラリです。かんたんに言うと、「Intel ハードウェアの性能を最大限に引き出すために最適化された計算エンジン」です。scikit-learn-intelex はこのライブラリを内部バックエンドとして使うことで、機械学習アルゴリズムの計算を大幅に高速化しています。
patch_sklearn()(パッチ・サイキット・ラーン) scikit-learn の内部実装を oneDAL 最適化版に動的に差し替える関数です。かんたんに言うと、「scikit-learn の中身を高速版にそっくり取り換えるスイッチ」です。呼び出した後は通常の scikit-learn コードがそのまま動くため、既存のプログラムをほとんど書き換えずに高速化できます。
sklearnex(スキックラーン・エックス)
scikit-learn-intelex のモジュール名です。かんたんに言うと、「from sklearnex import ... と書いてアクセスする、高速版 scikit-learn の入り口」です。patch_sklearn() を使って既存コードをまるごと高速化するほか、クラスを直接インポートして使う方法も提供しています。
config_context(コンフィグ・コンテキスト)
処理を実行するデバイス(CPU または GPU)を指定するコンテキストマネージャです。かんたんに言うと、「with ブロックの中だけ、処理を指定したデバイスに切り替えるための設定」です。target_offload="gpu:0" のように書くことで、特定の計算処理だけを GPU に転送して実行できます。
SIMD / AVX-512(シムド / エーブイエックス・ゴヒャクジュウニ) CPU が複数のデータをまとめて1命令で処理できる拡張命令セットです。かんたんに言うと、「1回の作業で複数の計算を同時にこなすことで、全体の処理を速くする仕組み」です。Intel の現代的な CPU に搭載されており、scikit-learn-intelex はこの機能をフルに活用して高速化を実現しています。
oneAPI(ワン・エーピーアイ) Intel が推進するオープンな並列プログラミングフレームワークです。かんたんに言うと、「CPU・GPU・FPGA(プログラム可能なチップ)など異なるハードウェアを統一した書き方で扱えるプログラミング規格」です。scikit-learn-intelex の GPU オフロード機能は、この oneAPI の仕組みを通じて実現されています。
ホイール(wheel)
Python パッケージの配布形式の一つです。かんたんに言うと、「インストールをすぐ始められるように、あらかじめビルド済みにしたパッケージの形式」です。scikit-learn-intelex は PyPI でホイール形式で配布されているため、C++ コンパイラなどの開発環境がなくても pip install 一行で使い始められます。
オフロード(offload)
処理を CPU から GPU などの別のデバイスに転送して実行することです。かんたんに言うと、「重い計算を GPU に任せて CPU の負担を減らす操作」です。scikit-learn-intelex では config_context を使って特定の処理ブロックだけ GPU にオフロードできるため、柔軟な使い分けが可能です。
scikit-learn-intelex は、既存の機械学習コードをほぼ変えずに大幅な高速化を実現できる、実用性の高いライブラリです。ぜひ大量データを使った異常検知パイプラインの構築や、Kaggle などのコンペでのモデル学習高速化などに活用してみてはいかがでしょうか。