Nemotron-3.5-30B-A3B-Antislop-FTPO

A merged, ready-to-serve BF16 checkpoint of NVIDIA's Nemotron 3.5 30B-A3B, tuned with Antislop and FTPO to suppress the overused lexical patterns that make LLM prose recognisable as LLM prose.

66.4% of overused patterns suppressed, with no statistically detectable loss of writing quality and no capability regression.

The LoRA adapter that produced this checkpoint is released separately at thoughtworks/Nemotron-3.5-30B-A3B-Antislop-FTPO-LoRA.

What this is

Language models overuse a characteristic vocabulary: stock dialogue tags, a fixed set of atmospheric props, and a long tail of names like Elara and Kael. Antislop identifies those patterns for this specific model by comparing its output against a human-written baseline, then uses a backtracking sampler to catch the model reaching for one and record what it should have reached for instead. Those records become preference pairs, and FTPO (Final Token Preference Optimization) trains the preference into the weights so it persists with the sampler switched off.

FTPO adjusts only the specific token choices that need adjusting, holding the rest of the vocabulary steady. That precision is what keeps capabilities intact.

What gets banned

The banlist is not a hand-written style guide. It is 4,267 patterns measured as overused in this model's own output relative to human prose. A sample, with raw counts across the 400 held-out prompts, sampler off, so these are weight-level changes:

Banned pattern Baseline FTPO
said, his voice dropping 18 0
panic, cold and sharp 15 0
voice dropping an octave 17 4
heart hammered against my ribs 12 1
breath hitching in my throat 6 0
dust motes dancing 11 2
smelled of ozone and old paper 5 0
sharp, metallic tang 5 0
words hung in the air 5 0

Every count above is spread across distinct outputs rather than concentrated in one, e.g. said, his voice dropping appears 18 times in 17 different stories before training and in none after.

The name distribution shows the same effect. These are the default protagonists the base model reaches for unprompted:

Name Baseline (uses / stories) FTPO
Elias 244 / 43 44 / 10
Kael 204 / 39 47 / 15
Elara 139 / 30 66 / 15
Kaelen 78 / 16 15 / 3
Thorne 58 / 25 16 / 12

The banlist also catches assistant register bleeding into fiction, e.g. happy to help craft (4 → 0) and let me know if you'd like (5 → 0), where the model breaks frame to address the user mid-story.

Note that suppression is a reduction, not a hard filter. Patterns still surface occasionally; the sampler is available at inference time if you want them driven closer to zero.

Results

Evaluated on 400 held-out Reddit writing prompts (indices 1000 to 1399, with the pipeline trained on 0 to 999), identical sampling for both models (temp 1.0, top_p 1.0, top_k 50, min_p 0.01), Antislop sampler off. These numbers reflect what training changed in the weights, not what a sampler suppresses at inference.

Metric Baseline FTPO Δ Significant?
Banlist suppression (prose only) 0% 66.41% +66.41
Banlist suppression (all outputs) 0% 58.35% +58.35
MMLU (600 q, thinking on) 0.8383 0.8433 +0.0050
GSM8K (250 q, thinking on) 0.9240 0.9360 +0.0120
Writing quality (0 to 100, claude-opus-5 judge, n=150 paired) 54.30 53.34 −0.96 no (CI −2.36 to +0.44)
Lexical diversity (index, baseline=100) 100.00 98.44 −1.56
Refusal rate on writing prompts 15.25% 20.00% +4.75pp no (McNemar p=0.073)

Lexical diversity at 98.4% sits inside the 95 to 102% band the Antislop paper reports for FTPO, and well clear of the 74 to 92% collapse it measures for DPO.

Agentic and reasoning benchmarks

Single H200, vLLM nightly, tool calling via the qwen3_xml parser, greedy decoding, identical harnesses. The τ-bench user simulator was claude-sonnet-5 for both models.

Benchmark n Baseline FTPO Δ Verdict
τ-bench retail (3 trials) 345 0.6870 0.6812 −0.58pp noise
τ-bench airline (3 trials) 150 0.5333 0.4933 −4.00pp noise
τ-bench combined 495 0.6404 0.6242 −1.62pp noise
MMLU-Pro 600 0.7033 0.7133 +1.00pp noise
HumanEval+ 164 0.7500 0.7073 −4.27pp noise
IFEval prompt-strict 323 0.3870 0.3870 0.00pp noise
IFEval instruction-strict 323 0.4799 0.4675 −1.24pp noise

No benchmark difference is statistically distinguishable from zero. Every confidence interval crosses zero.

Usage

Requires trust_remote_code=True for the nemotron_h architecture.

from transformers import AutoModelForCausalLM, AutoTokenizer

model_id = "thoughtworks/Nemotron-3.5-30B-A3B-Antislop-FTPO"
tok = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
    model_id, torch_dtype="bfloat16", device_map="auto", trust_remote_code=True
)

messages = [{"role": "user", "content": "Write the opening of a story about a lighthouse keeper."}]
text = tok.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
out = model.generate(**tok(text, return_tensors="pt").to(model.device), max_new_tokens=512)
print(tok.decode(out[0], skip_special_tokens=True))

Note: on transformers 5.14.x, apply_chat_template(..., tokenize=True) under the TokenizersBackend tokenizer class returns a truncated sequence. Render with tokenize=False and tokenize the resulting string, as shown above. This affects the upstream base model identically and is not specific to this checkpoint.

vLLM

VLLM_USE_RUST_FRONTEND=1 vllm serve --model thoughtworks/Nemotron-3.5-30B-A3B-Antislop-FTPO \
    --moe-backend flashinfer_cutlass \
    --trust-remote-code \
    --max-num-batched-tokens 4096 \
    --speculative_config.method mtp \
    --speculative_config.num_speculative_tokens 1 \
    --speculative_config.moe_backend flashinfer_cutlass \
    --mamba-backend flashinfer \
    --enable-prefix-caching \
    --mamba-cache-mode align \
    --max-num-seqs 16 \
    --max-model-len 65536

For tool calling, use the qwen3_xml parser, which handles this model's XML tool syntax correctly.

Training

Method Antislop, then FTPO (Final Token Preference Optimization)
Target modules lm_head only
LoRA rank / alpha / dropout 256 / 256 / 0.05
Steps / epochs 265 / 1
Learning rate 4.97e-05 (auto-scaled)
Final loss ~1.2
Pipeline iterations 2 (iter 0 baseline profiling, iter 1 antislop generation)
Generation 1,000 prompts per iteration
Preference examples ~13,000
Banlist size 4,267 patterns
Hardware 2x H100, about 12.7 h total, of which about 4 h 15 m was the FTPO stage

Model architecture

Inherited unchanged from the base model. A hybrid Latent Mixture-of-Experts design with interleaved Mamba-2 and MoE layers plus select attention layers, and Multi-Token Prediction (MTP) layers for speculative decoding. 30B total parameters, 3B active. Context length up to 262,144 in this checkpoint's config.

License

Released under OpenMDW-1.1, matching the license NVIDIA applies to the public Nemotron 3.5 Lightning releases. The Antislop framework itself is MIT-licensed.

Citation

The method was published at ICLR 2026:

@inproceedings{paech2026antislop,
  title     = {Antislop: A Comprehensive Framework for Identifying and Eliminating
               Repetitive Patterns in Language Models},
  author    = {Paech, Samuel and Roush, Allen and Goldfeder, Judah and Shwartz-Ziv, Ravid},
  booktitle = {The Fourteenth International Conference on Learning Representations},
  year      = {2026},
  url       = {https://openreview.net/forum?id=gLcyM1khyp},
  eprint    = {2510.15061},
  archivePrefix = {arXiv},
  primaryClass = {cs.CL}
}

Acknowledgements

Built on NVIDIA's Nemotron 3.5, with thanks to the NVIDIA team for the benchmark guidance that shaped the evaluation.

Downloads last month
634
Safetensors
Model size
33B params
Tensor type
F32
·
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for thoughtworks/Nemotron-3.5-30B-A3B-Antislop-FTPO

Finetuned
(13)
this model
Quantizations
2 models

Paper for thoughtworks/Nemotron-3.5-30B-A3B-Antislop-FTPO