File size: 4,239 Bytes
2c1a8e3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88cd4a6
2c1a8e3
 
 
 
 
 
 
 
88cd4a6
2c1a8e3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88cd4a6
2c1a8e3
 
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
---
library_name: transformers
pipeline_tag: image-text-to-text
base_model:
- sensenova/SenseNova-Loop-9B-Preview
---

This is a randomly initialized tiny model based on [sensenova/SenseNova-Loop-9B-Preview](https://huggingface.co/sensenova/SenseNova-Loop-9B-Preview) for testing and debugging.

| Feature | Source | This repo |
|---|---|---|
| Checkpoint tensor elements | 243.29M BF16, 9.41B F32 | 9.19K BF16, 4.55M F32 |
| Safetensors weight files | 38.14 GB (9 files) | 18.25 MB (2 files) |
| Distinct / executed decoder layers | 32 / 56 (block 4-28 twice) | 12 / 16 (block 4-7 twice) |
| Attention cadence | three linear then full, four-layer cycle | Same; four complete cycles |
| Hidden width / MLP width | 4,096 / 12,288 | 8 / 32 |
| Full Q heads / KV heads / head dim | 16 / 4 / 256 | 8 / 4 / 32 |
| Linear key/value heads x head dim | 16x128 / 32x128 | 4x32 / 8x32 |
| mHC streams / Sinkhorn iterations | 2 / 20 over layers 4-28 | 2 / 20 over layers 4-7 |
| MTP draft layers / precision | 1 / BF16 (separate mtp.safetensors) | Same |
| Vision depth / hidden / heads | 27 / 1,152 / 16 | 4 / 64 / 2 |
| Patch / temporal patch / spatial merge | 16 / 2 / 2 | Same |
| Vision position buffer | 2,304 entries | Same |
| Vocabulary rows / tying | 248,320 / untied | Same |
| Backbone storage precision | FP32 | Same |
| SSM/conv/mHC parameters | FP32 | Same |
| Maximum context length | 262,144 | Same |

The pinned Loop/mHC wrapper loads the native Qwen3.5 backbone; the shared block owns one weight set but one dynamic-cache slot per visit.

| File path | Size |
|------|------|
| model.safetensors | 18.2MB |
| mtp.safetensors | 0.0MB |

### Example usage

#### Transformers (unverified)

Load the included pinned Loop/mHC implementation with `trust_remote_code=True`. The example sends one image and four predecoded video frames; the hybrid linear-attention path requires CUDA.

```python
def run_transformers(model_id: str):
    import numpy as np
    import torch
    from PIL import Image
    from transformers import AutoModelForImageTextToText, AutoProcessor
    from transformers.video_utils import VideoMetadata

    model_id = str(model_id)
    processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True)
    model = (
        AutoModelForImageTextToText.from_pretrained(
            model_id, trust_remote_code=True, dtype=torch.bfloat16, attn_implementation="sdpa"
        )
        .eval()
        .cuda()
    )
    image = Image.fromarray(np.random.randint(0, 255, (256, 256, 3), dtype=np.uint8), "RGB")
    frames = np.stack(
        [
            np.asarray(Image.new("RGB", (256, 256), color))
            for color in ((220, 30, 30), (30, 220, 30), (30, 30, 220), (220, 220, 30))
        ]
    )
    messages = [
        {
            "role": "user",
            "content": [
                {"type": "image", "image": image},
                {"type": "video", "video": frames},
                {"type": "text", "text": "Describe the image and the video."},
            ],
        }
    ]
    inputs = processor.apply_chat_template(
        messages,
        add_generation_prompt=True,
        tokenize=True,
        return_dict=True,
        return_tensors="pt",
        enable_thinking=False,
        processor_kwargs={"video_metadata": [VideoMetadata(total_num_frames=4, fps=2, frames_indices=[0, 1, 2, 3])]},
    ).to(model.device)
    assert inputs["pixel_values"].shape[0] > 0 and inputs["pixel_values_videos"].shape[0] > 0
    with torch.no_grad():
        logits = model(**inputs).logits
        assert torch.isfinite(logits).all()
        output = model.generate(**inputs, do_sample=False, min_new_tokens=8, max_new_tokens=8)
    print(processor.decode(output[0, inputs["input_ids"].shape[1] :], skip_special_tokens=False))


if __name__ == "__main__":
    run_transformers(model_id="scratch/sensenova-loop")
```

### Creating this repo

- Code: [.meta/create_model.py](.meta/create_model.py)
- Model structure: [.meta/model.log](.meta/model.log)
- Environment: [.meta/env.json](.meta/env.json)

### Change log

- 2026-11-03: Initial version: 12 physical layers / 16 looped executions with two-stream FP32 mHC routers and a separate BF16 MTP draft.

*This repo is generated by GPT-6.1-Sol.*