Axolotl v0.19.0 Release Notes
72 commits since v0.18.0 (July 17, 2026).
We have a variety of changes this release including a new declarative model-support system, seven new model families plus ternary (BitNet b1.58) QAT, two new optimizers, a big chat-template tokenization speedup, and PyTorch 2.13 support.
Highlights
Declarative Model Support Profiles
Adding a new architecture used to mean edits scattered across the loaders. A model now picks a family template (VANILLA_CAUSAL_LM, IMAGE_TEXT_TO_TEXT) and declares only what makes it different.
Existing descriptors keep working, and there are no config changes. See the guide.
- Contributed by @thad0ctor in #3869 and @winglian in #3884.
Qwen3.8-Flash-Next
You can now fine-tune Qwen's 176.94B multimodal MoE on a single B300, in as little as 120 GiB with ple_cpu_offload: true, for a minor throughput tradeoff.
QLoRA, vision QLoRA, and NVFP4 MoE-LoRA configs all ship. See the guide.
- Contributed by @NanoCode012 in #3965.
Ternary (BitNet b1.58) QAT
qat: weight_dtype: ternary trains a model with its weights restricted to {-1, 0, 1}, natively, with no extra dependency. examples/neutrino/ has the two-stage recipe Fermion used for Neutrino-1: ternary continued pretraining, then instruction tuning on top.
Two New Optimizers: PoLoRA and AdamC
PoLoRA, a Muon-like optimizer for LoRAs. Set optimizer: polora with LoRA or QLoRA, on single GPU, DDP, or FSDP2.
optimizer: adamc adds Adam with corrected weight decay, which scales decay by learning rate.
- Contributed by @NanoCode012 in #3938 and @ved1beta in #3929.
Chat-Template Tokenization speedup
Long multi-turn conversations no longer make preprocessing look like it has hung. An 80-turn conversation on Qwen2.5 went from 1577.6 ms to 96.4 ms, a 16.4x speedup.
The gains are most apparent with conversation length.
Six More Model Families
Ling 3.0 (Flash and Tiny), Muse Glimmer 30B, Cohere North Micro Vision Instruct, Shieldstral, Qwen3.8 27B, and Nemotron 3.5 Lightning 30B-A3B, each with example configs.
Performance & Kernel Optimizations
- Faster bnb NF4 dequant (#3882 by @NanoCode012): pass raw pointers and ints to the bitsandbytes dequant entry points when the 0.50.0+
argtypesare present.
New Features
- TRL 1.9.0 and new GRPO knobs (#3875 by @ved1beta):
cfg.trlnow surfaces entropy regularization (entropy_coef,use_adaptive_entropy,entropy_target,entropy_coef_delta/min/max), bidirectional importance-sampling clipping (vllm_importance_sampling_clip_min/max), andlog_multimodal;scale_rewardswidens to acceptgroup/batch/nonealongside the old boolean. See the GRPO docs. - Explicit
flash_attention_4andflash_attention_torchbackends (#3847 by @NanoCode012): FA4 was previously reachable only by auto-upgrade from FA2; it is now a canonicalattn_implementationvalue, alongside torch's own varlen backend, both supporting varlen sample packing.flash_attention_torchhas a preflight validator that fails clearly when the installed transformers does not register it. - Configurable FP8 scaling recipes (#3969 by @JimmyWang0417):
fp8_config.recipeselects TorchAO'stensorwise(the default),rowwise, orrowwise_with_gw_hp.fp8_enable_fsdp_float8_all_gatherremains supported only withtensorwise, and incompatible rowwise combinations are rejected during validation. - Liger kernel backend selector (#3896 by @thad0ctor):
liger_kernel_impl: cutileorcutedsl(Blackwell-tuned) opts into liger 0.8.1's alternative kernel backends, while fused linear cross-entropy stays Triton on both. Gemma 4 now routes through liger's native dispatch instead of our hand-patch, picking up the multimodal FLCE forward, andipounderdpo_use_liger_kernelfails at config time rather than mid-run. - CLI help from dataclass metadata (#3855 by @vineethsaivs): argument help text is read from the
helpmetadata key on dataclass fields, so plugin-defined args document themselves.
Documentation
- SkyPilot guide (#3948 by @alex000kim): new SkyPilot docs covering single-node, multi-node, and spot instances, checkpoint mounting, secrets, and dataset reuse. Re-adds material dropped from the README in #2295.
- Full attribute docstrings in the API reference (#3946 by @NanoCode012): a custom Quarto renderer so config attribute docs render in full instead of being truncated.
- S3-compatible endpoints for dataset loading (#3978 by @ved1beta): setting
AWS_ENDPOINT_URLlets you load datasets from MinIO, Tigris, Cloudflare R2, or any other S3-compatible store while keeping thes3://path format. See the dataset loading docs. delinearize-llama4CLI invocation (#3912 by @latent-9): the documented--model/--outputflags do not exist; the command takes positional arguments.- Broken relative links and a stale docstring (#3986 and #3985 by @simpleqt): fixes dead README and example-config links across the diffusion, llm_compressor, and nemo_gym integrations, and corrects the parameter name in the
do_vllm_servedocstring.
Model & Framework Support
New Model Support
- Qwen3.8-Flash-Next (#3965 by @NanoCode012): QLoRA, vision QLoRA, and NVFP4 MoE-LoRA configs in
examples/qwen3.8-flash-next/, plus optional PLE CPU offload and CCE support. - Ling 3.0 Flash and Tiny (#3949 by @ved1beta): in-tree modeling copy with packing support, LoRA and QLoRA configs in
examples/ling3/. Ling-3.0-tiny LoRA measures 25.0 GiB reserved at 12.3 s/step on one H100 80GB. - Muse Glimmer 30B (#3931 by @NanoCode012): multimodal, with
examples/muse-glimmer/QLoRA text and vision configs and Liger support. - Cohere North Micro Vision Instruct (#3932 by @NanoCode012): a
cohere_compassmultimodal profile with image-text processing, plus QLoRA and FFT examples. - Shieldstral (#3922 by @NanoCode012): text and vision LoRA configs, Liger for Mistral3/Ministral3, improved Mistral3 role masking and tokenizer discovery.
- Qwen3.8 27B (#3935 by @ved1beta): QLoRA example config, along with sample-packing fixes across the Qwen3.5 base/text/MoE variants.
- Nemotron 3.5 Lightning 30B-A3B (#3945 by @ved1beta): a QLoRA config for the new checkpoint, with the Nemotron-H modeling patch rewritten against upstream and the stale gradient-checkpointing restriction removed.
Dependency Updates
- transformers 5.14.1 → 5.16.1 (#3931 by @NanoCode012, #3957 by @ved1beta), with tokenizers 0.22.2 → 0.23.1.
- PyTorch ceiling raised to 2.13.0 (#3877 by @winglian), with GPU container builds for 2.12.1 and 2.13.0.
- TRL 1.8.0 → 1.9.0 (#3875 by @ved1beta), which raises the vLLM extra floor to
>=0.17.0. - peft 0.19.1 → 0.20.0 (#3895 by @thad0ctor).
- bitsandbytes 0.49.1 → 0.50.2 (#3882 by @NanoCode012, #3956 by @ved1beta).
- liger-kernel 0.8.0 → 0.8.1 (#3896 by @thad0ctor), which brings native Gemma 4 and DeepSeek V4 support.
- kernels 0.15.2 →
>=0.16.0,<0.17.0(#3931 by @NanoCode012). - fla-core and flash-linear-attention 0.4.1 → 0.5.2 (#3980 by @NanoCode012).
Bug Fixes
orig_modprefix in FSDP2 + compile checkpoints (#3958 by @NanoCode012): drop the now-redundant accelerate patch that upstream fixed, which was leaking_orig_modinto saved state dicts, and stopPhiForCausalLMbeing mangled tohiForCausalLMby anlstrip("FSDP")that strips characters rather than a prefix. Saved tensors verified bit-identical. Also rejectscpu_ram_efficient_loadingwithload_in_4biton FSDP2, where the rank-0-only quantization deadlocks the state-dict scatter.- Fully-masked samples were never dropped (#3864 by @vineethsaivs):
drop_no_trainable_tokenscompared a Python list to-100undernp.any, which always evaluates truthy, so samples with zero trainable tokens survived dataset preparation. The comparison is now element-wise, and a dataset left empty by the filter raises with a pointer attrain_on_inputs/roles_to_train/ the chat template. - Silent out-of-bounds writes in MoE expert kernels (#3865 by @winglian): expert weight stacks over 2^31 elements (512x5120x2048 at Nemotron-3-Ultra scale) overflowed the i32 expert-index times stride products, corrupting neighboring allocations in the grouped dW kernel. Expert indices and row ids are promoted to i64 at every stride multiplication, across both the ScatterMoE LoRA kernels and the SonicMoE NVFP4 Triton kernels.
- NF4 dequant queued work on a stale CUDA stream (#3888 by @NanoCode012): the fast dequant path cached
current_stream()per device, but the current stream belongs to the caller's context, so a caller running under a non-default stream had its dequant queued on the wrong one. The stream is now resolved per call, read from torch rather than a bitsandbytes internal that upstream may remove. - SSM state leaking across packed sequences on Nemotron (#3945 by @ved1beta): a Mamba2 chunk scan that silently ignores
seq_idxmixes state between packed samples. The resolved scan is now probed once at startup and raises with an install hint instead of training quietly wrong. - Qwen3.5 / Qwen3-Next patches broken by transformers 5.15 (#3937 by @NanoCode012):
self.layer_typewas renamed andflamoved to module level, silently breaking the optimized attention patches. Now covered by tests. - FA4 auto-upgrade silently broke context parallelism (#3928 by @thad0ctor): a configured
flash_attention_2/flash_attention_3was upgraded to FA4 whenever the host supported it, but ring attention only substitutes theflash_attention_2dispatch key, so each rank attended over its own shard alone, producing wrong loss and gradients with no error. The implicit upgrade is now skipped whencontext_parallel_size > 1; an explicitly requestedflash_attention_4is unaffected. - LoRA shards left untrained under FSDP2
cpu_ram_efficient_loading(#3977 by @winglian): every LoRA shard now trains, and the process group is initialized before load for expert parallelism (fixes #3772, which #3779 did not fully address). - Qwen3.5 sample packing crashed in
get_cu_seqlens(#3975 by @Anai-Guo): packedposition_idsarrive as a non-contiguous sliced view thatview(-1)rejects;reshape(-1)is used instead, leaving the already-contiguous path bit-for-bit unchanged (fixes #3973). - FA2 hub kernel pinned to v2 (#3968 by @NanoCode012): the
v3entry in transformers' flash-attention kernel mapping breaks the GQA backward, so the FA2 path resolves the v2 kernel explicitly. The FA2 availability check also stops reporting valid hub-kernel setups as unavailable. - Kimi Delta Attention gating (#3949 by @ved1beta): align the
fused_kda_gatecall with the signature fla changed in 0.4.1, and extract the remote-code redirect into a shared helper that Ling 3.0 reuses, cuttingpatch_kimi_linear.pyfrom 95 lines to 15. - SonicMoE against the upstream kernel (#3954 by @NanoCode012): call upstream's public expert forward instead of re-creating the shim it removed, so an upstream attribute change raises rather than silently mis-training. Also respects
use_kernels: falseand errors on unsupported models. Credit to @OnePunchMonk for the initial report. - FA4 under quack 0.6 and latest transformers (#3847 by @NanoCode012): fixes the FA4 path against the quack 0.6 / cutlass-dsl 4.6.0 stack and current transformers. FA4 now requires
quack-kernels>=0.6.0onnvidia-cutlass-dsl==4.6.0; older quack raisescudaErrorIllegalInstructionin the backward, and on Blackwell the FA4 backward hangs without a patched build. See the attention docs for install steps. - Merged builtin checkpoint conversions (#3893 by @NanoCode012): register weight conversions read-merge-write so a profile's conversions no longer replace the built-ins transformers ships. The NVFP4 expert converters still register in replace mode, and stacking the two under one
model_typenow raises instead of silently dropping one. - Gemma merge produced gibberish (#3758 by @ved1beta): re-sharding a merged model wrote the tensor count into the index's
total_sizefield instead of the byte size; the index now reports both total parameters and total size. - fp32/CPU tensors routed into the varlen flash kernel (#3885 by @winglian): the
sdpa_varlenfast path guarded on mask, dropout, head_dim, and scaling but not dtype or device, so sdpa +sample_packingin fp32 crashed on torch 2.12.1. Such rows fall back to stock SDPA with the rebuilt block-diagonal mask, keeping documents isolated. - Selective activation checkpointing under saved-tensor hooks (#3942 by @Excelius-Wang): feature-detect PyTorch's
respect_saved_tensors_hooksargument and set it explicitly, avoiding the staged warn-then-error behavior and double-processing of SAC-cached tensors (fixes #3883). ddp_timeoutignored during weight loading (#3741 by @ved1beta):ddp_timeoutonly reachedTrainingArguments, too late, sinceinit_distributed_state()has already built the process group on the default 1800s NCCL timeout. Rank 0 loading large weights for over 30 minutes still tripped it.prepare_optim_envnow setsAXOLOTL_NCCL_TIMEOUTbefore any distributed init, so FSDP, DeepSpeed, and DDP all honor it (fixes #3443).- Packing stats when
drop_lastdiscards a batch (#3849 by @Anai-Guo),micro_batch_size/gradient_accumulation_stepsdefaults ignored incheck_batch_size_fields(#3837 by @Anai-Guo). trust_remote_codehandling (#3858 by @NanoCode012): respected properly during packing; vLLM serve and merge-lora now forward model revision andtrust_remote_code(#3960 by @dudeperf3ct).- EBFT config validator bypassed (#3887 by @NanoCode012), KTO argilla-chat follow-ups (#3886 by @NanoCode012).
- Mistral tokenizer
cache_dir(#3859 by @thad0ctor): stop passing the literal string"None"as the cache directory. - Gemma 4 vision batches crashed under FA2 (#3880 by @ved1beta): the hybrid-mask patch forced SDPA on sliding-mask builds too, handing the FA2 sliding layers a 4D mask and tripping a device-side assert in
_upad_input. Calls carryingand_mask_function, which is every Gemma 4 batch that goes throughcreate_masks_for_vision_model, now pass through untouched. - Gemma 4 31B LoRA gradient-norm spikes (#3987 by @NanoCode012): Gemma 4's text attention uses
scaling=1.0with QK-RMSNorm, leaving the softmax structurally near-saturated, so LoRA runs hit intermittent pre-clip gradient norms 100-1000x their neighbours with no matching loss spike (transformers#45676). The 31B configs compensate withlearning_rate: 5e-5andmax_grad_norm: 0.1, and a 32k-sequence31b-lora-fsdp.yamlis added. - Stale numpy slicing TODOs removed (#3921 by @n-dlms).
Infrastructure
- PyTorch 2.13 images (#3877 by @winglian): latest GPU containers move from 2.12.0 to 2.12.1 and gain 2.13.0 variants, nightlies follow to 2.12.1, the stale 2.12.0 base image is dropped, and two 2.13.0 docker e2e jobs are added.
- Docs build fixed (#3924 by @NanoCode012); Mistral tokenizer fixtures load offline (#3970 by @NanoCode012) so CI stops tripping HF rate limits.
- Nightly tests fixed (#3980 by @NanoCode012): bump fla to 0.5.2 after transformers began nested-importing it, install kernels from git main in the nightly workflow, and restore the patched PEFT
_inject_parameterscontract for target parameters. - Dependabot Action bumps: setup-uv 8.2.0 → 10.0.1 (#3939), docker/login-action 3.7.0 → 4.6.0 (#3871, #3927), pypa/gh-action-pypi-publish 1.14.0 → 1.14.2 (#3913, #3925), actions/checkout 7.0.0 → 7.0.1 (#3872), actions/github-script 7.1.0 → 9.0.0 (#3870), actions/setup-python 5.6.0 → 7.0.0 (#3850, #3914), docker/build-push-action 5.4.0 → 7.3.0 (#3852), docker/metadata-action 5.10.0 → 6.2.0 (#3851), docker/setup-buildx-action 4.2.0 → 4.3.0 (#3966), peter-evans/create-pull-request 6.1.0 → 8.1.1 (#3854), marocchino/sticky-pull-request-comment (#3853).
New Contributors
- @latent-9 made their first contribution in #3912
- @n-dlms made their first contribution in #3921
- @Excelius-Wang made their first contribution in #3942
- @alex000kim made their first contribution in #3948
- @dudeperf3ct made their first contribution in #3960
- @JimmyWang0417 made their first contribution in #3969
- @simpleqt made their first contribution in #3985
Full Changelog: v0.18.0...v0.19.0