DiffuRefill-1B

DiffuRefill-1B

Status: pretraining, about half way. Step ~100k of 200k, ~46B effective training tokens, merge round 290. The weights here are a live pretraining checkpoint: fluent English, facts still unreliable, not instruction-tuned. Use global_ema.pt; it is the best checkpoint at every round.

A 1.08B masked-diffusion language model decoded with confidence-targeted re-infilling: draft the whole sequence in a handful of parallel denoising passes, then spend a few more passes rewriting only the tokens the model is least sure about. An autoregressive model needs one pass per token; this one needs ~20 passes for a whole sequence, whatever its length.

parameters 1.08B (embedding tied to the output head)
architecture 18 blocks, dim 2048, 16 heads, SwiGLU 5632, RMSNorm, RoPE, bidirectional attention
context 2048 tokens
tokenizer openbmb/MiniCPM4-0.5B (73,440 tokens; vocab padded to 73,760 for MASK and PAD)
objective absorbing masked diffusion, loss on masked positions only
training DiLoCo across 3-5 single-GPU boxes, synchronised through this repository
progress step ~100k / 200k, ~46B effective tokens

Training progress

training progress

Tracked every round on fixed, deterministic batches, so the change between two rounds carries no sampling noise:

measure what it is latest
held-out CE (EMA) masked CE at t = 0.3 / 0.6 / 0.9 on a fixed Ultra-FineWeb slice no worker trains on 2.939 (round 287)
held-out CE (global) the same for the latest merged global 2.957
fact probe, mc 1,050 PopQA facts written as plain sentences with the answer masked; the gold answer must beat three same-length distractors (chance 0.25) 0.560 (was 0.540 before the data mix)
fact probe, answer NLL per-token NLL of the masked gold answer 6.08 (was 6.55)
fact probe, exact match (EMA) the answer decoded token by token and compared with PopQA's accepted answers 0.083 (was 0.075)
decoding accuracy confidence decoding of 50% masked held-out text in 8 passes: token / adjacent-pair accuracy 0.653 / 0.453 (round 275)

The guard-probe curve at the top is measured on an Ultra-FineWeb slice. When the fact-dense sources were added at step ~96.8k, Ultra-FineWeb fell from 100% to 56% of the documents, and that probe rose by design while the fact probe improved quickly. From here the fact probe and the held-out CE are the numbers to watch. No public benchmark scores are reported yet: at this stage they would sit near chance and say little.

How it is trained

Fleet. Ephemeral single-GPU boxes (RTX PRO 6000 Blackwell, 96 GB) with no interconnect, joined DiLoCo-style through this repository. Each worker trains 150 local AdamW steps, pushes ckpt_wNN.pt, and adopts the merged global_b.pt.

  • Merging. The merger averages the round's checkpoints (a plain mean, folded into a running fp32 sum as they arrive) and waits at most 150 s past the first arrival.
  • Phase. Workers pick up a new global as soon as it appears and take its step counter, so the fleet starts each interval together.
  • EMA. An exponential average of the globals (β 0.9) is published as global_ema.pt.

Objective.

  • t ~ U(0.15, 1) per row, with positions masked independently.
  • Half of the rows keep a random-length clean prefix, which is the shape of prompted generation.
  • Attention stays inside each packed document.
  • On a quarter of the rows, names and numbers are masked as whole spans (salient span masking). Masked token by token, a two-token name leaks through its visible half; masked whole, it has to be recalled.

Optimiser. AdamW (0.9, 0.95), weight decay 0.1, clip 1.0, peak LR 1.5e-4, cosine to 10% over 200k steps. Each worker step covers 64 × 2048 = 131,072 tokens. The blocks are torch.compiled.

Data (by document, from step ~96.8k):

source share
Ultra-FineWeb-L3 Multi-Style + QA synthetic 56%
Wikipedia (en) 15%
FineMath 4+ 8%
Cosmopedia v2 8%
OpenCoder annealing: algorithmic corpus + code snippets 8%
Wikipedia leads restated as textbook / lecture / museum-guide prose (own corpus, filtered for copying and for numbers not in the source) 5%

Before step ~96.8k the model saw Ultra-FineWeb only.

What the run taught

Measured on this model or on its 37.9M-parameter stand, with fixed probes:

change result
peak LR 3e-4 → 1.5e-4 Local drift over one interval fell from 0.076 to 0.013 CE. The merged model improved from 4.336 to 4.288.
keeping local drift across a merge (θ += global − pushed) Worse in 60 of 63 adoptions, +0.079 CE on average. The run uses plain replacement.
EMA of the globals Beats the latest global every round. Seeding training from it gave the gain back.
outer Nesterov (μ 0.5) Raised held-out CE for three rounds. Reverted.
Muon switched on mid-run Loss rose from 3.16 to 3.32. It was a 2× win from scratch on the stand, but not as a switch on a running model.
span masking, PMI units, stratified t, complementary masks Each lost to plain independent masking on the stand. Span masking was removed at step ~91.9k.
fact-dense data mix + salient span masking Fact-probe answer NLL 6.55 → 6.08 within about four hours.
torch.compile per block 17% faster steps, less memory.
FP8 matmuls (torchao, rowwise or tensorwise) No speed-up on this card. Not used.

The method

1. K denoising steps           -> a full draft + a confidence value per position
2. repeat R times:
     take the p% least confident generated positions
     re-mask them
     one forward pass          -> new tokens, chosen with both sides in view
     refresh their confidence

Cost is K + R forward passes. One refill pass fixes any number of positions at once, because the model processes the whole sequence in parallel. That is what makes targeted repair cheaper than more denoising.

Decoding configuration

The draft and the refill deliberately use different sampling rules. The draft decides what the text is about and needs freedom. The refill touches a fifth of the tokens and needs discipline. Sharing one setting between them trades every metric straight against another.

stage settings
draft K=12, temperature 2.2 -> 0.9 annealed, Gumbel noise 2.5 on the unmask order, no truncation
refill R=8, p=20%, temperature 0.8, min_p=0.10
both neighbour ban: subtract 6.0 from the logit of the token already standing to the left or right; never commit two positions closer than 2 in one pass
  • Gumbel unmask order. Strict top-k confidence reveals the easy positions first, such as articles and punctuation. Content words are left for last, when the context is already frozen. Annealed Gumbel noise on the log confidences breaks that order. It was the largest single effect in the pilot.
  • Neighbour ban and commit gap. Two adjacent positions sampled independently both pick the locally likely token. That is how parallel decoding produces repeats, and these two rules target exactly that.
  • Split-stage sampling. A hot, free draft followed by a cool, truncated refill.

Pilot results (TinyStories, 37.9M parameters)

Two models of identical architecture were trained from scratch on the same corpus: one autoregressive, one masked-diffusion. An independent judge (roneneldan/TinyStories-33M, related to neither) scored the NLL of each model's generated continuation.

calls NLL ↓ doubled tokens ↓ distinct-2 ↑
real text — 1.15 1.38% 0.478
autoregressive 128 3.08 1.64% 0.466
diffusion + refill, tuned 20 2.87 0.30% 0.459

The diffusion model matched autoregression in quality at a sixth of the passes. It produced five times fewer doubled tokens than the autoregressive baseline, below the rate in the real corpus. Diversity came out at parity, slightly under autoregression.

What did not work in the pilot:

  • Autoregressive repair of the draft. It was worse than not repairing at all. An AR model scoring position i cannot see i+1, so it duplicates the neighbour it is not looking at.
  • Self-repair training on the model's own drafts. It was harmful at 60–100% corruption and neutral at 10–35%.

Honest limits

  • Unfinished. Half of the planned steps remain, and facts are unreliable. Expect confident, fluent mistakes.
  • The pilot evidence is small. 37.9M parameters on TinyStories does not show that the decoding results transfer to 1B on natural text.
  • The judge is an AR model. A low NLL under it rewards predictable text as well as good text.
  • Diffusion costs more to train. It learns only from masked positions, so it reads more tokens than an AR model for the same quality. The saving is entirely at inference.

Files

file contents
global_ema.pt EMA of the merged globals; the checkpoint to use
global_b.pt the latest merged global
ckpt_wNN.pt, log_wNN.txt per-worker checkpoints and logs, overwritten every interval
config.json the exact architecture, objective, data mix and training setup
pilots/ held-out and fact-probe logs, stand pilot results

Checkpoints are torch.save dicts with a model state dict for the Net class described in config.json.

Downloads last month
28,221
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Datasets used to train Asilarkness/DiffuRefill-1B