Text Generation
Transformers
Safetensors
English
metadiffusion
diffusion
diffusion-lm
ar-to-diffusion
custom_code
File size: 4,125 Bytes
006a18b
 
f3e0e57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
006a18b
f3e0e57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6f36850
 
18eebaf
 
 
6f36850
 
 
 
 
 
18eebaf
6f36850
 
 
 
 
18eebaf
6f36850
 
 
18eebaf
6f36850
 
 
 
18eebaf
 
6f36850
 
 
18eebaf
6f36850
18eebaf
6f36850
 
f3e0e57
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
---
license: apache-2.0
datasets:
- HuggingFaceTB/smol-smoltalk
- HuggingFaceH4/no_robots
- nvidia/OpenMathInstruct-2
language:
- en
base_model:
- Qwen/Qwen3-0.6B
pipeline_tag: text-generation
library_name: transformers
tags:
- metadiffusion
- diffusion
- diffusion-lm
- ar-to-diffusion
---

# MetaDiffusion-600M-ChatBase

Experimental bidirectional masked-diffusion chat model converted from Qwen3-0.6B via AR-to-diffusion model surgery (28L x 1024W, ~0.82B params, untied head, bf16, 40K-token context (RoPE base 1e6), Apache-2.0). Intended as a base for further SFT, not a production chatbot.

## What this is

The AR checkpoint becomes the initialization (weights copied, timestep modules zero-init, the [MASK] and seven auxiliary "rainbow" padding rows are mean-initialized); diffusion behavior is learned throughout training. Trained using smol-smoltalk, no_robots, and OpenMathInstruct-2.

## Architecture
- Blocks: 28 transformer layers, hidden dim 1024, SwiGLU MLP with intermediate 3072, pre-norm RMSNorm (eps 1e-6), QK-norm on. Timestep conditioning is a sinusoidal MLP embedding (1024) feeding per-block adaLN-style scale+shift modulation.

- Attention: GQA with 16 query heads / 8 KV heads, head_dim 128. Bidirectional self-attention with no causal mask.

- Context: 40,960 tokens max (RoPE, base theta 1e6).

- Params: 0.82B total with untied embeddings: embed_tokens 151,677 x 1024 and a separate lm_head of the same size.

- Vocab / IO: 151,677 rows = Qwen3's 151,669 + [MASK] (id 151669) + 7 rainbow padding tokens (151670-151676); pad_token_id is <|endoftext|> (151643), eos is <|im_end|> (151645). bf16 weights, 371 tensors in model.safetensors.

## Use with Transformers

```python
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

repo = "CodeSoft/MetaDiffusion-600M-ChatBase"

m = AutoModelForCausalLM.from_pretrained(
    repo,
    trust_remote_code=True,
    dtype=torch.bfloat16,
).to("cuda")

tok = AutoTokenizer.from_pretrained(
    repo,
    subfolder="tokenizer",
    trust_remote_code=True,
)

prompt = tok.apply_chat_template(
    [{"role": "user", "content": "hi"}],
    tokenize=False,
    add_generation_prompt=True,
)

inputs = tok(prompt, return_tensors="pt").to("cuda")

with torch.inference_mode():
    out = m.generate(
        **inputs,
        max_new_tokens=100,
    )

print(tok.decode(out[0], skip_special_tokens=True))

```

# Chat with it (chat.py)
```bash
python chat.py \
      --model-path model.safetensors \
      --tokenizer ./tokenizer \
      --im-end-bias 2.0 --im-end-bias-t 0.3 --watch
```
## Fine-tune (train.py)

```bash
# 1. Init: convert the AR model to a diffusion init
python convert.py --source Qwen/Qwen3-0.6B \
    --output init/metadiffusion-600M-instruct.pt \
    --tokenizer-out data/tokenizer

# 2. Corpus: smol, opc, math and no_robots, or a local --jsonl of {"messages": [...]} rows.
#    --val-fraction holds out a disjoint val set for early stopping.
python prepare_data.py --datasets smol,math --out data \
    --val-fraction 0.05

# 3. Train (defaults: lr 5e-5, bf16, seq 512, batch auto-detected)
python train.py --init-checkpoint init/metadiffusion-600M-instruct.pt \
    --data-dir data --output-dir checkpoints --max-steps 30000

# 4. Continue a run: checkpoints carry model + optimizer + scheduler
#    state, so --resume-from picks up LR position and momentum exactly
python train.py --init-checkpoint init/metadiffusion-600M-instruct.pt \
    --data-dir data --output-dir checkpoints \
    --resume-from checkpoints_p2/step_20000.pt --max-steps 16000

# 5. Test, then ship
python chat.py --model-path checkpoints_/step_30000.pt \
    --tokenizer data/tokenizer --watch
python export_hf.py --checkpoint checkpoints/step_30000.pt \
    --tokenizer data/tokenizer --output MetaDiffusion-600M-ChatBase
```
## Limitations

This model is an experimental research checkpoint intended for further fine-tuning and experimentation. It is not optimized for instruction-following, factuality, safety, or production deployment. Behavior may differ substantially from the original Qwen3-0.6B-Instruct model.

## License

Apache-2.0