v0.15.1
Bug fixes
-
Ray training 3.7x slowdown eliminated —
LudwigProgressBarwas callingrt.report()on every training batch when running inside Ray workers (~1.9 s/call through the Ray GCS). With hundreds of batches this completely dominated wall-clock time. Per-batch progress reporting is now suppressed; training metrics continue to be reported correctly at eval/checkpoint time. Ray overhead is now ~1.7x vs local (fixed TorchTrainer setup cost), down from 3.7x. (#4144) -
GPU underutilization in Ray backend fixed —
RayDatasetBatcherwas runningto_tensorsviamap_batches(spawning a Ray remote task per dataset block with scheduling overhead). It now runs locally in the producer thread. Also: datasets are now materialized before training to avoid re-reading Parquet from disk on every epoch. (#4144) -
Python 3.14 compatibility —
LudwigBaseConfigsubclasses crashed withPydanticUserError: Field requires a type annotationon Python 3.14 because annotations are now stored lazily via__annotate_func__. Fixed in_LudwigModelMeta.__new__. (#4144) -
ModernBERT tokenizer — Models containing "bert" in their name (e.g.
answerdotai/ModernBERT-base) were incorrectly routed toBertTokenizer(WordPiece), causingMissing [UNK] tokenerrors. ModernBERT now correctly usesHFTokenizer(AutoTokenizer / BPE). (#4144) -
Dask
meta=parameter — Multiple feature types (binary,category,sequence,timeseries,text,vector) called.map()without ameta=argument, causingValueError: Metadata inference failed in mapwhen using the Dask engine (backend: {type: ray, processor: {type: dask}}). All bare.map()calls are now fixed. (#4144)