All notable changes to this project will be documented in this file.
- Olmo-core SFT runs write a provenance
README.mdintooutput_dir(run name, base model, Beaker/W&B pointers, launch command, optional--sft.tracking_url), so checkpoint directories copied around WEKA stay traceable to their run (#1872). - Detect olmo-core checkpoints by config contents, and let mason pass a GCS credential to jobs (#1838).
- Add
over_length_strategyto SFT tokenization, for conversations thatmax_seq_lengthtruncation cuts short.truncation_sideisright, so an over-length conversation loses its trailing EOS with the excess and becomes supervision with no terminator anywhere in it — i.e. supervision to never stop — with a trainable partial answer at the cut. Measured on the Dolci-Think 32768 cache: 2.02% of rows end on a non-EOS token and 2.00% have that final token trainable.terminateends such a row with a trainable EOS,dropremoves it, and the defaultkeeppreserves today's behavior so existing dataset caches stay valid (#1876). - Support SFT of
allenai/Olmo-Hybrid-7Bon the olmo-core path: anolmo3_hybrid_7Bconfig and HF <-> olmo-core state conversion formodel_type: olmo_hybrid, neither of which olmo-core provides (#1822). - Expose
--save_asyncand--dist_timeout_hoursfor the olmo-core SFT path; both were hardcoded, and the 24h default timeout meant a mid-training stall held its GPUs invisibly (#1821). - Add tool-schema support to SFT tokenization: the
toolscolumn is parsed (JSON strings accepted) and passed toapply_chat_template, assistant labels are derived from offset mappings, and the tools column is consumed rather than persisted (#1746). - Drop stale async rollout results whose generating policy is more than
async_stepsbehind the trainer (max_result_age_steps), replenishing a fresh prompt and logging astale_results_droppedmetric (#1738).
--max_train_samplesis now honored indpo.py: it was declared onDPOExperimentConfigand hashed into the reference-logprob cache key, but onlydpo_tune_cache.pyapplied it, so a subset run silently trained on the full mix (and paid the full-dataset reference pass) while looking like it had a distinct cache. Applied after the shuffle, so a subset is a random sample rather than the head of the mix; the subset is reindexed densely so the reference cache stays in bounds, and subset cache keys include the seed the subset depends on (#1868).--resume_from_checkpointis now honored in the olmo-core SFT path instead of being silently ignored, and an SFT run whose--output_diralready holds a checkpoint resumes from it instead of restarting (#1823).- Save HF checkpoints in the weight naming their model type's released checkpoints use:
save_pretrainedapplies transformers'conversion_mappingin reverse by default, which forolmo_hybridwrites norms under legacy names that vLLM (and therefore olmo-eval) refuses to load, so those model types now passsave_original_format=False. Verify after writing that every converted tensor reached the file, sincesave_pretrainedotherwise fails silently and the checkpoint only breaks in whatever tries to load it (#1820). - SFT tokenization no longer aborts on chat templates whose rendered prefixes are not literal prefixes of the full render (the olmo family swaps
<|im_end|>foreos_tokenon the final assistant turn, which breaks whenevereos_tokenis not<|im_end|>). Label spans now fall back to prefix token counts, verified in three directions (span too narrow, starting inside the assistant header, or running past the turn), so a fallback can never silently mis-mask. Conversations whose spans remain underivable are masked out and dropped bysft_tulu_filter_v1instead of raising insidedataset.mapand killing the whole job. Spans truncated bymax_seq_lengthare exempt from the coverage check, so long conversations are kept rather than discarded (#1806, fixes #1800).
- Automatically publish stable CUDA 12 and CUDA 13 Beaker image aliases after merge-queue integration tests pass (#1783).
- Wire
keep_last_n_checkpointsthroughbuild_checkpointer_callbackandbuild_base_callbacksto OLMo-core's newmax_checkpointsparameter across SFT, DPO, and GRPO training paths; bump OLMo-core to the commit that addedmax_checkpoints(fa6c501). Negative values (e.g.-1) mean unlimited (#1701). - Add selectable CUDA 12.8 and CUDA 13.0 Docker builds, including matching torch, vLLM, and flash-attention dependency variants, and add B300 support on the new
ai2/holmescluster (#1758). - Increase default environment pool acquire timeout to 7200s (#1729).
- Make ModelDims.from_hf_config robust to explicit head_dim (#1743).
- Change the default generation
temperatureto 1.0 and makeSamplingConfig.temperaturea required field soStreamingConfig.temperatureis the single source of truth (#1725). - Bump OLMo-core to the latest
maincommit (9aa3280) (#1723). - Refactor OLMo-core DPO metrics: reduce token-weighted metrics inline in
train_batchwith a singleall_reduceover the DP group (matchingGRPOTrainModule), align wandb keys withdpo_tune_cache.py(train_loss,logps/*,rewards/*,perf/mfu_step,perf/tokens_per_second_step/_total), addtrain/padding_fraction,train/sequences_per_rank, andtrain/global_sequences_per_stepmetrics, and makeget_num_sequencesalways return anint(#1719). - Add
ModelConfig.loss_implementationto select olmo-core's LM loss implementation (e.g.fused_linearfor Liger FLCE), applied insetup_modelbefore the model is built (#1714).
- SFT's default checkpoint intervals collided:
olmo_core_finetune.pyforcedephemeral_save_interval=500throughparser.set_defaultswhilecheckpointing_stepsalso defaults to 500, and olmo-core requires the former to be strictly smaller, so any run that did not override one of them was rejected at startup. The forced default is now 250, and a non-positive--ephemeral_save_intervaldisables ephemeral checkpoints entirely, matching the existing-1convention formax_checkpoints(#1810). - Include
--seed,--chat_template_name, and--transform_fnin the tokenization command printed on a pre-tokenized cache miss; all three feed the cache key, so following the previous command built a cache the training job could not find (#1801). scripts/train/convert_olmo_core_to_hf.pynow runs: it usedtorch.distributed.checkpoint.state_dict.load_state_dict, which no longer exists, and torch's generic DCP reader cannot read olmo-core's storage layout ('_StorageInfo' object has no attribute 'transform_descriptors'). Loads througholmo_core.distributed.checkpoint.load_model_and_optim_stateinstead (#1809).- Raise a
ValueErrornaming the packed instance count, global batch size, and epoch count whenolmo_core_finetune.pycomputes fewer than one training step, instead of letting an undersized dataset surface as a bareZeroDivisionErrorfrom olmo-core's LR scheduler (#1796). - Track the CUDA 12 image suffix in the merge-queue Beaker workflow and allow enough time for the larger image build and upload (#1783).
- Exclude nested virtualenvs (e.g.
oe-eval-internal/.venv/) from the Docker build context, so a uv venv inside a nested clone no longer fails the image build on a dangling host-interpreter symlink (#1786).