File size: 14,352 Bytes
b5f4a54
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
---
license: mit
language:
- ru
- en
pipeline_tag: text-generation
tags:
- dllm
- diffusion
- diffusion-language-modeling
- instruct
library_name: transformers
---
# Zarya-1.7B

Zarya is a family of hybrid language models that combine a classic auto-regressive (AR) objective with a masked-diffusion (MDM) objective in one model.
The architecture can be built on top of any autoregressive model but in this repository it uses the `Qwen3` backbone.

Naming explanation: Zarya (pronounced as [zɐˈrʲa] ([IPA notation](https://en.wiktionary.org/wiki/Appendix:Russian_pronunciation)), literally "Dawn" in English) is a figure from Slavic folklore — a female personification of dawn who may be considered a goddess.
In various traditions, she can manifest as a single being or as two or three sisters simultaneously.

This is a research prototype.

## Model Details

### Model Description

Zarya is a research prototype of a family of hybrid language models that jointly learn a classic auto-regressive (AR) objective and a masked-diffusion (MDM) objective within a single model.

Two generation modes are supported, both reachable through a single `model.generate(...)` call: masked-diffusion (MDM) sampling and slotted-level speculative parallel decoding.

- **Model type:** Hybrid auto-regressive (AR) + masked-diffusion language model (DLLM); backbone `Qwen3`, wrapper `Zarya`
- **Language(s) (NLP):** Russian and English
- **License:** MIT
- **Preprint:** https://arxiv.org/abs/2609.19868
- **Repository with training code:** https://github.com/ai-forever/zarya

### Zarya-1.7B details
Zarya-1.7B has the following features:

| Variant    | hidden_size | num_hidden_layers | num_attention_heads | intermediate_size |
|------------|-------------|-------------------|---------------------|-------------------|
| Zarya-1.7B | 2048        | 28                | 16                  | 6144              |

Context Length: 2048

## Uses

Zarya is intended for text generation.
It supports conversational fine-tuning (SFT) and classic auto-regressive pretraining.

### Direct Use

Direct use is text generation (continuation of a prompt) through the `model.generate(...)` interface, including chat-style prompts formatted with the provided chat template.
Two inference modes are available through the same `generate()` call.
Both modes fully use the KV cache with causal attention masks.
- **MDM sampling** (`slotted_generation=false`): iterative masked-diffusion denoising with the first-hitting sampler.
- **Slotted speculative decoding** (`slotted_generation=true`): parallel slot generation with inter-slot diffusion-based selection and intra-slot autoregressive generation for a decoding speedup.

### Out-of-Scope Use

The model is a research prototype.
It should not be used for production decisions, safety-critical applications, or any use case where accuracy and reliability are essential without additional evaluation and safeguards.
Inference performance and stability also depend on the chosen decoding hyperparameters (like `slotted_generation`, `slot_size`, `serial_num_blocks`, `slot_threshold`, `token_threshold`, and others).

## Bias, Risks, and Limitations

This is a research prototype.
The code relies on Hugging Face Transformers APIs; when upgrading versions, compatibility must be checked (tested on Transformers 5.12.1 and PyTorch 2.9.0).
Inference performance and stability depend on the choice of config parameters.

## How to Get Started with the Model

Use the code below to get started with the model. Loading the model and tokenizer requires `trust_remote_code=True`.

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

model_name = "ai-forever/Zarya-1.7B"

model = AutoModel.from_pretrained(model_name, trust_remote_code=True, torch_dtype=torch.bfloat16).cuda()
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)

prompt = "<|im_start|>user\nHello!<|im_end|>\n<|im_start|>assistant\n"
input_ids = tokenizer(prompt, return_tensors="pt").input_ids.cuda()

# Both modes go through model.generate(...).
# With generation_config.slotted_generation=true -> slotted speculative decoding:
out = model.generate(
    input_ids,
    max_new_tokens=256,
    do_sample=True,
    temperature=0.7,
    slot_size=16,
    serial_num_blocks=4,
    slot_threshold=0.9,
    token_threshold=0.3,
)
# Setting generation_config.slotted_generation=false -> MDM sampling instead:
# out = model.generate(input_ids, max_new_tokens=256)

print(tokenizer.decode(out[0]))
```


## Evaluation

LM-eval benchmarking with the `lm-eval` package is supported. Example run:

```bash
lm_eval run \
--tasks=gsm8k,ifeval,mbpp,mbpp_instruct,mbpp_plus,mbpp_plus_instruct,hellaswag \
--model=hf --confirm_run_unsafe_code \
--log_samples \
--apply_chat_template \
--output_path=./reports/lm-eval_results \
--model_args=pretrained=ai-forever/Zarya-1.7B,backend=causal,dtype=bfloat16,attn_implementation=sdpa,trust_remote_code=True \
--gen_kwargs slotted_generation=true,slot_size=16,serial_num_blocks=4,slot_threshold=0.9,token_threshold=0.4
```

### Zarya-1.7B results

Measurements below were collected with varying inference parameters and on different GPUs; performance is sensitive to both, so results may differ across configurations and hardware setups.

#### A100, `dtype=bfloat16`, `apply_chat_template`, `slotted_generation=true,slot_size=16,serial_num_blocks=4,slot_threshold=0.9,token_threshold=0.4`

Hardware info:
gpu_driver_cuda_version 13.2;
gpu_driver_version 595.71.05;

Docker info:
Torch: 2.9.0+cu128; Transformers: 5.12.1; CUDNN in torch: 91002;
`lm-eval == 0.4.12`

| Tasks     | Version | Filter           | n-shot | Metric                  |   |  Value |   | Stderr |
|-----------|--------:|------------------|-------:|-------------------------|---|-------:|---|--------|
| gsm8k     |       3 | flexible-extract |      5 | exact_match             | ↑ | 0.4670 | ± | 0.0137 |
|           |         | strict-match     |      5 | exact_match             | ↑ | 0.4685 | ± | 0.0137 |
| hellaswag |       1 | none             |      0 | acc                     | ↑ | 0.4224 | ± | 0.0049 |
|           |         | none             |      0 | acc_norm                | ↑ | 0.5472 | ± | 0.0050 |
| ifeval    |       4 | none             |      0 | inst_level_loose_acc    | ↑ | 0.5815 | ± | N/A    |
|           |         | none             |      0 | inst_level_strict_acc   | ↑ | 0.5552 | ± | N/A    |
|           |         | none             |      0 | prompt_level_loose_acc  | ↑ | 0.4492 | ± | 0.0214 |
|           |         | none             |      0 | prompt_level_strict_acc | ↑ | 0.4288 | ± | 0.0213 |
| mbpp      |       1 | none             |      3 | pass_at_1               | ↑ | 0.3540 | ± | 0.0214 |
| mbpp_plus |       1 | none             |      3 | pass_at_1               | ↑ | 0.4815 | ± | 0.0257 |


#### H100, `dtype=bfloat16`, `apply_chat_template`, `slotted_generation=true,slot_size=16,serial_num_blocks=4,slot_threshold=0.9,token_threshold=0.4`

Hardware info:
gpu_driver_cuda_version 13.0;
gpu_driver_version 580.105.08;

Docker info:
Torch: 2.9.0+cu128; Transformers: 5.12.1; CUDNN in torch: 91002;
`lm-eval == 0.4.12`

| Tasks              | Version | Filter           | n-shot | Metric                  |   |  Value |   | Stderr |
|--------------------|--------:|------------------|-------:|-------------------------|---|-------:|---|--------|
| arc_challenge      |       1 | none             |      0 | acc                     | ↑ | 0.4437 | ± | 0.0145 |
|                    |         | none             |      0 | acc_norm                | ↑ | 0.4573 | ± | 0.0146 |
| gsm8k              |       3 | flexible-extract |      5 | exact_match             | ↑ | 0.0553 | ± | 0.0063 |
|                    |         | strict-match     |      5 | exact_match             | ↑ | 0.0455 | ± | 0.0057 |
| hellaswag          |       1 | none             |      0 | acc                     | ↑ | 0.4227 | ± | 0.0049 |
|                    |         | none             |      0 | acc_norm                | ↑ | 0.5474 | ± | 0.0050 |
| hendrycks_math500  |       1 | none             |      0 | exact_match             | ↑ | 0.0040 | ± | 0.0028 |
| humaneval          |       1 | create_test      |      0 | pass@1                  | ↑ | 0.0000 | ± | 0      |
| humaneval_instruct |       4 | create_test      |      0 | pass@1                  | ↑ | 0.0549 | ± | 0.0178 |
| ifeval             |       4 | none             |      0 | inst_level_loose_acc    | ↑ | 0.4317 | ± | N/A    |
|                    |         | none             |      0 | inst_level_strict_acc   | ↑ | 0.4053 | ± | N/A    |
|                    |         | none             |      0 | prompt_level_loose_acc  | ↑ | 0.3013 | ± | 0.0197 |
|                    |         | none             |      0 | prompt_level_strict_acc | ↑ | 0.2791 | ± | 0.0193 |
| mbpp               |       1 | none             |      3 | pass_at_1               | ↑ | 0.0000 | ± | 0      |
| mbpp_plus          |       1 | none             |      3 | pass_at_1               | ↑ | 0.0000 | ± | 0      |

#### H100, `dtype=bfloat16`, `apply_chat_template`, `slotted_generation=false,T=0,temperature=0.5,top_p=0.8,do_sample=true,noise_schedule=linear`

Hardware info:
gpu_driver_cuda_version 13.0;
gpu_driver_version 580.105.08;

Docker info:
Torch: 2.9.0+cu128; Transformers: 5.12.1; CUDNN in torch: 91002;
`lm-eval == 0.4.12`

| Tasks              | Version | Filter           | n-shot | Metric                  |   |  Value |   | Stderr |
|--------------------|--------:|------------------|-------:|-------------------------|---|-------:|---|--------|
| arc_challenge      |       1 | none             |      0 | acc                     | ↑ | 0.4437 | ± | 0.0145 |
|                    |         | none             |      0 | acc_norm                | ↑ | 0.4573 | ± | 0.0146 |
| gsm8k              |       3 | flexible-extract |      5 | exact_match             | ↑ | 0.0091 | ± | 0.0026 |
|                    |         | strict-match     |      5 | exact_match             | ↑ | 0.0000 | ± | 0      |
| hellaswag          |       1 | none             |      0 | acc                     | ↑ | 0.4227 | ± | 0.0049 |
|                    |         | none             |      0 | acc_norm                | ↑ | 0.5474 | ± | 0.0050 |
| hendrycks_math500  |       1 | none             |      0 | exact_match             | ↑ | 0.0000 | ± | 0      |
| humaneval          |       1 | create_test      |      0 | pass@1                  | ↑ | 0.0000 | ± | 0      |
| humaneval_instruct |       4 | create_test      |      0 | pass@1                  | ↑ | 0.0000 | ± | 0      |
| ifeval             |       4 | none             |      0 | inst_level_loose_acc    | ↑ | 0.2002 | ± | N/A    |
|                    |         | none             |      0 | inst_level_strict_acc   | ↑ | 0.1655 | ± | N/A    |
|                    |         | none             |      0 | prompt_level_loose_acc  | ↑ | 0.1072 | ± | 0.0133 |
|                    |         | none             |      0 | prompt_level_strict_acc | ↑ | 0.0776 | ± | 0.0115 |
| mbpp               |       1 | none             |      3 | pass_at_1               | ↑ | 0.0000 | ± | 0      |
| mbpp_plus          |       1 | none             |      3 | pass_at_1               | ↑ | 0.0000 | ± | 0      |


#### H100, `dtype=bfloat16`, `apply_chat_template`, `slotted_generation=true,slot_size=16,serial_num_blocks=4,slot_threshold=0.9,token_threshold=0.4,max_gen_toks=2048`

Hardware info:
gpu_driver_cuda_version 13.0;
gpu_driver_version 580.105.08;

Docker info:
Torch: 2.9.0+cu128; Transformers: 5.12.1; CUDNN in torch: 91002;
`lm-eval == 0.4.12`

| Tasks              | Version | Filter           | n-shot | Metric                  |   |  Value |   | Stderr |
|--------------------|--------:|------------------|-------:|-------------------------|---|-------:|---|--------|
| arc_challenge      |       1 | none             |      0 | acc                     | ↑ | 0.4437 | ± | 0.0145 |
|                    |         | none             |      0 | acc_norm                | ↑ | 0.4573 | ± | 0.0146 |
| gsm8k              |       3 | flexible-extract |      5 | exact_match             | ↑ | 0.0167 | ± | 0.0035 |
|                    |         | strict-match     |      5 | exact_match             | ↑ | 0.0099 | ± | 0.0027 |
| hellaswag          |       1 | none             |      0 | acc                     | ↑ | 0.4227 | ± | 0.0049 |
|                    |         | none             |      0 | acc_norm                | ↑ | 0.5474 | ± | 0.0050 |
| hendrycks_math500  |       1 | none             |      0 | exact_match             | ↑ | 0.0000 | ± | 0      |
| humaneval          |       1 | create_test      |      0 | pass@1                  | ↑ | 0.0000 | ± | 0      |
| humaneval_instruct |       4 | create_test      |      0 | pass@1                  | ↑ | 0.0671 | ± | 0.0196 |
| ifeval             |       4 | none             |      0 | inst_level_loose_acc    | ↑ | 0.4508 | ± | N/A    |
|                    |         | none             |      0 | inst_level_strict_acc   | ↑ | 0.4269 | ± | N/A    |
|                    |         | none             |      0 | prompt_level_loose_acc  | ↑ | 0.3142 | ± | 0.0200 |
|                    |         | none             |      0 | prompt_level_strict_acc | ↑ | 0.2865 | ± | 0.0195 |
| mbpp               |       1 | none             |      3 | pass_at_1               | ↑ | 0.0000 | ± | 0      |
| mbpp_plus          |       1 | none             |      3 | pass_at_1               | ↑ | 0.0000 | ± | 0      |

---

## Citation

If you find our work helpful, please consider citing (citation will be updated after peer-reviewed publication):

```bibtex
@misc{sinev-etal-2026-Zarya,
  author        = {Sinev, Leonid and Koziev, Ilya and Leshchuk, Vladislav},
  title         = {Zarya: A Hybrid Autoregressive--Masked Diffusion Language Model with Flexible Training and Dual-Mode Inference},
  year          = {2026},
  archiveprefix = {arXiv},
  eprint        = {2609.19868},
  primaryclass  = {cs.CL},
  url           = {https://arxiv.org/abs/2609.19868},
}
```