Kumo and TabICLv2
Kumo and TabICLv2 are separate optional algorithms in Compete mode.
Both use NVIDIA's structured-data-models (SDM)
backend and support binary classification, multiclass classification, and regression.
Kumo supports small, medium, and large tabular models, with small as the default.
The relational model is not included.
Installation
Requires Python 3.11+. Install CPU or CUDA PyTorch as described in Installation, then install beta 1:
python -m pip install "mljar-supervised[tfm]==1.4.0b1"
This installs structured-data-models==0.2.1 from PyPI automatically.
[kumo] and [tabiclv2] share the same dependencies; [all] includes them too.
The integration checks this exact backend version. Model weights remain pinned
and download from Hugging Face on first use.
Standard MLJAR installation does not install these optional models.
Usage
from supervised import AutoML
model = AutoML(
mode="Compete",
algorithms=["Kumo", "TabICLv2"],
custom_params={
"kumo": {"device": "auto", "size": "medium"},
"tabiclv2": {"device": "auto"},
},
)
model.fit(X_train, y_train)
When the tested backend and CUDA are available, automatic Compete selection
includes both algorithms. CPU use requires explicit algorithm selection.
device="auto" uses CUDA when available, otherwise CPU; explicit cpu, cuda,
and cuda:<index> are supported. This first version does not fine-tune weights.
What gets tuned
num_estimators controls the number of transformed context views combined into
one prediction. It does not train that many independent neural networks.
Each fit uses every training row as labeled context. During cross-validation,
this means the complete training portion of that fold, excluding validation rows.
MLJAR skips fits above fixed internal admission thresholds: 60,000 rows for
Kumo and 100,000 rows for TabICLv2. These are conservative MLJAR policies,
not guaranteed model capacities, and are not configurable. Kumo's published
pretraining recipe extends to
60,000 rows; the SDM TabICLv2 threshold is a conservative integration policy.
RAM/VRAM checks on the full context can reject smaller datasets, particularly
wide ones. Kumo also skips inputs above 500 effective columns.
max_context_size is no longer accepted for new training; remove it from
custom_params. Saved models retain their original context and remain loadable.
There is no automatic context subsampling or full-data refit after CV.
Kumo's size selects a pretrained architecture; TabICLv2 has a fixed architecture.
The following lists are MLJAR's search space. SDM preprocessing stays at its backend defaults; normalization, feature/class permutations, and softmax temperature are not separate tuning parameters in this integration.
| Parameter | Allowed search values | Default |
|---|---|---|
num_estimators |
[4, 8, 16] |
8 |
size (Kumo only) |
["small", "medium", "large"] |
"small" |
precision |
["fp16", "fp32"] (hill climbing) |
"fp16" on CUDA |
Precision tuning is available starting with 1.4.0rc4.
Initial default and random candidates use FP16 mixed precision on CUDA. During hill climbing, the best eligible configurations can also be evaluated in FP32, using the same context, seed, and other settings. This is a separate candidate: validation scores determine whether it improves the model. FP32 does not necessarily improve accuracy and usually costs more memory and inference time. Trials require GPU fold metadata and must pass a conservative RAM/VRAM check; the normal tuning time limits still apply. CPU inference always uses FP32 and does not generate a second candidate solely to change precision. Optuna does not currently support these algorithms.
Parameters supplied in custom_params are fixed values and are removed from
search variation. For example:
custom_params = {
"kumo": {"size": "large", "num_estimators": 8, "device": "cuda"},
"tabiclv2": {"num_estimators": 8, "device": "cuda"},
}
Here context size can still vary. To use all registered search values, omit those
fixed overrides. Resource settings (device, prediction batch size, and memory
budgets) are controls, not accuracy-tuning parameters.
To fix precision for all candidates, use:
custom_params = {
"kumo": {"precision": "fp16"},
"tabiclv2": {"precision": "fp32"},
}
Omit precision to start with FP16 and allow FP32 trials during hill climbing.
The chosen setting is saved with each learner and reused for prediction and
reload. Training logs record both the requested and effective precision, and
the model report shows effective precision. A CPU fallback uses FP32 even if
the saved request is FP16. A resource shortage never silently changes a GPU
candidate's selected precision.
Input and resource limits
Kumo tuning can try all three sizes. Fix custom_params={"kumo": {"size": "large"}}
to use only large (likewise for medium or small). Larger models require more memory;
the resource checks account for both checkpoint size and larger working buffers.
Candidates that exceed the budget fail without silently changing size.
Fixed overrides may use any positive integer context/ensemble size, subject to
memory admission. predict_batch_size defaults to 128. Estimators execute
sequentially, with request-local context caching when memory permits. There are no
learning-rate, depth, epoch, or ordinary early-stopping settings.
Only a reproducible sample of training-fold rows becomes labeled context; each class is represented. Preprocessing uses that context only. Reports record the original training rows, retained context rows, checkpoint identity, and resource estimates. A million-row input does not mean a million-row context.
Numerical, categorical, missing, and unseen categorical values are supported. Numerical missing values use context means with missing indicators; constant columns are handled by SDM; entirely constant contexts are rejected. Sparse inputs and sample weights are rejected. Weighted fairness/boost-on-errors candidates skip these algorithms; skips are recorded in the report. Kumo rejects more than 500 effective columns, including generated indicators and category-count features, rather than silently truncating them.
Memory admission defaults to 60% of available RAM and 70% of free VRAM. Fixed
memory_limit_gb, gpu_memory_limit_gb, memory_fraction, and
gpu_memory_fraction overrides are available. Estimates are conservative
heuristics, not guaranteed maximum dataset sizes. Reduce context or query batch
size if a candidate exceeds its budget. Prediction time grows with query rows
and context size. Deadlines are checked between query/estimator batches;
an individual kernel or download cannot be interrupted by these checks.
Version 1.4.0rc2 releases early-stopping copies when
each learner completes, so a shared frozen network does not remain in GPU
memory after the learner is saved and unloaded. Admission checks collect
unreachable tensors and clear unused CUDA cache before measuring free VRAM.
Rejection messages include the estimate, budget and free memory; genuine
shortages still reject a candidate without changing its configuration.
Version 1.4.0rc3 also loads saved fold networks lazily
and releases them after each fold prediction. Stacking and ensembles reuse
shared model predictions within each request, avoiding repeated SDM inference.
See prediction memory and reuse.
Resource skips and diagnostics
During AutoML training, a fixed size limit or estimated RAM/GPU budget rejection is recorded as
a skipped candidate in progress.json and resource_skips.json. The latter
contains the candidate configuration, required memory and measured budget, and is
linked from the Markdown leaderboard report. Training prints one summary of
these skips. Actual allocation failures and unexpected exceptions remain errors.
This reporting also covers RealMLP and TabM admission checks.
A previously rejected identical configuration is rechecked against current free memory before repeating preprocessing. Other configurations and algorithms remain eligible; a temporary memory shortage does not disable an algorithm.
During prediction, insufficient memory still raises an exception. The trained precision, context, model and device are not changed to bypass a budget. Rejected GPU checks include process PyTorch allocation/reservation diagnostics when CUDA is initialized. A fresh-process prediction can succeed when prediction directly after training had insufficient free memory; the benchmark records memory at these boundaries to distinguish the cases.
Saved-model reuse (starting with 1.4.0rc5)
Saved Kumo and TabICLv2 folds can share frozen checkpoint weights during one AutoML prediction request. At most one checkpoint is retained; switching checkpoints or predicting another algorithm releases it. Each fold builds and clears its own encoded context. Admission still checks each fold's memory requirements; retained weights are evicted and admission retried under pressure. The request releases its retained weights on completion or failure.
SDM admission first checks driver-reported free GPU memory without garbage collection or clearing the CUDA allocator cache. If the fold does not fit, it performs cleanup, measures free memory again, and reapplies the same limits. Every fold is checked independently; the default 70% allowance, explicit memory limits, and retained-weight eviction/retry still apply. CPU checks and the RealMLP/TabM cleanup behavior are unchanged. No user setting or retraining is needed to use this optimization with saved models.
Equivalent saved folds can also reuse CPU predictions. Equivalence requires the same checkpoint, fitted preprocessing, ordered context and targets, class mapping, seed, precision, execution settings, and transformed query data. For legacy saved models, the old sampling cap can differ when the actual retained context is identical. Matching validation predictions alone does not establish equivalence. All original stacking columns and ensemble weights are preserved, including columns from equivalent models. The additional prediction cache is capped at 32 MiB and 1% of available RAM (and 1% of an explicit RAM limit, when supplied); nothing is reused across calls.
SDM predictions prepare a fold's context once and reuse it across query batches. Ensemble members execute sequentially; SDM offloads their caches to host memory. The cache lives only for that prediction request and is cleared on success, deadline expiry or failure. Requests sharing a frozen network serialize access to its context. If the conservative cache RAM estimate exceeds the configured memory allowance, prediction uses uncached inference with the same context, seed, estimator count and checkpoint. Resource estimates are not hard RSS limits.
Short query batches are padded internally to predict_batch_size and the extra
outputs are discarded. This keeps kernel shapes consistent for full-batch and
subset requests at the same configured batch size. Both algorithms default to
FP16 mixed precision on CUDA, keeping the pretrained weights in their original
dtype. FP32 CUDA calls disable TF32 temporarily and restore the previous setting
afterward. Changing precision or the configured batch size can change numerical
rounding and probabilities; it is not a bitwise-equivalent optimization.
Same-configuration subset/reload checks remain strict. Cached and uncached
calculations are also compared in FP32 tests.
Model weights and feature mappings are unchanged by context reuse. Floating-point rounding can differ from older releases, especially for TabICLv2's previous FP16 CUDA path. Full precision can be slower for small TabICLv2 query sets; context reuse saves repeated work as the number of query batches grows.
Version 1.4.0rc3 handles Kumo's mixed-precision RMS
normalization fallback explicitly in FP32, retaining the checkpoint weights,
epsilon, and output dtype. SDM's eligible optimized kernels are preserved.
This avoids PyTorch's Mismatch dtype between input and weight warning without
filtering warnings. In published RC2, that warning indicates a fallback to the
standard calculation; it does not indicate a failed candidate.
Classification returns probabilities in MLJAR class order. Regression returns the mean of the predicted quantiles, following NVIDIA's benchmark adapter. Sampled permutation importance is supported; SHAP is disabled.
Downloads, licenses, and portable models
Installing packages does not download model weights. First fit downloads only the required size/task checkpoint from Hugging Face, pinned to these revisions:
| Model | Repository | Revision | Weight license |
|---|---|---|---|
| Kumo | nvidia/Kumo-Tabular | 3c3e10bbdb590ace29e7026847f92db3c603096d |
OpenMDW-1.1 |
| TabICLv2 | jingang/TabICL | 4dcd344ece2c00be9e831fdd35bed57b5ad83e19 |
BSD-3-Clause |
Both licenses permit commercial use subject to their terms. SDM code has its own
Apache/BSD notices. Shared weights, model cards, and license notices are copied
into sdm_weights in the results directory, with separate Kumo size subdirectories.
Retain this directory when moving or sharing results. Redistribution of these weights requires retaining the notices.
Saved learners contain selected training rows and labels as context. Your
data is processed locally and is not uploaded to Hugging Face. Reload uses the
saved weights without network access. Set local_files_only=True to require
cached checkpoints for initial fitting; cache_dir selects the HF cache.
Pre-download by running a small fit for each task/model with internet access.
Synthetic examples
The runnable sklearn example
uses make_classification for binary/multiclass tasks and make_friedman1 for
regression. It adds categorical values and missing data, holds out a test set,
and verifies saved-model reload. Run it from a repository checkout:
python examples/scripts/sdm_synthetic.py --device cuda --rows 1000
# CPU:
python examples/scripts/sdm_synthetic.py --device cpu --rows 300
The example compares both algorithms on held-out synthetic data, verifies reload, and writes a JSON summary. These checks validate integration, not TabArena rank.