File size: 5,006 Bytes
f3a0e46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
---
license: apache-2.0
pipeline_tag: text-to-image
library_name: jit-ddt
tags:
  - diffusion-transformer
  - pixel-space
  - text-to-image
---

# JiT-DDT

**Code:** [github.com/Linum-AI/jit-ddt](https://github.com/Linum-AI/jit-ddt)
 ·  **Blog post:** [Training Text-to-Image Models 3.6x Faster](https://www.linum.ai/field-notes/jit-ddt)

![Linum v2 versus JiT-DDT on the same prompt, with GPU-hours and samples seen](assets/summary.png)

*The same prompt from Linum v2 (2.0B latent-space DiT + VAE, 256x256) and from JiT-DDT
(pixel-space, 512x512). JiT-DDT reached this quality in 3.6x fewer GPU-hours and 4.2x fewer
samples, at 4x the pixels. The write-up is in the
[blog post](https://www.linum.ai/field-notes/jit-ddt).*

> **This is a research artifact, not a full model release.** This model was
> trained for 138M samples and has not been post-trained. Rather, this is a research preview on
> the road to our v3 model. We're releasing it because we want to share our preliminary findings
> with the broader field and encourage others to explore efficient training methods like ours.

JiT-DDT is a 2.5B-parameter pixel-space text-to-image diffusion transformer from Linum: an
encoder DiT (64x64-pixel patches, produces a structural plan) and a decoder DiT (32x32-pixel
patches, consumes the plan in-context) trained jointly, generating 512x512 RGB images with
no VAE. Captions are encoded with Qwen3.5-4B (hidden layers 7/15/27 concatenated).

Code, sampler, reference loss, and the inference code:
[github.com/Linum-AI/jit-ddt](https://github.com/Linum-AI/jit-ddt).

## Files

| File | Contents |
|---|---|
| `model.safetensors` | EMA weights, fp32, 598 tensors, 2,487,506,290 parameters (9.95 GB). Keep fp32: the model runs its fp32 master weights under bf16 autocast, which is what the samples in this card were generated with. |
| `config.json` | Architecture, text-encoder recipe, sampler defaults, and provenance (source checkpoint step, EMA half-life). |
| `export_manifest.json` | Export audit: dropped training-only tensors, key renames, weights SHA256. |

## Usage

```bash
git clone https://github.com/Linum-AI/jit-ddt && cd jit-ddt && pip install -e .
PROMPT="A close-up portrait of a young white woman with vibrant, fiery red hair cascading over \
her shoulders in soft waves, framed from the shoulders up and centered against a softly blurred \
warm-toned background. Her fair, lightly freckled complexion sets off piercing green eyes and a \
subtle, closed-lipped smile. Soft natural light enters from the left of the frame, highlighting \
the texture of her hair and the curve of her cheek while leaving the right side in gentle shadow. \
A shallow depth of field renders the background into smooth, neutral bokeh. Lights dangle out of \
focus on the left side of the frame."
python generate.py --weights Linum-AI/jit-ddt --qwen_model_path Qwen/Qwen3.5-4B \
    --prompt "$PROMPT" --seeds 42
```

```python
from jit_ddt import JitDDT, QwenTextEncoder, SamplerConfig, generate

model = JitDDT.from_pretrained("Linum-AI/jit-ddt")          # downloads from the Hub
text_encoder = QwenTextEncoder("Qwen/Qwen3.5-4B")
prompt = (
    "A close-up portrait of a young white woman with vibrant, fiery red hair cascading over her "
    "shoulders in soft waves, framed from the shoulders up and centered against a softly blurred "
    "warm-toned background. Her fair, lightly freckled complexion sets off piercing green eyes and "
    "a subtle, closed-lipped smile. Soft natural light enters from the left of the frame, "
    "highlighting the texture of her hair and the curve of her cheek while leaving the right side "
    "in gentle shadow. A shallow depth of field renders the background into smooth, neutral bokeh. "
    "Lights dangle out of focus on the left side of the frame."
)
images = generate(model=model, text_encoder=text_encoder, prompt=prompt, seeds=[42],
                  sampler=SamplerConfig())
```

The prompt above is the `woman_red_hair` validation prompt used throughout training and in the
blog post.

Sampling: 50 Euler steps, adaptive projected guidance at scale 15, initial noise scale 2.

## Provenance

Weights are the EMA (half-life 6,594 steps) trained on 138M image samples in two stages
(logit-normal timesteps (0.8, 0.8) then (-0.2, 1.0)).

The 241M-parameter PixelREPA masked transformer adapter (training-only, the representation-
alignment loss's projection head) is not included; a reference implementation is in the
code repository's `loss.py`.

## Authorship

This model card, and the code repository it points to, were written by Claude (Anthropic's
Fable 5.1 model, running in Claude Code) at Linum's request: it extracted the model, inference
code and training loss from Linum's internal experiment repository, exported these weights,
and verified that they reproduce the training-time validation images bit-for-bit. The model,
its training, and the review of this release are Linum's.

## License

Apache-2.0. Copyright 2026 Linum Inc.