ChimeraBoost 0.30.0, AutoGluon 1.6 model API migration, and four model fixes - #468
Merged
Conversation
`ModelInfo.superseded` keeps a replaced entry's pin out of the pyproject extras. Without it TabDPT_GPU's `tabdpt<1.2` unions with TabDPT-Turbo's `tabdpt>=1.2.0` into one unresolvable extra, which would break `pip install tabarena[benchmark]` in CI. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Collaborator
Author
Collaborator
Author
|
Closes #463 |
mario-koddenbrock
added a commit
to ml-lab-htw/RamanBench
that referenced
this pull request
Aug 10, 2026
tabarena.models.limix.model._nan_clean_encoder_cls() builds its NaN-sanitizing nn.Module wrapper as a class local to the factory function (deliberately, to keep torch off that module's import path), which gets an unresolvable qualname (_nan_clean_encoder_cls.<locals>._NaNCleanEncoder). AutoGluon's bagged-ensemble save_child() pickles every fold child right after it finishes training, so every LIMIX run crashed at that step -- confirmed on 4/4 real cluster runs (classification and regression alike), always right after training completed. Already reported and fixed upstream in autogluon/tabarena#468 (open, not yet merged/released as of 2026-08-10). wrapped_models._patch_limix_pickle_bug reproduces that exact fix at runtime -- rewrites the produced class's __qualname__ and adds a module-level __getattr__ (PEP 562) that rebuilds/returns the same, functools.cache-stable class on demand -- and is applied automatically to the installed tabarena package at import time, idempotent, and a no-op once the real fix ships. Verified with a real TabularPredictor.fit()/.save()/.predict() run (bagged, 2 folds, CPU): crashes pre-patch at exactly save_child(), succeeds post-patch, and a saved predictor loads and predicts correctly in a cold process that never called the factory. Full test suite (113 tests) passes unchanged.
Contributor
|
Independently reproduced this bug via LIMIX in a downstream benchmark (RamanBench) — pickling failed at AutoGluon's |
Collaborator
Author
|
@mario-koddenbrock let me know if it would help you if I merge this now. Otherwise, I am waiting for the runs to finish (by the end of day/tomorrow morning). |
Contributor
|
@LennartPurucker No, it's not urgent at all. Thanks :) |
Collaborator
Author
Register the chimeraboost_10082026 rerun on ChimeraBoost 0.30.0, whose reworked algorithm improves regression and small-data accuracy and speeds up large data (#463). Same run shape as the 0.14.1 runs, so accuracy and timings stay comparable: rank 28 -> 21 on the default leaderboard. The default arena collection now carries only the new suite; both 0.14.1 runs stay reachable through the complete collection. The two per-date superseded lists collapse into one `methods_superseded`, since the date in `methods_superseded_2026_07_13` named the rerun that displaced those entries rather than the suite they ran in, so a second dated list would have used the same suffix for the opposite meaning. Behavior is unchanged (42 current / 76 complete methods). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
BENCHMARK_LOG.md entries were only ever offered by benchmark-model, at launch time and before any results exist, so runs reached upload unlogged. Give upload-method a step that checks for the entry once the run is finished, including how to recover the setup-time SHA from the reflog and the run's own timestamps. Also document the rerun case: registering a rerun is a swap plus a `methods_superseded` append, not an addition. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.


Closes #463.
ChimeraBoost 0.30.0
Bumps the pin to
chimeraboost>=0.30.0(info.py+pyproject.toml) for the re-run requested in #463. Pre-flight before spending cluster time: all 13 search-space parameters still exist in 0.30.0, and all 201 configs (default + 200 random) fit on binary/multiclass/regression. The only warning is the documented multiclass no-op forleaf_estimation_iterations.fit(cat_features=, eval_set=, callbacks=)and thecb(iteration, train_loss, val_loss, model)signature are unchanged, so the wrapper's time-limit callback still works.Worth knowing for interpreting the results: 0.30.0's headline
refit_full="replay"default is inert here by design. It only fires for fits that use ChimeraBoost's own internal split, and the wrapper passes AutoGluon's bagging validation fold as an expliciteval_set. Refitting on that fold would train on the rows whose predictions become the out-of-fold predictions used for scoring and ensembling.AutoGluon 1.6 model API migration
AutoGluon 1.6 replaced a set of override methods with class attributes. Only
_supported_problem_typesis enforced, butFitHelper.verify_modelraises on the old override, sopytest -m modelswas failing for 25 registry entries (20 classes) without ever reaching a model fit.supported_problem_types()_supported_problem_types_get_default_resources()default_resources_physical_cores_only+default_num_gpusget_minimum_resources()minimum_num_gpus_get_default_ag_args_ensemble()_default_ag_args_ensemble_extra_get_default_auxiliary_params()_default_auxiliary_params_extraAlso removes now-dead code: 15
_class_tagsdeclaring onlycan_estimate_memory_usage_static(AutoGluon derives it from whether_estimate_memory_usage_staticis implemented) and 9_estimate_memory_usagemethods that only forwarded to the static estimate (now the base default). 12 methods were deliberately left alone where the body reads the parent's resolved value via.pop()or branches on state.Verified behaviour-neutral by snapshotting every registry model's memory-estimate and default-resolution behaviour to JSON before and after. Memory behaviour is identical across all 37 models. The one difference is that
get_minimum_resourcesno longer returnsnum_gpus: 0when no GPU is present; every consumer in AutoGluon core reads.get("num_gpus", 0), so absent and0are equivalent.The
add-modelandbenchmark-modelskill docs are updated to teach the new API.Four model fixes the migration uncovered
The
supported_problem_typesassertion fires before the model fits, so it had been masking real failures.TabPFN-2.6 large data —
_adjust_hyperparameters_for_large_dataimported_get_v2_6_configand thev2_6_*preprocessor factories, which no longer exist: v2.6 checkpoints embed their ownInferenceConfig, so those defaults were removed upstream. Any dataset above 70k rows and 300 features died withImportErrormid-fit. Now reads the checkpoint's own transforms viaget_inference_config()and passes a dict override, sooverride_with_user_input_and_resolve_automerges it and every unnamed field keeps the checkpoint's value. The shipped caps turn out to be 680/500, so capping to 300 preserves the original intent.LimiX unpicklable encoder —
_NaNCleanEncoderwas defined inside afunctools.cached factory, giving it the qualname_nan_clean_encoder_cls.<locals>._NaNCleanEncoder, which pickle rejects. Every fitted LimiX model was unpicklable, and bagging pickles each fold child back to the parent. Keeps the factory (its lazy-torchpurpose is real), rewrites the qualname, and adds a module__getattr__that resolves it. Verified to round-trip and to unpickle in a cold process that never called the factory, withtorchstill absent fromsys.moduleson import.TabSwift single-vs-batched predictions — differed by ~2.4e-4 against a 1e-5 tolerance. Running
FitHelper.verify_modelwithCUDA_VISIBLE_DEVICES=""passes with the check on, so this is float non-determinism in the CUDA kernels, not batch-dependent preprocessing. Addsverify_single_prediction_equivalent_to_multitoModelSmokeTestand sets itFalsefor TabSwift, with the CPU evidence recorded.TabDPT —
TabDPT_GPUruns thetabdpt1_1checkpoint, whose architecture config has 8 keys and noenc_cell_dim; tabdpt 1.2.0's loader reads v1.2-only keys with no legacy branch. Not a stale cache: forcing an upstream revision check returned the same revision. Its pin is corrected totabdpt<1.2and it is markedsuperseded=True, a newModelInfoflag that keeps a replaced entry's conflicting pin out of the installable extras and skips it in the smoke tests. TabDPT-Turbo is the current default and keeps>=1.2.0.Test status
pytest -m models tests/tabarena/models/test_all_models.py: 24 passed, 12 skipped, 1 failed, against 23 passed / 11 skipped / 3 failed before this branch. LimiX and TabSwift now pass, TabDPT_GPU skips with an explicit reason, and the other 11 skips are missing optional dependencies in this environment.The one failure is
Mitra_GPU, which is pre-existing, flaky, and outside this branch:autogluon.tabular.models.mitra.mitra_model.MitraModel), not a TabArena wrapper, and nothing here touches it.verify_single_prediction_equivalent_to_multi=Falseopt-out — that field is restricted to models proven to pass on CPU.Worth reporting upstream to AutoGluon separately.
Lint and format are clean on every file touched; the only
ruff checkerror in the tree is the pre-existingPLR0917intests/tabarena/repository/test_repository.py.🤖 Generated with Claude Code