File size: 2,001 Bytes
37149bf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
---
base_model: google/diffusiongemma-26B-A4B-it
library_name: peft
tags: [diffusion-lm, block-diffusion, lora, terminal-agent, tmax]
---

# DiffusionGemma tmax terminal-agent block-SFT — step 3000

LoRA adapter for `google/diffusiongemma-26B-A4B-it`, supervised-finetuned on Allen AI's
[tmax](https://huggingface.co/datasets/allenai/tmax-sft) terminal-agent trajectories
(config `skill_tax_20260505_2.2k_combined_balanced_thinking_only_success`).

## Training objective — response-anchored block diffusion

Each trajectory is trimmed to <4096 tokens, always ending on an assistant turn. Per step we
sample **one assistant response**, tile it into 256-token canvases, and sample **one canvas**:

- **Denoiser loss** on the sampled canvas (the diffusion target).
- **Encoder AR loss** over the *entire* prefix preceding that canvas (system prompt, user task,
  every prior assistant turn and tool output).
- Everything after the canvas is dropped.

| hyperparameter | value |
| --- | --- |
| LoRA rank / alpha | 64 / 128 |
| target modules | q,k,v,o,gate,up,down |
| canvas length | 256 |
| max completion / prompt | 4096 |
| learning rate | 1.5e-5, cosine, 100 warmup |
| batch (per-device x accum) | 1 x 8 |
| step | 3000 |
| last logged train loss | 0.7370 |

## Usage

```python
from peft import PeftModel
from transformers import AutoTokenizer, DiffusionGemmaForBlockDiffusion

base = DiffusionGemmaForBlockDiffusion.from_pretrained("google/diffusiongemma-26B-A4B-it", torch_dtype="bfloat16", device_map="cuda")
model = PeftModel.from_pretrained(base, "Rhine-AI/diffusiongemma-26B-A4B-tmax-sft-ckpt3000")
tok = AutoTokenizer.from_pretrained("Rhine-AI/diffusiongemma-26B-A4B-tmax-sft-ckpt3000")
```

Prompts are rendered with the **tmax/Qwen** chat template (not DiffGemma's, which drops the
assistant reasoning) and tokenized with the DiffGemma tokenizer. `<|im_end|>` is ordinary text to
this tokenizer, not an EOS token, so generation does not stop at a turn boundary — use a stop-string.