Technologies · Compute
Machine learning, out of core.
clio-ml is a library of classic machine-learning algorithms (the Spark MLlib set) written over CLIO Core's paged vectors. A dataset larger than GPU memory trains without hand-sizing anything; its pages stream from host memory, NVMe or DAOS through a GPU cache.
- Algorithms
- 30+ modules
- Backends
- CPU, CUDA, SYCL
- Data
- Any CTE tier, including DAOS
- Compared with
- Spark MLlib, oneDAL, Dask-ML
Key takeaways
- clio-ml: the Spark MLlib algorithm set, over 30 modules, on CPU, CUDA and SYCL.
- Trains out of core: data larger than GPU memory streams from the tiers you compose.
- Measured 8-59x faster per iteration than Spark MLlib.
- 8-59xfaster per iteration than Spark MLlib, 1-16 nodes
- flattime per iteration from 1 to 16 nodes (weak scaling)
- 9 of 10more algorithms faster than Spark, 1.1-32x
- 4-6xless memory than Spark on 61 GB of data
What it is
clio-ml has more than thirty algorithm modules: the MLlib set (k-means, linear, logistic and multinomial regression, linear SVM, naive Bayes, PCA, decision trees, random forests, gradient-boosted trees, Gaussian mixtures, bisecting k-means, ALS, LDA, word2vec, k-nearest neighbors and more) plus neural models (MLP, CNN, LSTM, GNN) and a PyTorch integration. The thirteen benchmarked on this page are the classic algorithms. Each algorithm is a CLIO Core module built on three shared paged engines (k-means, generalized linear models, and a generic pass over the data) with CPU, CUDA and SYCL kernels. Training data lives in a gpu_vector: the GPU keeps a page cache of a size you choose, and the rest of the data stays on whatever tiers the runtime composes, from host RAM to a DAOS container.
Against Spark MLlib, oneDAL and Dask-ML
Setup: Aurora. clio-ml uses one Intel GPU tile per node (of 12). Spark 3.5.6 MLlib uses all CPU cores of the node (2x Sapphire Rapids, 208 hardware threads, 1 TB). All systems train on bit-identical generated rows, 10M rows per node, 10 iterations, median of 2 timed repetitions. Milliseconds per iteration, lower is better:
Speedup per iteration over Spark MLlib, higher is better:
Read these before quoting a speedup
- An iteration is not the same progress everywhere. clio-ml's linear and logistic regression use batch gradient descent; MLlib uses L-BFGS. To the same linear model on one node, clio-ml takes 30 iterations in 0.94 s and Spark 6.8 s: 7.3x, not 21.8x.
- For logistic regression, the others reach a good model first. Spark (L-BFGS) and oneDAL (newton-cg) reach a lower log-loss in fewer iterations than clio-ml's current optimizer. A second-order solver for the binary GLMs is the open gap.
- oneDAL is the strongest baseline. Its k-means does the same work (identical final cost) at 3.2-3.4x clio-ml's time per iteration, and its closed-form linear regression beats clio-ml to the model.
- clio-ml uses one of a node's twelve GPU tiles; Spark and Dask use the whole CPU side.
More algorithms, one node
Whole-fit times, 10M rows in memory, same data on both sides, against Spark MLlib. Where both systems report the same metric, accuracies agree to about three digits.

Random forest is slower because clio-ml currently fits its trees one after another; Spark grows all trees together level by level.
Out of core: 61 GB on one node
500M rows (61 GB) on one node, with clio-ml's GPU cache capped well below the data size; evicted pages go to a host-DRAM tier. Spark and Dask hold the whole dataset in host memory.

clio-ml used 69-112 GB in total across cache sizes; Dask about 200 GB and Spark 333-455 GB for the same data. Dask's linear regression was ahead of clio-ml out of core (2.67 vs 4.34 s per iteration). These are single runs.