v1.4.0 — the device-resident objective ships
GPU fits 15 to 25% faster through the device-resident objective, and the documentation rebuilt around results.
Added
- Device-resident objective for CUDA fits (decision 77, issue #171): eligible fits (MSE, LogLoss, or Poisson; sample weights supported; no DART; row sampling off or Bernoulli) keep labels and scores on the GPU, derive each tree's gradients there, and fuse the score update into the tree epilogue, so per tree nothing crosses the bus in either direction. Measured same-pod: 20-25% faster fits at 16M rows, 15-16% at 64M, with identical accuracy (full-data resident models are bit-identical to the host-objective GPU models). Ineligible fits and
BONSAI_HOST_OBJECTIVE=1take the unchanged host path; CPU models are byte-identical. - CUDA device selection (issue #158):
parallel.device_idplaces acuda_*grower's whole fit (ingest and training) on a specific GPU, so multi-GPU hosts can pin concurrent fits to different cards withoutCUDA_VISIBLE_DEVICES.0is the default device and behavior-preserving; an out-of-range id, or a nonzero id on a CUDA-less build, raisesConfigError. Placement only: model bits are unaffected and the knob is not persisted in the model artifact. CPU growers ignore it (thesampler.subsampleconvention for regime-scoped knobs). First step of the single-node multi-GPU track (architecture doc 19). - Explicit bin edges on
Dataset(decision 73, architecture doc 18):bonsai.Dataset(X, y, bin_edges={col: edges})bins listed columns at user-supplied cut points (regulatory bands, clinical thresholds, incumbent-scheme parity) instead of fitted quantiles. The edges travel inside the model artifact like fitted cuts, sopredict,save, andloadwork on raw values with no external transform; k edges give k+1 splittable bands plus the NaN-only missing bin. Unlisted columns fit exactly as before (byte-identical models when the argument is omitted).
Docs
- The site rebuilt around five doors (issue #179): results-first standings with three drift-gated generated references (parameters, make targets, the GBT timeline), the Engine track teaching five real perf campaigns case-method, an honest What-to-use-when including competitor recommendations, CI-enforced style and CI-executed examples, and the Design core from system map to determinism contract.
Fixed
- Weighted fits no longer pay a serial per-tree weight multiply: the host gradient weighting loop is now parallel (elementwise, bitwise-identical models); at 16M rows it was costing roughly 80ms per boosting round of single-threaded work on every weighted fit.
- The missing bin is NaN-only on every fitting path (decision 74, issue #155): fitted cuts now end with a
FLT_MAXtop-band closer, so finite values above the last cut (a stride path's top tail, a capped column's heavy maximum, rows beyond the bin sample) get a real splittable bin instead of training as missing, which also removes a train/predict routing skew for those rows. Models change only where a leak existed; capped-column synthetics recover up to half the lost variance, and on the re-validated Grinsztajn standings bonsai's mean rank improves 1.73 to 1.44 with 36 of 55 outright wins and no last-place finishes (evidence:benchmarks/missing-bin-closer-2026-07.md).