ashish296 commited on
Commit
78ab97e
·
verified ·
1 Parent(s): 336ddc3

Pulse Decide 150M v0.1 — weights, config, demo GIF

Browse files
Files changed (6) hide show
  1. .gitattributes +1 -0
  2. LICENSE +40 -0
  3. README.md +129 -1
  4. config.json +16 -0
  5. pulse_beat.gif +3 -0
  6. pulse_decide_150m.pt +3 -0
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ pulse_beat.gif filter=lfs diff=lfs merge=lfs -text
LICENSE CHANGED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Pulse Research Preview License (pulse-research-preview)
2
+ Applies to: Pulse Decide 150M
3
+ Copyright (c) 2026 RouterML
4
+
5
+ STATUS
6
+ This is an early research preview, not a production release. It is provided for research,
7
+ evaluation and experimentation.
8
+
9
+ GRANT
10
+ Subject to the conditions below, you are granted a non-exclusive, worldwide, royalty-free
11
+ licence to download, use, evaluate, study and modify these model weights, and to publish
12
+ results obtained with them.
13
+
14
+ CONDITIONS
15
+ 1. Attribution. Retain this notice and credit "Pulse Decide 150M (RouterML)" in any
16
+ publication, product or derivative that uses these weights.
17
+
18
+ 2. Upstream data licences. These weights were derived from a corpus assembled from ~40
19
+ public text-classification datasets whose licences differ. Some are permissive; some are
20
+ research/non-commercial only; some derive from content whose platform Terms of Service
21
+ restrict redistribution. RouterML publishes the weights, not the training data, and makes
22
+ no representation that any particular downstream use is permitted by those upstream
23
+ licences. YOU ARE RESPONSIBLE for verifying that your intended use — in particular any
24
+ commercial use — complies with the licences and terms of the underlying datasets.
25
+
26
+ 3. No high-stakes use. Not evaluated for fairness, safety or robustness. Do not use for
27
+ consequential decisions about people (employment, credit, housing, insurance, legal,
28
+ medical or safety-critical matters) without your own independent evaluation and
29
+ appropriate human oversight.
30
+
31
+ 4. No endorsement. Do not use RouterML's names or marks to imply endorsement of your work.
32
+
33
+ DISCLAIMER
34
+ THE WEIGHTS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
35
+ INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
36
+ PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL ROUTERML BE LIABLE FOR ANY CLAIM, DAMAGES OR
37
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
38
+ IN CONNECTION WITH THE WEIGHTS OR THEIR USE.
39
+
40
+ A cleanly-licensed release trained only on permissively-licensed sources is planned.
README.md CHANGED
@@ -1,5 +1,133 @@
1
  ---
2
  license: other
3
  license_name: pulse-research-preview
4
- license_link: LICENSE
 
 
 
 
 
 
5
  ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
  license: other
3
  license_name: pulse-research-preview
4
+ tags:
5
+ - decision-model
6
+ - text-classification
7
+ - zero-shot-classification
8
+ - on-device
9
+ - non-generative
10
+ library_name: pytorch
11
  ---
12
+
13
+ # Pulse Decide 150M
14
+
15
+ **RouterML's on-device decision model.** 149.3M parameters (~570MB fp32). Non-generative:
16
+ it *scores* typed decisions rather than generating text, which is why it runs on a laptop
17
+ instead of a server.
18
+
19
+ > Makes typed decisions — choice, boolean, multi-label, ordinal — over **arbitrary runtime
20
+ > schemas**, offline, on-device.
21
+
22
+ **Status: `v0.1` research preview.** This is an early research model, not a production release.
23
+
24
+ ![Pulse Decide — governed routing](pulse_beat.gif)
25
+
26
+ *One customer message, routed twice. Without governed context Pulse isn't confident enough,
27
+ so it escalates rather than guessing. With governed context it decides — 99.7% confident,
28
+ on-device, in ~32ms.*
29
+
30
+ ## What it does
31
+
32
+ Given a piece of text (the *state*) and a set of candidate labels supplied **at runtime**,
33
+ Pulse scores each candidate and returns a decision plus a confidence. The label set does not
34
+ need to be seen during training — that is the "arbitrary schema" property.
35
+
36
+ ## Key facts
37
+
38
+ | | |
39
+ |---|---|
40
+ | Parameters | **149.3M** (0.149B) |
41
+ | Encoder | `answerdotai/ModernBERT-base` |
42
+ | Architecture | cross-encoder decision scorer (non-generative) |
43
+ | Size on disk | ~570MB (fp32); ~150MB at int8 |
44
+ | Runs on | CPU / Apple MPS / CUDA — **offline, no data leaves the device** |
45
+ | Decision types | choice, boolean, multi-label, ordinal |
46
+
47
+ ## Performance
48
+
49
+ Pulse is designed to run **behind a confidence gate** — answering what it is confident about
50
+ and escalating the rest. That selective mode is how it is intended to be deployed, so it is
51
+ what we report here. Measured on held-out, schema-disjoint evaluation sets (label sets never
52
+ seen in training) at confidence threshold 0.5:
53
+
54
+ | evaluation set | answering everything | confident subset only |
55
+ |---|---:|---|
56
+ | MASSIVE (intent, 60 labels) | 47.6% | **71.1%** at 47% coverage |
57
+ | macro (3 held-out sets) | ~51% | **59.5%** at 63% coverage |
58
+
59
+ Accuracy on *accepted* decisions is meaningfully higher than on forced answers — at the cost
60
+ of escalating the remainder. This is the intended operating mode.
61
+
62
+ > **A same-split benchmark evaluation against other published decision models is forthcoming.**
63
+ > We make no claim of matching or exceeding any other model at this time.
64
+
65
+ ## Intended use
66
+
67
+ - Research on small, non-generative decision models and governed routing
68
+ - On-device / offline decisioning where data cannot leave the machine
69
+ - As the local tier of an escalation system (cheap local decision → escalate when unsure)
70
+
71
+ ## Limitations
72
+
73
+ - **Multi-label is weak** (~8% exact-set on FD multi-label heads). The model often identifies
74
+ the right labels but selects the wrong *number* of them. Active work.
75
+ - **Confidence calibration drifts between training runs**; treat thresholds as needing
76
+ per-deployment calibration rather than as universal constants.
77
+ - Not evaluated for fairness, safety, or high-stakes domains. **Do not use for consequential
78
+ decisions without your own evaluation.**
79
+ - English only.
80
+ - Early research preview — interfaces and weights may change.
81
+
82
+ ## Training data and licensing ⚠️
83
+
84
+ Trained on a derived corpus assembled from **40 public text-classification datasets**
85
+ (contamination-audited against all evaluation sets; near-duplicate filtered).
86
+
87
+ **The source datasets carry mixed licenses**, including:
88
+ - ~24 permissive (Apache-2.0, CC-BY, MIT-like)
89
+ - several **research/non-commercial-only** datasets
90
+ - several derived from **Twitter/X content**, whose Terms of Service restrict redistribution
91
+
92
+ **We publish the model weights, not the training data.** Because the corpus mixes
93
+ research-only and ToS-restricted sources, **users are responsible for verifying that their
94
+ intended use complies with the underlying dataset licenses.** A cleanly-licensed
95
+ (permissive-only) release is planned.
96
+
97
+ ## Usage
98
+
99
+ ```python
100
+ import torch
101
+ from pulse.model import PulseConfig, PulseUnified, load_tokenizer
102
+
103
+ blob = torch.load("pulse_decide_150m.pt", map_location="cpu", weights_only=True)
104
+ cfg = PulseConfig(**blob["cfg"])
105
+ tok = load_tokenizer(cfg)
106
+ model = PulseUnified(cfg); model.load_state_dict(blob["state_dict"]); model.eval()
107
+
108
+ state = "My card was declined at the store this morning."
109
+ choices = ["billing", "fraud", "technical", "account_access"]
110
+
111
+ first = [f"{state} [SEP] Which category applies?"] * len(choices)
112
+ enc = tok(first, choices, truncation=True, max_length=cfg.max_length,
113
+ padding=True, return_tensors="pt")
114
+ with torch.no_grad():
115
+ scores = model.score_pairs(enc["input_ids"], enc["attention_mask"])
116
+ print(choices[int(scores.argmax())])
117
+ ```
118
+
119
+ ## Model family
120
+
121
+ Pulse Decide is the decision model inside **RouterML**, which adds the governance layer —
122
+ eligibility, confidence gating, escalation and verification — around it.
123
+
124
+ ## Citation
125
+
126
+ ```bibtex
127
+ @software{pulse_decide_150m,
128
+ title = {Pulse Decide 150M: an on-device non-generative decision model},
129
+ author = {RouterML},
130
+ year = {2026},
131
+ note = {v0.1 research preview}
132
+ }
133
+ ```
config.json ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model_name": "Pulse Decide 150M",
3
+ "developer": "RouterML",
4
+ "architecture": "cross-encoder decision scorer (non-generative)",
5
+ "encoder": "answerdotai/ModernBERT-base",
6
+ "parameters": 149300000,
7
+ "version": "v0.1-research-preview",
8
+ "decision_types": [
9
+ "choice",
10
+ "boolean",
11
+ "multi_label",
12
+ "ordinal"
13
+ ],
14
+ "checkpoint_sha256": "424c9e2bf6acda3ef792cae8d8b7cfe70829633893b5d0af250e8259b3832f95",
15
+ "checkpoint_file": "pulse_decide_150m.pt"
16
+ }
pulse_beat.gif ADDED

Git LFS Details

  • SHA256: e5eb51c2ccafa3630a40110323b66685765bfa8e7e966ad636de9f915a1886bf
  • Pointer size: 131 Bytes
  • Size of remote file: 155 kB
pulse_decide_150m.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:424c9e2bf6acda3ef792cae8d8b7cfe70829633893b5d0af250e8259b3832f95
3
+ size 597307292