This site tracks scikit-learn's performance across machines, builds and accelerated backends. It shows which workloads benefit from scikit-learn-intelex or an Array API backend, and when a different BLASBasic Linear Algebra Subprograms: the library that runs the matrix and vector products of NumPy and SciPy. OpenBLAS and MKL are two implementations of it./OpenMPStandard for running the loops of compiled code on several threads. scikit-learn's Cython code (HistGradientBoosting, KMeans, ...) uses it. buildOne packaging of the same scikit-learn version. Here, builds differ by their BLAS and OpenMP libraries. or machine changes anything. Most dashboards below vary one of these (implementationCode that runs a given estimator: stock scikit-learn, scikit-learn-intelex or an Array API backend., build or hardware) and keep the others fixed. The scalability ones look at how a fit speeds up with more CPU coresOne hardware core of the CPU. With SMT, it shows up as two logical CPUs.. Each dashboard explains how to read it in its own intro.
Overall findings:
-
On the benchmarked cases,
scikit-learn-intelexon CPUs is the most consistently fast option among the currently benchmarked set of options, especially for fitting tree-based models. Other backends and builds help in narrower, workload-specific cases.Note that scikit-learn-intelex only accelerates a subset of estimators and parameters (see its supported algorithms). Its behavior can also differ from scikit-learn, for instance in best-first tree growth, multiclass
predict_probaor missing values at predict time. These gaps are actively worked on. - For linear models, a good option for improved performance is simply to pick the MKL conda-forge buildIntel's Math Kernel Library (oneMKL): a BLAS implementation tuned for Intel CPUs, available as a conda-forge build option. of scikit-learn, instead of the PyPIThe Python Package Index, where pip installs packages from. Its scikit-learn wheels bundle their own OpenMP runtime, and NumPy and SciPy bundle OpenBLAS. one.
- Using a bigger machine doesn't help a lot for a single fit for most models except random forests and alike. But it helps a lot for multiple parallelized fits, typically for hyper-parameter tuning workloads.
-
cuML LogisticRegression always runs the quasi-Newton solverThe optimization algorithm used by fit, for instance lbfgs or newton-cholesky for LogisticRegression.
qn(L-BFGS or OWL-QN). A point may still be labeledlbfgs,newton-cg, ornewton-cholesky: the wrapper maps every one of those names ontoqn, so those cuML cases time the same algorithm.
Dashboards
| Software/implementations comparison | scikit-learn-intelex and Array APIStandard API shared by array libraries (NumPy, PyTorch, CuPy, dpnp). With it, some scikit-learn estimators run directly on these libraries' arrays, including on GPU. backends vs stock scikit-learn. |
| Builds comparison | PyPIThe Python Package Index, where pip installs packages from. Its scikit-learn wheels bundle their own OpenMP runtime, and NumPy and SciPy bundle OpenBLAS. vs conda-forgeCommunity-maintained channel of conda packages. Its scikit-learn can be installed with different BLAS and OpenMP libraries. BLAS/OpenMP buildsOne packaging of the same scikit-learn version. Here, builds differ by their BLAS and OpenMP libraries. of scikit-learn. |
| Hardware comparison | Same software on different machines. |
| Cross software/hardware comparison | Any software on any machine against one software on every machine, or every software on one machine. |
| Models core-count scalability | How a single fit scales with more CPU cores. |
| Hyper-parameter search outer-parallelism scalability | Speed-upBaseline time divided by the compared time: 2x is twice as fast as the baseline, 0.5x twice as slow. In the detailed results, a noisy speed-up is shown as ~1.5x (5-15% spread over the repeats) or as a range like 1.2-1.9x (more than 15%). from evaluating search candidatesHyperparameter combinations tried by the search. Each one is fitted and scored on every cross-validation split. in parallel. |
| Hyper-parameter search with n_jobs=-1 | How a search with n_jobs=-1 scales with the CPUs it may use. |
| HistGradientBoosting thread-scalability breakdown | Fit time per phase as the thread count grows. This is mostly an investigation for scikit-learn developers. |
Benchmark hardware
Intel Core Ultra laptop
Hardware
CPU
Intel(R) Core(TM) Ultra X7 358H
X86_64, 16 physical cores, 16 logical CPUs
31 GB RAM
$1,299, released 2026
GPU(s)
level_zero:gpu:0: Intel(R) Arc(TM) B390 GPU (29 GB, integrated, priced with the CPU)
Apple M4 laptop
Hardware
CPU
Apple M4
ARM_8, 10 physical cores, 10 logical CPUs
32 GB RAM
$1,599, released 2024
GPU(s)
mps: Apple M4 GPU (32 GB, integrated, priced with the CPU)
Intel Core Ultra desktop
Hardware
CPU
Intel(R) Core(TM) Ultra 9 285
X86_64, 24 physical cores, 24 logical CPUs
61 GB RAM
GPU(s)
level_zero:gpu:0: Intel(R) Arc(TM) B580 Graphics (12 GB)
High-end Intel Xeon server
Hardware
CPU
Intel(R) Xeon(R) 6787P
X86_64, 172 physical cores, 344 logical CPUs
499 GB RAM
$11,648, released 2025
GPU(s)
No GPU detected.
L4 VM (8 CPU, 32 GB RAM)
Hardware
CPU
AMD EPYC 7R13 Processor
X86_64, 4 physical cores, 8 logical CPUs
30 GB RAM
~$1/h (cloud VM), released 2024
GPU(s)
cuda:0: NVIDIA L4 (22 GB, priced with the CPU)