Feature Extraction
Transformers
Safetensors
the_net_omni
custom_code
multimodal
mixture-of-experts
weight-sharing
8-bit precision
compressed-tensors
Instructions to use JacobLinCool/the-net with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use JacobLinCool/the-net with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("feature-extraction", model="JacobLinCool/the-net", trust_remote_code=True)# pip install -U transformers accelerate # Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("JacobLinCool/the-net", trust_remote_code=True, device_map="auto") - Notebooks
- Google Colab
- Kaggle
Commit ·
93ebaf2
0
Parent(s):
The Net
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- .gitattributes +3 -0
- LICENSE +21 -0
- README.md +63 -0
- __init__.py +4 -0
- architecture.safetensors +3 -0
- config.json +245 -0
- configuration_omni.py +94 -0
- constant_checkpoint.py +58 -0
- initialization.st +3 -0
- model.safetensors.index.json +0 -0
- modeling_omni.py +391 -0
- requirements.txt +3 -0
- shards/000/model-00001-of-09400.safetensors +3 -0
- shards/000/model-00002-of-09400.safetensors +3 -0
- shards/000/model-00003-of-09400.safetensors +3 -0
- shards/000/model-00004-of-09400.safetensors +3 -0
- shards/000/model-00005-of-09400.safetensors +3 -0
- shards/000/model-00006-of-09400.safetensors +3 -0
- shards/000/model-00007-of-09400.safetensors +3 -0
- shards/000/model-00008-of-09400.safetensors +3 -0
- shards/000/model-00009-of-09400.safetensors +3 -0
- shards/000/model-00010-of-09400.safetensors +3 -0
- shards/000/model-00011-of-09400.safetensors +3 -0
- shards/000/model-00012-of-09400.safetensors +3 -0
- shards/000/model-00013-of-09400.safetensors +3 -0
- shards/000/model-00014-of-09400.safetensors +3 -0
- shards/000/model-00015-of-09400.safetensors +3 -0
- shards/000/model-00016-of-09400.safetensors +3 -0
- shards/000/model-00017-of-09400.safetensors +3 -0
- shards/000/model-00018-of-09400.safetensors +3 -0
- shards/000/model-00019-of-09400.safetensors +3 -0
- shards/000/model-00020-of-09400.safetensors +3 -0
- shards/000/model-00021-of-09400.safetensors +3 -0
- shards/000/model-00022-of-09400.safetensors +3 -0
- shards/000/model-00023-of-09400.safetensors +3 -0
- shards/000/model-00024-of-09400.safetensors +3 -0
- shards/000/model-00025-of-09400.safetensors +3 -0
- shards/000/model-00026-of-09400.safetensors +3 -0
- shards/000/model-00027-of-09400.safetensors +3 -0
- shards/000/model-00028-of-09400.safetensors +3 -0
- shards/000/model-00029-of-09400.safetensors +3 -0
- shards/000/model-00030-of-09400.safetensors +3 -0
- shards/000/model-00031-of-09400.safetensors +3 -0
- shards/000/model-00032-of-09400.safetensors +3 -0
- shards/000/model-00033-of-09400.safetensors +3 -0
- shards/000/model-00034-of-09400.safetensors +3 -0
- shards/000/model-00035-of-09400.safetensors +3 -0
- shards/000/model-00036-of-09400.safetensors +3 -0
- shards/000/model-00037-of-09400.safetensors +3 -0
- shards/000/model-00038-of-09400.safetensors +3 -0
.gitattributes
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
* text=auto
|
| 2 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
*.st filter=lfs diff=lfs merge=lfs -text
|
LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
MIT License
|
| 2 |
+
|
| 3 |
+
Copyright (c) 2026 JacobLinCool
|
| 4 |
+
|
| 5 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
| 6 |
+
of this software and associated documentation files (the "Software"), to deal
|
| 7 |
+
in the Software without restriction, including without limitation the rights
|
| 8 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
| 9 |
+
copies of the Software, and to permit persons to whom the Software is
|
| 10 |
+
furnished to do so, subject to the following conditions:
|
| 11 |
+
|
| 12 |
+
The above copyright notice and this permission notice shall be included in all
|
| 13 |
+
copies or substantial portions of the Software.
|
| 14 |
+
|
| 15 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
| 16 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 17 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
| 18 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
| 19 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| 20 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
| 21 |
+
SOFTWARE.
|
README.md
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
library_name: transformers
|
| 3 |
+
license: mit
|
| 4 |
+
tags:
|
| 5 |
+
- custom_code
|
| 6 |
+
- multimodal
|
| 7 |
+
- mixture-of-experts
|
| 8 |
+
- weight-sharing
|
| 9 |
+
---
|
| 10 |
+
|
| 11 |
+
# The Net
|
| 12 |
+
|
| 13 |
+
20T-scale multimodal architecture. Text, audio, images, video and EEG. 686 attention/FFN blocks, a three-level sparse MoE core with 128 experts per layer and top-2 routing, and recurrent memory. PyTorch implementation and checkpoint files released under the MIT license.
|
| 14 |
+
|
| 15 |
+
## Architecture
|
| 16 |
+
|
| 17 |
+
The Net has **11 major components**: five modality encoders, multiscale fusion, a shared world model, three media decoders and a memory controller.
|
| 18 |
+
|
| 19 |
+
```text
|
| 20 |
+
Text · Audio · Images · Video · EEG
|
| 21 |
+
↓
|
| 22 |
+
Modality-specific encoders
|
| 23 |
+
↓
|
| 24 |
+
Multiscale fusion
|
| 25 |
+
↓
|
| 26 |
+
Hierarchical sparse MoE core ↔ Memory
|
| 27 |
+
↓
|
| 28 |
+
Text head · Audio / Image / Video decoders
|
| 29 |
+
```
|
| 30 |
+
|
| 31 |
+
Encoders combine modality-specific stems with learned chunking, pooling and dechunking. Fusion aligns their representations before the shared core. The core uses attention, SwiGLU experts and RMSNorm across widths of 8,192, 12,288 and 16,384. Residual detail paths connect hierarchy levels; recurrent memory carries state between segments.
|
| 32 |
+
|
| 33 |
+
| Modality | Interface |
|
| 34 |
+
| --- | --- |
|
| 35 |
+
| Text | Byte-level tokens and next-token logits |
|
| 36 |
+
| Audio | Waveform frames, spectral features and codebook logits |
|
| 37 |
+
| Images | RGB patches and image latents |
|
| 38 |
+
| Video | Spatiotemporal tubelets and video latents |
|
| 39 |
+
| EEG | Multichannel signals with electrode adjacency |
|
| 40 |
+
|
| 41 |
+
## Implementation
|
| 42 |
+
|
| 43 |
+
The repository includes the PyTorch architecture, Transformers configuration,
|
| 44 |
+
tokenizer and checkpoint files under the MIT license.
|
| 45 |
+
|
| 46 |
+
| File | Contents |
|
| 47 |
+
| --- | --- |
|
| 48 |
+
| `config.json` | Model configuration |
|
| 49 |
+
| `configuration_omni.py` | `OmniConfig` |
|
| 50 |
+
| `modeling_omni.py` | `OmniModel` module implementation |
|
| 51 |
+
| `tokenizer.json` | Byte-level tokenizer |
|
| 52 |
+
| `tensor_shapes.json` | Architecture tensor names and dimensions |
|
| 53 |
+
|
| 54 |
+
## FAQ
|
| 55 |
+
|
| 56 |
+
**Q: Which modalities does the architecture cover?**
|
| 57 |
+
Text, audio, images, video and EEG, connected through a shared hierarchical core.
|
| 58 |
+
|
| 59 |
+
**Q: How are the experts organized?**
|
| 60 |
+
The shared core spans three hierarchy levels, with 128 experts per layer and top-2 routing. Multiscale fusion connects the modality encoders to the core; media decoders and a text head provide the output interfaces.
|
| 61 |
+
|
| 62 |
+
**Q: What is this release?**
|
| 63 |
+
A **Safetensors & Xet storage experiment** with constant-initialized, shared weights.
|
__init__.py
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from .configuration_omni import OmniConfig
|
| 2 |
+
from .modeling_omni import OmniModel
|
| 3 |
+
|
| 4 |
+
__all__ = ["OmniConfig", "OmniModel"]
|
architecture.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:aba8d5f96cf32f5945cb1edc7cfb94fbfc95b5759daa3208e35a8a0844ea859d
|
| 3 |
+
size 115368746
|
config.json
ADDED
|
@@ -0,0 +1,245 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"architectures": [
|
| 3 |
+
"OmniModel"
|
| 4 |
+
],
|
| 5 |
+
"audio_codebook_size": 1024,
|
| 6 |
+
"audio_codebooks": 8,
|
| 7 |
+
"audio_frame_size": 320,
|
| 8 |
+
"auto_map": {
|
| 9 |
+
"AutoConfig": "configuration_omni.OmniConfig",
|
| 10 |
+
"AutoModel": "modeling_omni.OmniModel"
|
| 11 |
+
},
|
| 12 |
+
"checkpoint_format": "the-net-shared-aliases-v2",
|
| 13 |
+
"context_dim": 256,
|
| 14 |
+
"eeg_channels": 64,
|
| 15 |
+
"head_dim": 128,
|
| 16 |
+
"initialization": "constant, untrained",
|
| 17 |
+
"model_type": "the_net_omni",
|
| 18 |
+
"patch_size": 4,
|
| 19 |
+
"stages": {
|
| 20 |
+
"audio_decoder": [
|
| 21 |
+
[
|
| 22 |
+
4096,
|
| 23 |
+
12,
|
| 24 |
+
1,
|
| 25 |
+
4,
|
| 26 |
+
1
|
| 27 |
+
],
|
| 28 |
+
[
|
| 29 |
+
8192,
|
| 30 |
+
84,
|
| 31 |
+
8,
|
| 32 |
+
2,
|
| 33 |
+
2
|
| 34 |
+
]
|
| 35 |
+
],
|
| 36 |
+
"audio_encoder": [
|
| 37 |
+
[
|
| 38 |
+
4096,
|
| 39 |
+
12,
|
| 40 |
+
1,
|
| 41 |
+
4,
|
| 42 |
+
1
|
| 43 |
+
],
|
| 44 |
+
[
|
| 45 |
+
8192,
|
| 46 |
+
24,
|
| 47 |
+
1,
|
| 48 |
+
4,
|
| 49 |
+
1
|
| 50 |
+
],
|
| 51 |
+
[
|
| 52 |
+
12288,
|
| 53 |
+
12,
|
| 54 |
+
1,
|
| 55 |
+
4,
|
| 56 |
+
1
|
| 57 |
+
]
|
| 58 |
+
],
|
| 59 |
+
"eeg_encoder": [
|
| 60 |
+
[
|
| 61 |
+
2048,
|
| 62 |
+
6,
|
| 63 |
+
1,
|
| 64 |
+
4,
|
| 65 |
+
1
|
| 66 |
+
],
|
| 67 |
+
[
|
| 68 |
+
4096,
|
| 69 |
+
12,
|
| 70 |
+
1,
|
| 71 |
+
4,
|
| 72 |
+
1
|
| 73 |
+
],
|
| 74 |
+
[
|
| 75 |
+
8192,
|
| 76 |
+
6,
|
| 77 |
+
1,
|
| 78 |
+
4,
|
| 79 |
+
1
|
| 80 |
+
]
|
| 81 |
+
],
|
| 82 |
+
"fusion": [
|
| 83 |
+
[
|
| 84 |
+
16384,
|
| 85 |
+
30,
|
| 86 |
+
8,
|
| 87 |
+
3,
|
| 88 |
+
2
|
| 89 |
+
]
|
| 90 |
+
],
|
| 91 |
+
"image_decoder": [
|
| 92 |
+
[
|
| 93 |
+
4096,
|
| 94 |
+
8,
|
| 95 |
+
1,
|
| 96 |
+
4,
|
| 97 |
+
1
|
| 98 |
+
],
|
| 99 |
+
[
|
| 100 |
+
12288,
|
| 101 |
+
52,
|
| 102 |
+
16,
|
| 103 |
+
2,
|
| 104 |
+
2
|
| 105 |
+
]
|
| 106 |
+
],
|
| 107 |
+
"image_encoder": [
|
| 108 |
+
[
|
| 109 |
+
4096,
|
| 110 |
+
8,
|
| 111 |
+
1,
|
| 112 |
+
4,
|
| 113 |
+
1
|
| 114 |
+
],
|
| 115 |
+
[
|
| 116 |
+
8192,
|
| 117 |
+
24,
|
| 118 |
+
1,
|
| 119 |
+
4,
|
| 120 |
+
1
|
| 121 |
+
],
|
| 122 |
+
[
|
| 123 |
+
12288,
|
| 124 |
+
24,
|
| 125 |
+
1,
|
| 126 |
+
4,
|
| 127 |
+
1
|
| 128 |
+
]
|
| 129 |
+
],
|
| 130 |
+
"memory_control": [
|
| 131 |
+
[
|
| 132 |
+
8192,
|
| 133 |
+
38,
|
| 134 |
+
32,
|
| 135 |
+
2,
|
| 136 |
+
2
|
| 137 |
+
]
|
| 138 |
+
],
|
| 139 |
+
"text_encoder": [
|
| 140 |
+
[
|
| 141 |
+
2048,
|
| 142 |
+
6,
|
| 143 |
+
1,
|
| 144 |
+
4,
|
| 145 |
+
1
|
| 146 |
+
],
|
| 147 |
+
[
|
| 148 |
+
4096,
|
| 149 |
+
12,
|
| 150 |
+
1,
|
| 151 |
+
4,
|
| 152 |
+
1
|
| 153 |
+
],
|
| 154 |
+
[
|
| 155 |
+
8192,
|
| 156 |
+
6,
|
| 157 |
+
1,
|
| 158 |
+
4,
|
| 159 |
+
1
|
| 160 |
+
]
|
| 161 |
+
],
|
| 162 |
+
"video_decoder": [
|
| 163 |
+
[
|
| 164 |
+
8192,
|
| 165 |
+
8,
|
| 166 |
+
1,
|
| 167 |
+
4,
|
| 168 |
+
1
|
| 169 |
+
],
|
| 170 |
+
[
|
| 171 |
+
16384,
|
| 172 |
+
88,
|
| 173 |
+
16,
|
| 174 |
+
2,
|
| 175 |
+
2
|
| 176 |
+
]
|
| 177 |
+
],
|
| 178 |
+
"video_encoder": [
|
| 179 |
+
[
|
| 180 |
+
4096,
|
| 181 |
+
8,
|
| 182 |
+
1,
|
| 183 |
+
4,
|
| 184 |
+
1
|
| 185 |
+
],
|
| 186 |
+
[
|
| 187 |
+
8192,
|
| 188 |
+
32,
|
| 189 |
+
1,
|
| 190 |
+
4,
|
| 191 |
+
1
|
| 192 |
+
],
|
| 193 |
+
[
|
| 194 |
+
16384,
|
| 195 |
+
44,
|
| 196 |
+
1,
|
| 197 |
+
4,
|
| 198 |
+
1
|
| 199 |
+
]
|
| 200 |
+
],
|
| 201 |
+
"world_model": [
|
| 202 |
+
[
|
| 203 |
+
8192,
|
| 204 |
+
48,
|
| 205 |
+
128,
|
| 206 |
+
2,
|
| 207 |
+
2
|
| 208 |
+
],
|
| 209 |
+
[
|
| 210 |
+
12288,
|
| 211 |
+
48,
|
| 212 |
+
128,
|
| 213 |
+
2,
|
| 214 |
+
2
|
| 215 |
+
],
|
| 216 |
+
[
|
| 217 |
+
16384,
|
| 218 |
+
34,
|
| 219 |
+
128,
|
| 220 |
+
2,
|
| 221 |
+
2
|
| 222 |
+
]
|
| 223 |
+
]
|
| 224 |
+
},
|
| 225 |
+
"transformers_version": "4.57.6",
|
| 226 |
+
"vocab_size": 259,
|
| 227 |
+
"quantization_config": {
|
| 228 |
+
"quant_method": "compressed-tensors",
|
| 229 |
+
"format": "pack-quantized",
|
| 230 |
+
"config_groups": {
|
| 231 |
+
"shared_bank": {
|
| 232 |
+
"targets": [
|
| 233 |
+
"shared_bank"
|
| 234 |
+
],
|
| 235 |
+
"weights": {
|
| 236 |
+
"num_bits": 1,
|
| 237 |
+
"type": "int",
|
| 238 |
+
"symmetric": false,
|
| 239 |
+
"strategy": "tensor",
|
| 240 |
+
"dynamic": false
|
| 241 |
+
}
|
| 242 |
+
}
|
| 243 |
+
}
|
| 244 |
+
}
|
| 245 |
+
}
|
configuration_omni.py
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Concrete heterogeneous omni architecture; all parameter counts derive from its modules."""
|
| 2 |
+
|
| 3 |
+
from copy import deepcopy
|
| 4 |
+
|
| 5 |
+
from transformers import PretrainedConfig
|
| 6 |
+
|
| 7 |
+
# (width, block count, expert count, FFN expansion, selected experts)
|
| 8 |
+
STAGES = {
|
| 9 |
+
"text_encoder": [(2048, 6, 1, 4, 1), (4096, 12, 1, 4, 1), (8192, 6, 1, 4, 1)],
|
| 10 |
+
"audio_encoder": [(4096, 12, 1, 4, 1), (8192, 24, 1, 4, 1), (12288, 12, 1, 4, 1)],
|
| 11 |
+
"image_encoder": [(4096, 8, 1, 4, 1), (8192, 24, 1, 4, 1), (12288, 24, 1, 4, 1)],
|
| 12 |
+
"video_encoder": [(4096, 8, 1, 4, 1), (8192, 32, 1, 4, 1), (16384, 44, 1, 4, 1)],
|
| 13 |
+
"eeg_encoder": [(2048, 6, 1, 4, 1), (4096, 12, 1, 4, 1), (8192, 6, 1, 4, 1)],
|
| 14 |
+
"fusion": [(16384, 30, 8, 3, 2)],
|
| 15 |
+
"world_model": [(8192, 48, 128, 2, 2), (12288, 48, 128, 2, 2), (16384, 34, 128, 2, 2)],
|
| 16 |
+
"audio_decoder": [(4096, 12, 1, 4, 1), (8192, 84, 8, 2, 2)],
|
| 17 |
+
"image_decoder": [(4096, 8, 1, 4, 1), (12288, 52, 16, 2, 2)],
|
| 18 |
+
"video_decoder": [(8192, 8, 1, 4, 1), (16384, 88, 16, 2, 2)],
|
| 19 |
+
"memory_control": [(8192, 38, 32, 2, 2)],
|
| 20 |
+
}
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
class OmniConfig(PretrainedConfig):
|
| 24 |
+
model_type = "the_net_omni"
|
| 25 |
+
|
| 26 |
+
def __init__(
|
| 27 |
+
self,
|
| 28 |
+
stages=None,
|
| 29 |
+
head_dim=128,
|
| 30 |
+
vocab_size=259,
|
| 31 |
+
eeg_channels=64,
|
| 32 |
+
context_dim=256,
|
| 33 |
+
audio_frame_size=320,
|
| 34 |
+
patch_size=4,
|
| 35 |
+
audio_codebooks=8,
|
| 36 |
+
audio_codebook_size=1024,
|
| 37 |
+
**kwargs,
|
| 38 |
+
):
|
| 39 |
+
super().__init__(**kwargs)
|
| 40 |
+
self.stages = deepcopy(STAGES if stages is None else stages)
|
| 41 |
+
self.head_dim = head_dim
|
| 42 |
+
self.vocab_size = vocab_size
|
| 43 |
+
self.eeg_channels = eeg_channels
|
| 44 |
+
self.context_dim = context_dim
|
| 45 |
+
self.audio_frame_size = audio_frame_size
|
| 46 |
+
self.patch_size = patch_size
|
| 47 |
+
self.audio_codebooks = audio_codebooks
|
| 48 |
+
self.audio_codebook_size = audio_codebook_size
|
| 49 |
+
for name in (
|
| 50 |
+
"head_dim",
|
| 51 |
+
"vocab_size",
|
| 52 |
+
"eeg_channels",
|
| 53 |
+
"context_dim",
|
| 54 |
+
"audio_frame_size",
|
| 55 |
+
"patch_size",
|
| 56 |
+
"audio_codebooks",
|
| 57 |
+
"audio_codebook_size",
|
| 58 |
+
):
|
| 59 |
+
value = getattr(self, name)
|
| 60 |
+
if type(value) is not int or value <= 0:
|
| 61 |
+
raise ValueError(f"{name} must be a positive integer")
|
| 62 |
+
if set(self.stages) != set(STAGES):
|
| 63 |
+
raise ValueError("All eleven named components are required")
|
| 64 |
+
for component, rows in self.stages.items():
|
| 65 |
+
if not rows:
|
| 66 |
+
raise ValueError(f"Empty component: {component}")
|
| 67 |
+
for row in rows:
|
| 68 |
+
if len(row) != 5 or any(type(n) is not int or n < 1 for n in row):
|
| 69 |
+
raise ValueError(f"Invalid stage: {row}")
|
| 70 |
+
width, _, experts, _, selected = row
|
| 71 |
+
if width % head_dim or selected > experts:
|
| 72 |
+
raise ValueError(f"Invalid heads or routing: {row}")
|
| 73 |
+
|
| 74 |
+
@classmethod
|
| 75 |
+
def tiny(cls):
|
| 76 |
+
stages = {
|
| 77 |
+
name: [
|
| 78 |
+
(32 * (i + 1), 1, min(experts, 2), expansion, min(selected, 2))
|
| 79 |
+
for i, (_, _, experts, expansion, selected) in enumerate(rows)
|
| 80 |
+
]
|
| 81 |
+
for name, rows in STAGES.items()
|
| 82 |
+
}
|
| 83 |
+
return cls(
|
| 84 |
+
stages=stages,
|
| 85 |
+
head_dim=16,
|
| 86 |
+
context_dim=32,
|
| 87 |
+
audio_frame_size=32,
|
| 88 |
+
eeg_channels=8,
|
| 89 |
+
audio_codebooks=2,
|
| 90 |
+
audio_codebook_size=16,
|
| 91 |
+
)
|
| 92 |
+
|
| 93 |
+
|
| 94 |
+
OmniConfig.register_for_auto_class()
|
constant_checkpoint.py
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Constant-tensor checkpoint reader."""
|
| 2 |
+
|
| 3 |
+
import json
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
|
| 6 |
+
import torch
|
| 7 |
+
from safetensors.torch import load_file
|
| 8 |
+
|
| 9 |
+
from .configuration_omni import OmniConfig
|
| 10 |
+
from .modeling_omni import OmniModel
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
class ConstantCheckpoint:
|
| 14 |
+
def __init__(self, directory):
|
| 15 |
+
self.directory = Path(directory)
|
| 16 |
+
self.shapes = json.loads((self.directory / "tensor_shapes.json").read_text())
|
| 17 |
+
self.values = load_file(self.directory / "initialization.st")
|
| 18 |
+
if self.shapes.keys() != self.values.keys():
|
| 19 |
+
raise ValueError("Shape and value keys differ")
|
| 20 |
+
self.config = OmniConfig.from_pretrained(self.directory, local_files_only=True)
|
| 21 |
+
|
| 22 |
+
def slice(self, name, start, length):
|
| 23 |
+
size = 1
|
| 24 |
+
for dimension in self.shapes[name]:
|
| 25 |
+
size *= dimension
|
| 26 |
+
if (
|
| 27 |
+
type(start) is not int
|
| 28 |
+
or type(length) is not int
|
| 29 |
+
or start < 0
|
| 30 |
+
or length < 0
|
| 31 |
+
or start + length > size
|
| 32 |
+
):
|
| 33 |
+
raise ValueError("Invalid tensor slice")
|
| 34 |
+
if length > 1_000_000:
|
| 35 |
+
raise ValueError("Read at most one million elements per slice")
|
| 36 |
+
return self.values[name].expand(length).clone()
|
| 37 |
+
|
| 38 |
+
def meta_model(self):
|
| 39 |
+
with torch.device("meta"):
|
| 40 |
+
model = OmniModel(self.config)
|
| 41 |
+
parameters = dict(model.named_parameters())
|
| 42 |
+
if parameters.keys() != self.shapes.keys():
|
| 43 |
+
raise ValueError("Checkpoint and model parameter keys differ")
|
| 44 |
+
for name, parameter in parameters.items():
|
| 45 |
+
if list(parameter.shape) != self.shapes[name]:
|
| 46 |
+
raise ValueError(f"Shape mismatch: {name}")
|
| 47 |
+
return model
|
| 48 |
+
|
| 49 |
+
def materialize(self, max_parameters=10_000_000):
|
| 50 |
+
model = self.meta_model()
|
| 51 |
+
total = sum(p.numel() for p in model.parameters())
|
| 52 |
+
if total > max_parameters:
|
| 53 |
+
raise ValueError(f"{total:,} parameters exceed the materialization limit")
|
| 54 |
+
model.to_empty(device="cpu")
|
| 55 |
+
with torch.no_grad():
|
| 56 |
+
for name, parameter in model.named_parameters():
|
| 57 |
+
parameter.fill_(self.values[name].item())
|
| 58 |
+
return model
|
initialization.st
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:d4d29dea3bfe42eb4de7a144b1afbe4b451a79d6009c80f235843c435db8b0d0
|
| 3 |
+
size 8768280
|
model.safetensors.index.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
modeling_omni.py
ADDED
|
@@ -0,0 +1,391 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""PyTorch implementation of the heterogeneous hierarchical omni architecture."""
|
| 2 |
+
|
| 3 |
+
import itertools
|
| 4 |
+
import math
|
| 5 |
+
from dataclasses import dataclass
|
| 6 |
+
|
| 7 |
+
import torch
|
| 8 |
+
from torch import nn
|
| 9 |
+
from torch.nn import functional as F
|
| 10 |
+
from transformers import PreTrainedModel
|
| 11 |
+
from transformers.utils import ModelOutput
|
| 12 |
+
|
| 13 |
+
from .configuration_omni import OmniConfig
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
class Attention(nn.Module):
|
| 17 |
+
def __init__(self, width, head_dim):
|
| 18 |
+
super().__init__()
|
| 19 |
+
self.head_dim = head_dim
|
| 20 |
+
self.q_proj = nn.Linear(width, width, bias=False)
|
| 21 |
+
self.k_proj = nn.Linear(width, width, bias=False)
|
| 22 |
+
self.v_proj = nn.Linear(width, width, bias=False)
|
| 23 |
+
self.o_proj = nn.Linear(width, width, bias=False)
|
| 24 |
+
|
| 25 |
+
def forward(self, x, causal=False):
|
| 26 |
+
b, s, d = x.shape
|
| 27 |
+
|
| 28 |
+
def heads(value):
|
| 29 |
+
return value.reshape(b, s, d // self.head_dim, self.head_dim).transpose(1, 2)
|
| 30 |
+
|
| 31 |
+
q, k, v = (heads(layer(x)) for layer in (self.q_proj, self.k_proj, self.v_proj))
|
| 32 |
+
y = F.scaled_dot_product_attention(q, k, v, is_causal=causal)
|
| 33 |
+
return self.o_proj(y.transpose(1, 2).reshape_as(x))
|
| 34 |
+
|
| 35 |
+
|
| 36 |
+
class Expert(nn.Module):
|
| 37 |
+
def __init__(self, width, intermediate):
|
| 38 |
+
super().__init__()
|
| 39 |
+
self.gate_proj = nn.Linear(width, intermediate, bias=False)
|
| 40 |
+
self.up_proj = nn.Linear(width, intermediate, bias=False)
|
| 41 |
+
self.down_proj = nn.Linear(intermediate, width, bias=False)
|
| 42 |
+
|
| 43 |
+
def forward(self, x):
|
| 44 |
+
return self.down_proj(F.silu(self.gate_proj(x)) * self.up_proj(x))
|
| 45 |
+
|
| 46 |
+
|
| 47 |
+
class SparseMLP(nn.Module):
|
| 48 |
+
def __init__(self, width, experts, expansion, selected):
|
| 49 |
+
super().__init__()
|
| 50 |
+
self.selected = selected
|
| 51 |
+
self.router = nn.Linear(width, experts, bias=False) if experts > 1 else None
|
| 52 |
+
self.experts = nn.ModuleList([Expert(width, width * expansion) for _ in range(experts)])
|
| 53 |
+
|
| 54 |
+
def forward(self, x):
|
| 55 |
+
if self.router is None:
|
| 56 |
+
return self.experts[0](x)
|
| 57 |
+
flat = x.reshape(-1, x.shape[-1])
|
| 58 |
+
scores, ids = self.router(flat).topk(self.selected, dim=-1)
|
| 59 |
+
scores = scores.softmax(-1)
|
| 60 |
+
result = torch.zeros_like(flat)
|
| 61 |
+
for expert_id, expert in enumerate(self.experts):
|
| 62 |
+
tokens, slots = torch.where(ids == expert_id)
|
| 63 |
+
if tokens.numel():
|
| 64 |
+
result = result.index_add(
|
| 65 |
+
0, tokens, expert(flat[tokens]) * scores[tokens, slots, None]
|
| 66 |
+
)
|
| 67 |
+
return result.reshape_as(x)
|
| 68 |
+
|
| 69 |
+
|
| 70 |
+
class Block(nn.Module):
|
| 71 |
+
def __init__(self, width, experts, expansion, selected, head_dim):
|
| 72 |
+
super().__init__()
|
| 73 |
+
self.attention_norm = nn.RMSNorm(width)
|
| 74 |
+
self.attention = Attention(width, head_dim)
|
| 75 |
+
self.ffn_norm = nn.RMSNorm(width)
|
| 76 |
+
self.mlp = SparseMLP(width, experts, expansion, selected)
|
| 77 |
+
|
| 78 |
+
def forward(self, x, causal=False):
|
| 79 |
+
x = x + self.attention(self.attention_norm(x), causal)
|
| 80 |
+
return x + self.mlp(self.ffn_norm(x))
|
| 81 |
+
|
| 82 |
+
|
| 83 |
+
class Chunker(nn.Module):
|
| 84 |
+
"""Learned boundaries, weighted pooling, and explicit source-to-chunk mapping.
|
| 85 |
+
|
| 86 |
+
Single-example sequences avoid treating padding as real observations. Processing
|
| 87 |
+
a complete observed prefix is bidirectional; next-token targets are not inputs.
|
| 88 |
+
"""
|
| 89 |
+
|
| 90 |
+
def __init__(self, width, context_dim):
|
| 91 |
+
super().__init__()
|
| 92 |
+
self.boundary = nn.Linear(width, 1)
|
| 93 |
+
self.condition = nn.Linear(context_dim, width, bias=False)
|
| 94 |
+
|
| 95 |
+
def forward(self, x, context):
|
| 96 |
+
gate = torch.sigmoid(self.boundary(x + self.condition(context)[:, None]))
|
| 97 |
+
starts = gate[0, :, 0] > 0.5
|
| 98 |
+
starts = starts.clone()
|
| 99 |
+
starts[0] = True
|
| 100 |
+
assignment = starts.long().cumsum(0) - 1
|
| 101 |
+
groups = int(assignment[-1]) + 1
|
| 102 |
+
weights = gate[0]
|
| 103 |
+
sums = x.new_zeros(groups, x.shape[-1]).index_add(0, assignment, x[0] * weights)
|
| 104 |
+
counts = x.new_zeros(groups, 1).index_add(0, assignment, weights)
|
| 105 |
+
pooled = (sums / counts.clamp_min(torch.finfo(x.dtype).eps))[None]
|
| 106 |
+
return pooled, assignment
|
| 107 |
+
|
| 108 |
+
|
| 109 |
+
class Stage(nn.Module):
|
| 110 |
+
def __init__(self, row, config, adaptive):
|
| 111 |
+
super().__init__()
|
| 112 |
+
width, depth, experts, expansion, selected = row
|
| 113 |
+
self.blocks = nn.ModuleList(
|
| 114 |
+
[Block(width, experts, expansion, selected, config.head_dim) for _ in range(depth)]
|
| 115 |
+
)
|
| 116 |
+
self.chunker = Chunker(width, config.context_dim) if adaptive else None
|
| 117 |
+
|
| 118 |
+
def forward(self, x, context, causal=False):
|
| 119 |
+
for block in self.blocks:
|
| 120 |
+
x = block(x, causal)
|
| 121 |
+
detail = x
|
| 122 |
+
if self.chunker is None:
|
| 123 |
+
return x, None, detail
|
| 124 |
+
pooled, assignment = self.chunker(x, context)
|
| 125 |
+
return pooled, assignment, detail
|
| 126 |
+
|
| 127 |
+
|
| 128 |
+
class Hierarchy(nn.Module):
|
| 129 |
+
def __init__(self, name, config, adaptive=False):
|
| 130 |
+
super().__init__()
|
| 131 |
+
rows = config.stages[name]
|
| 132 |
+
self.stages = nn.ModuleList([Stage(row, config, adaptive) for row in rows])
|
| 133 |
+
self.transitions = nn.ModuleList(
|
| 134 |
+
[nn.Linear(a[0], b[0], bias=False) for a, b in itertools.pairwise(rows)]
|
| 135 |
+
)
|
| 136 |
+
self.dechunk_projections = (
|
| 137 |
+
nn.ModuleList([nn.Linear(b[0], a[0], bias=False) for a, b in itertools.pairwise(rows)])
|
| 138 |
+
if adaptive
|
| 139 |
+
else nn.ModuleList()
|
| 140 |
+
)
|
| 141 |
+
|
| 142 |
+
def forward(self, x, context, causal=False):
|
| 143 |
+
details, assignments = [], []
|
| 144 |
+
for i, stage in enumerate(self.stages):
|
| 145 |
+
x, assignment, detail = stage(x, context, causal)
|
| 146 |
+
details.append(detail)
|
| 147 |
+
assignments.append(assignment)
|
| 148 |
+
if i < len(self.transitions):
|
| 149 |
+
x = self.transitions[i](x)
|
| 150 |
+
return x, (details, assignments)
|
| 151 |
+
|
| 152 |
+
def dechunk(self, x, trace):
|
| 153 |
+
details, assignments = trace
|
| 154 |
+
for i in reversed(range(len(self.stages))):
|
| 155 |
+
if assignments[i] is not None:
|
| 156 |
+
x = x[:, assignments[i]] + details[i]
|
| 157 |
+
if i:
|
| 158 |
+
x = self.dechunk_projections[i - 1](x)
|
| 159 |
+
return x
|
| 160 |
+
|
| 161 |
+
|
| 162 |
+
class Encoder(nn.Module):
|
| 163 |
+
def __init__(self, name, config):
|
| 164 |
+
super().__init__()
|
| 165 |
+
width = config.stages[name][0][0]
|
| 166 |
+
self.name = name
|
| 167 |
+
self.config = config
|
| 168 |
+
if name == "text_encoder":
|
| 169 |
+
self.embedding = nn.Embedding(config.vocab_size, width)
|
| 170 |
+
elif name == "image_encoder":
|
| 171 |
+
self.patch_embedding = nn.Conv2d(
|
| 172 |
+
3, width, config.patch_size, stride=config.patch_size, bias=False
|
| 173 |
+
)
|
| 174 |
+
elif name == "video_encoder":
|
| 175 |
+
self.tubelet_embedding = nn.Conv3d(
|
| 176 |
+
3,
|
| 177 |
+
width,
|
| 178 |
+
(2, config.patch_size, config.patch_size),
|
| 179 |
+
stride=(2, config.patch_size, config.patch_size),
|
| 180 |
+
bias=False,
|
| 181 |
+
)
|
| 182 |
+
elif name == "audio_encoder":
|
| 183 |
+
self.waveform_projection = nn.Linear(config.audio_frame_size, width, bias=False)
|
| 184 |
+
self.spectrum_projection = nn.Linear(
|
| 185 |
+
config.audio_frame_size // 2 + 1, width, bias=False
|
| 186 |
+
)
|
| 187 |
+
elif name == "eeg_encoder":
|
| 188 |
+
self.electrode_projection = nn.Linear(config.eeg_channels, width, bias=False)
|
| 189 |
+
self.graph_mix = nn.Linear(config.eeg_channels, config.eeg_channels, bias=False)
|
| 190 |
+
self.hierarchy = Hierarchy(name, config, adaptive=True)
|
| 191 |
+
|
| 192 |
+
def forward(self, value, context, adjacency=None):
|
| 193 |
+
rank = {
|
| 194 |
+
"text_encoder": 2,
|
| 195 |
+
"audio_encoder": 2,
|
| 196 |
+
"image_encoder": 4,
|
| 197 |
+
"video_encoder": 5,
|
| 198 |
+
"eeg_encoder": 3,
|
| 199 |
+
}[self.name]
|
| 200 |
+
if value.ndim != rank or value.shape[0] != 1 or 0 in value.shape:
|
| 201 |
+
raise ValueError(
|
| 202 |
+
f"{self.name} requires a nonempty rank-{rank} input with batch size one"
|
| 203 |
+
)
|
| 204 |
+
if self.name in ("image_encoder", "video_encoder") and (
|
| 205 |
+
value.shape[1] != 3 or any(n % self.config.patch_size for n in value.shape[-2:])
|
| 206 |
+
):
|
| 207 |
+
raise ValueError("RGB spatial dimensions must be divisible by patch_size")
|
| 208 |
+
if self.name == "video_encoder" and value.shape[2] % 2:
|
| 209 |
+
raise ValueError("Video frame count must be divisible by two")
|
| 210 |
+
if self.name == "eeg_encoder" and value.shape[1] != self.config.eeg_channels:
|
| 211 |
+
raise ValueError("EEG channel count must match config")
|
| 212 |
+
if self.name == "text_encoder":
|
| 213 |
+
x = self.embedding(value)
|
| 214 |
+
elif self.name == "image_encoder":
|
| 215 |
+
x = self.patch_embedding(value).flatten(2).transpose(1, 2)
|
| 216 |
+
elif self.name == "video_encoder":
|
| 217 |
+
x = self.tubelet_embedding(value).flatten(2).transpose(1, 2)
|
| 218 |
+
elif self.name == "audio_encoder":
|
| 219 |
+
frame = self.config.audio_frame_size
|
| 220 |
+
if value.shape[-1] % frame:
|
| 221 |
+
raise ValueError("Audio must contain complete frames")
|
| 222 |
+
frames = value.unfold(-1, frame, frame)
|
| 223 |
+
spectrum = torch.fft.rfft(frames.float()).abs().to(value.dtype)
|
| 224 |
+
x = self.waveform_projection(frames) + self.spectrum_projection(spectrum)
|
| 225 |
+
else:
|
| 226 |
+
channels = self.config.eeg_channels
|
| 227 |
+
if adjacency is None or adjacency.shape != (channels, channels):
|
| 228 |
+
raise ValueError("EEG requires an explicit electrode adjacency matrix")
|
| 229 |
+
if (
|
| 230 |
+
(adjacency < 0).any()
|
| 231 |
+
or not torch.isfinite(adjacency).all()
|
| 232 |
+
or (adjacency.sum(-1) <= 0).any()
|
| 233 |
+
):
|
| 234 |
+
raise ValueError("Invalid EEG adjacency")
|
| 235 |
+
graph = adjacency / adjacency.sum(-1, keepdim=True)
|
| 236 |
+
mixed = (graph @ value).transpose(1, 2)
|
| 237 |
+
x = self.electrode_projection(mixed + self.graph_mix(mixed))
|
| 238 |
+
position = torch.arange(x.shape[1], device=x.device)[:, None]
|
| 239 |
+
rate = torch.exp(-math.log(10000) * torch.arange(x.shape[2], device=x.device) / x.shape[2])
|
| 240 |
+
x = x + torch.sin(position * rate).to(x.dtype)[None]
|
| 241 |
+
high, trace = self.hierarchy(x, context)
|
| 242 |
+
# Fuse reconstructed detail features with the high-level representation.
|
| 243 |
+
details = self.hierarchy.dechunk(high, trace)
|
| 244 |
+
return high, details, trace
|
| 245 |
+
|
| 246 |
+
|
| 247 |
+
class Fusion(nn.Module):
|
| 248 |
+
def __init__(self, config):
|
| 249 |
+
super().__init__()
|
| 250 |
+
width = config.stages["fusion"][0][0]
|
| 251 |
+
encoders = sorted(k for k in config.stages if k.endswith("_encoder"))
|
| 252 |
+
self.high_projections = nn.ModuleDict(
|
| 253 |
+
{k: nn.Linear(config.stages[k][-1][0], width, bias=False) for k in encoders}
|
| 254 |
+
)
|
| 255 |
+
self.detail_projections = nn.ModuleDict(
|
| 256 |
+
{k: nn.Linear(config.stages[k][0][0], width, bias=False) for k in encoders}
|
| 257 |
+
)
|
| 258 |
+
self.modality_embedding = nn.Embedding(5, width)
|
| 259 |
+
self.hierarchy = Hierarchy("fusion", config)
|
| 260 |
+
|
| 261 |
+
def forward(self, features, context):
|
| 262 |
+
tokens = []
|
| 263 |
+
for name, (high, detail, _) in features.items():
|
| 264 |
+
i = list(self.high_projections).index(name)
|
| 265 |
+
token = self.high_projections[name](high) + self.detail_projections[name](
|
| 266 |
+
detail.mean(1, keepdim=True)
|
| 267 |
+
)
|
| 268 |
+
tokens.append(token + self.modality_embedding.weight[i])
|
| 269 |
+
return self.hierarchy(torch.cat(tokens, dim=1), context)[0]
|
| 270 |
+
|
| 271 |
+
|
| 272 |
+
class Decoder(nn.Module):
|
| 273 |
+
def __init__(self, name, config, output_width):
|
| 274 |
+
super().__init__()
|
| 275 |
+
self.input_projection = nn.Linear(
|
| 276 |
+
config.stages["world_model"][-1][0], config.stages[name][0][0], bias=False
|
| 277 |
+
)
|
| 278 |
+
self.hierarchy = Hierarchy(name, config)
|
| 279 |
+
self.output_projection = nn.Linear(config.stages[name][-1][0], output_width, bias=False)
|
| 280 |
+
|
| 281 |
+
def forward(self, x, context):
|
| 282 |
+
x = self.input_projection(x)
|
| 283 |
+
return self.output_projection(self.hierarchy(x, context, causal=True)[0])
|
| 284 |
+
|
| 285 |
+
|
| 286 |
+
@dataclass
|
| 287 |
+
class OmniOutput(ModelOutput):
|
| 288 |
+
next_token_logits: torch.Tensor | None = None
|
| 289 |
+
audio_codes: torch.Tensor | None = None
|
| 290 |
+
image_latents: torch.Tensor | None = None
|
| 291 |
+
video_latents: torch.Tensor | None = None
|
| 292 |
+
memory_state: torch.Tensor | None = None
|
| 293 |
+
|
| 294 |
+
|
| 295 |
+
class OmniModel(PreTrainedModel):
|
| 296 |
+
config_class = OmniConfig
|
| 297 |
+
|
| 298 |
+
def __init__(self, config):
|
| 299 |
+
super().__init__(config)
|
| 300 |
+
for name in (k for k in config.stages if k.endswith("_encoder")):
|
| 301 |
+
setattr(self, name, Encoder(name, config))
|
| 302 |
+
self.fusion = Fusion(config)
|
| 303 |
+
self.world_input = nn.Linear(
|
| 304 |
+
config.stages["fusion"][-1][0], config.stages["world_model"][0][0], bias=False
|
| 305 |
+
)
|
| 306 |
+
self.world_model = Hierarchy("world_model", config, adaptive=True)
|
| 307 |
+
self.world_detail_projection = nn.Linear(
|
| 308 |
+
config.stages["world_model"][0][0], config.stages["world_model"][-1][0], bias=False
|
| 309 |
+
)
|
| 310 |
+
self.text_head = nn.Linear(
|
| 311 |
+
config.stages["world_model"][-1][0], config.vocab_size, bias=False
|
| 312 |
+
)
|
| 313 |
+
self.audio_decoder = Decoder(
|
| 314 |
+
"audio_decoder", config, config.audio_codebooks * config.audio_codebook_size
|
| 315 |
+
)
|
| 316 |
+
self.image_decoder = Decoder("image_decoder", config, 64)
|
| 317 |
+
self.video_decoder = Decoder("video_decoder", config, 128)
|
| 318 |
+
self.memory_input = nn.Linear(
|
| 319 |
+
config.stages["world_model"][-1][0], config.stages["memory_control"][0][0], bias=False
|
| 320 |
+
)
|
| 321 |
+
self.memory_control = Hierarchy("memory_control", config)
|
| 322 |
+
self.memory_output = nn.Linear(
|
| 323 |
+
config.stages["memory_control"][-1][0], config.stages["fusion"][0][0], bias=False
|
| 324 |
+
)
|
| 325 |
+
self.post_init()
|
| 326 |
+
|
| 327 |
+
def _init_weights(self, module):
|
| 328 |
+
if isinstance(module, (nn.Linear, nn.Embedding, nn.Conv2d, nn.Conv3d)):
|
| 329 |
+
nn.init.normal_(module.weight, std=0.02)
|
| 330 |
+
if getattr(module, "bias", None) is not None:
|
| 331 |
+
nn.init.zeros_(module.bias)
|
| 332 |
+
|
| 333 |
+
def forward(
|
| 334 |
+
self,
|
| 335 |
+
input_ids,
|
| 336 |
+
pixel_values=None,
|
| 337 |
+
audio_values=None,
|
| 338 |
+
video_values=None,
|
| 339 |
+
eeg_values=None,
|
| 340 |
+
eeg_adjacency=None,
|
| 341 |
+
task_vector=None,
|
| 342 |
+
memory_state=None,
|
| 343 |
+
output_modalities=(),
|
| 344 |
+
):
|
| 345 |
+
if input_ids.ndim != 2 or input_ids.shape[0] != 1 or input_ids.shape[1] == 0:
|
| 346 |
+
raise ValueError("Reference execution requires one nonempty observed prefix per call")
|
| 347 |
+
context = (
|
| 348 |
+
self.text_head.weight.new_zeros(1, self.config.context_dim)
|
| 349 |
+
if task_vector is None
|
| 350 |
+
else task_vector
|
| 351 |
+
)
|
| 352 |
+
if context.shape != (1, self.config.context_dim):
|
| 353 |
+
raise ValueError("Invalid task_vector shape")
|
| 354 |
+
values = {
|
| 355 |
+
"text_encoder": input_ids,
|
| 356 |
+
"image_encoder": pixel_values,
|
| 357 |
+
"audio_encoder": audio_values,
|
| 358 |
+
"video_encoder": video_values,
|
| 359 |
+
"eeg_encoder": eeg_values,
|
| 360 |
+
}
|
| 361 |
+
features = {
|
| 362 |
+
name: getattr(self, name)(value, context, eeg_adjacency)
|
| 363 |
+
for name, value in values.items()
|
| 364 |
+
if value is not None
|
| 365 |
+
}
|
| 366 |
+
fused = self.fusion(features, context)
|
| 367 |
+
if memory_state is not None:
|
| 368 |
+
fused = fused + self.memory_output(memory_state)[:, None]
|
| 369 |
+
world, trace = self.world_model(self.world_input(fused), context)
|
| 370 |
+
detail = self.world_model.dechunk(world, trace)
|
| 371 |
+
world = world + self.world_detail_projection(detail.mean(1, keepdim=True))
|
| 372 |
+
summary = world.mean(1)
|
| 373 |
+
memory = self.memory_control(self.memory_input(summary[:, None]), context)[0][:, 0]
|
| 374 |
+
outputs = {}
|
| 375 |
+
if set(output_modalities) - {"audio", "image", "video"}:
|
| 376 |
+
raise ValueError("Unknown output modality")
|
| 377 |
+
for name in output_modalities:
|
| 378 |
+
output = getattr(self, name + "_decoder")(world, context)
|
| 379 |
+
key = "audio_codes" if name == "audio" else name + "_latents"
|
| 380 |
+
outputs[key] = output
|
| 381 |
+
return OmniOutput(next_token_logits=self.text_head(summary), memory_state=memory, **outputs)
|
| 382 |
+
|
| 383 |
+
@torch.no_grad()
|
| 384 |
+
def generate(self, input_ids, max_new_tokens=8, **kwargs):
|
| 385 |
+
for _ in range(max_new_tokens):
|
| 386 |
+
token = self(input_ids, **kwargs).next_token_logits.argmax(-1, keepdim=True)
|
| 387 |
+
input_ids = torch.cat((input_ids, token), dim=-1)
|
| 388 |
+
return input_ids
|
| 389 |
+
|
| 390 |
+
|
| 391 |
+
OmniModel.register_for_auto_class("AutoModel")
|
requirements.txt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
torch==2.15.0
|
| 2 |
+
transformers==4.57.6
|
| 3 |
+
safetensors==0.8.0
|
shards/000/model-00001-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00002-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00003-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00004-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00005-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00006-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00007-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00008-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00009-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00010-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00011-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00012-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00013-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00014-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00015-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00016-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00017-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00018-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00019-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00020-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00021-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00022-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00023-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00024-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00025-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00026-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00027-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00028-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00029-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00030-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00031-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00032-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00033-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00034-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00035-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00036-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00037-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|
shards/000/model-00038-of-09400.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:098438fd8e0a7d1416dcf33e4873f7ba42fa87184b40606141e6d35e8d426181
|
| 3 |
+
size 268435640
|